メール送信、メール送信(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.Object, ByVal 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.Object, ByVal e As System.EventArgs) _
Handles btnSedAsyncCancel.Click
If Not _mailsent Then Exit Sub
_smtp.SendAsyncCancel()
End Sub
サンプルソースでも用意すればよかったのですが、とりあえず、このページのコードでご勘弁を。