| ホーム | 掲示板 | 特集 | サンプル | Tips | リンク | その他 | blog 

Tips
[VS2003]
 日付時刻の演算
 ListBoxにファイル一覧
 ファンクションF10
 WMIでサービス一覧
 YAHOO検索エンジン
[VS2005]
 Administrator権限チェック
 非同期ExecuteReader
 非同期ExecuteReader(CallBack)
 パスの結合
 ファイルを圧縮して保存
 コントロール配列の実装
 DataGridViewのCellイベント
 CSVファイルをDataGridViewに表示
 DataGridViewのリンクセルを見やすく
 DataGridViewマウス右ボタンで選択
 DataGridViewスクロール制御
 DataGridViewのCell移動をEnterで
 DataRepeaterコントロール
 GZ圧縮ファイルを解凍
 ファイルの削除
 ディレクトリ有無チェック
 ファイルのダウンロード
 非同期ファイルダウンロード
 ドライブの一覧
 ファイルのコピー
 ファイル有無チェック
 テキストファイルを読み込む
 特定の文字列を含むファイル検索
 フォームを表示(Show)する
 フォルダ一覧取得
 ドライブ詳細情報取得
 ファイル一覧取得
 テンポラリファイルパス取得
 継承コントロールの作り方
 フォルダの移動
 ファイルの移動
 My.Settingの利用
 MySQLCommandで抽出
 MySQLDeleteCommandで削除
 MySQLInsertCommandで挿入
 MySQLSelectCommandで抽出
 MySQLUpdateCommandで更新
 ネットワークに繋がってる?
 ネットワーク接続イベント取得
 固定長テキストファイルを読む
 Oracleストアドファンクション呼出1
 Oracleストアドファンクション呼出2
 OracleのLong Row型の画像を表示
 OracleのLong Row型をファイル保存
 Oracleパラメータクエリ実行
 ORACLE接続文字列生成
 VS2005でPing
 非同期でPing
 VB6のPrinterオブジェクトを.NETで
 Reportでテーブル形式表示
 ReportViewerでパラメータ設定
 メール送信
 非同期でメール送信
 メール送信(MailMessage利用)
 シリアル通信プログラム
 シリアル通信(文字列送信)
 二重起動の禁止
 特殊フォルダ取得
 スプラッシュウインドウ表示
 テーブルへ複数行の挿入
 CSVファイルをテーブルへ挿入
 テーブルへ複数行の挿入(マッピング)
 SqlBulkCopyで郵便番号データ処理
 SQL Server接続文字列生成
 Stopwatchで時間の計測
 システムサウンド再生
 CSVファイル読み込み
 固定長テキストファイルを読む2
 TableAdapterでTransaction
[VS2005] 非同期でメール送信 2005/11/28
メール送信メール送信(MailMessage利用)では同期送信を行っていますが、 これらは.NET 1.xでも同じ処理が行えていました。今回のサンプル非同期送信は.NET 2.0より実装された機能です。

まずは、メール送信完了時に発生するSendCompletedイベントを受け取れるように、以下を定義しておきます。
また、送信処理中を識別する変数を定義します。

Private WithEvents _smtp As New SmtpClient
Private _mailsent As Boolean
送信ボタンが押された時のイベントプロシージャは以下のようになっています。
'--------------------------------------------------------------------------------
'「非同期送信」ボタンクリック
'--------------------------------------------------------------------------------
Private Sub btnSedAsync_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) _
                                                  Handles btnSedAsync.Click

    Try
        _mailsent = False

        ''差出人
        Dim maFrom As New MailAddress("from@vbstation.net""FromDispName")
        ''宛先
        Dim maTo As New MailAddress("to@vbstation.net""ToDispName")

        ''MailMessage生成
        Dim mm As New MailMessage(maFrom, maTo)
        With mm
            ''ヘッダーに追加
            mm.Headers.Add("Content-Transfer-Encoding""7bit")
            ''見出し
            .Subject = "サブジェクト"
            ''本文
            .Body = "ここに本文を記述します"
            .BodyEncoding = System.Text.Encoding.GetEncoding("ISO-2022-JP")
        End With

        ''SMTPホスト
        _smtp.Host = "mail.server"

        ''基本認証(必要な場合)
        _smtp.Credentials = New System.Net.NetworkCredential("userid""password")

        ''メール送信
        _smtp.SendAsync(mm, mm.To.Item(0).Address.ToString)
        _mailsent = True

        ''後始末
        mm.Dispose()

    Catch ex As Exception

        MessageBox.Show(ex.Message)

    End Try

End Sub

SendAsyncメソッドが非同期で行う為のメソッドです。メール送信が完了した場合には、SendCompletedイベントが発生します。 そのSendCompletedイベントの処理は以下のようになっています。
'--------------------------------------------------------------------------------
'非同期送信完了イベント
'--------------------------------------------------------------------------------
Private Sub _smtp_SendCompleted(ByVal sender As Object, _
                                ByVal e As System.ComponentModel.AsyncCompletedEventArgs) _
                                                             Handles _smtp.SendCompleted

    Dim token As String = e.UserState.ToString

    If e.Cancelled = True Then
        MessageBox.Show(token & "宛てのメール送信がキャンセルされました。")
    Else
        If e.Error Is Nothing Then
            MessageBox.Show(token & "宛てのメール送信が正常に行われました。")
        Else
            MessageBox.Show(token & "宛てのメール送信が失敗しました。" & vbCrLf & e.Error.Message)
        End If
    End If
    _mailsent = False

End Sub

ここでは、tokenにSendAsyncメソッド呼び出し時にセットしたユーザ定義として指定された、メールの宛先を格納して利用しています。
また、送信処理を途中で中断したい場合には、SendAsyncCancelメソッドを呼び出すことにより中断する事ができます。
'--------------------------------------------------------------------------------
'「非同期送信キャンセル」ボタンクリック
'--------------------------------------------------------------------------------
Private Sub btnSedAsyncCancel_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) _
                                                              Handles btnSedAsyncCancel.Click
    If Not _mailsent Then Exit Sub
    _smtp.SendAsyncCancel()
End Sub

サンプルソースでも用意すればよかったのですが、とりあえず、このページのコードでご勘弁を。

Copyright © 2005 tadahiro higuchi. All Rights Reserved.