メール受信ロジックの記述
最後に、popコンポーネントを使ったメール受信一覧の取得ロジックを記述しましょう。
Imports System.ComponentModel Imports System.Collections.ObjectModel Imports System.Runtime.CompilerServices Imports System.Threading Public Class MailModel Implements INotifyPropertyChanged Public Class TMail Public Property From As String Public Property Subject As String Public Property SendDate As DateTime End Class Public Property Items As New ObservableCollection(Of TMail) Public Property Pop3Server As String = "popServer" Public Property UserId As String = "UserID" Public Property Password As String = "Password" Public Async Function GetMail() As Task Using pop As New Dart.Mail.Pop AddHandler pop.Progress, AddressOf PopProgress pop.Session.RemoteEndPoint = New Dart.Mail.IPEndPoint(Me.Pop3Server, 110) pop.Session.Username = Me.UserId pop.Session.Password = Me.Password pop.Connect() pop.Authenticate(True, True) ''ヘッダを取得します Await Task.Run(Sub() Try For Each mes In pop.Messages mes.Get(0) Next Catch ex As Exception Debug.Assert(ex.Message) End Try End Sub) pop.Close() RemoveHandler pop.Progress, AddressOf PopProgress End Using End Function Private Sub PopProgress(sender As Object, e As Dart.Mail.PopProgressEventArgs) If e.Final Then Me.Items.Add(New TMail With { .From = e.Message.Message.From, .Subject = e.Message.Message.Subject, .SendDate = e.Message.Message.Date }) End If End Sub Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) _ Implements INotifyPropertyChanged.PropertyChanged Private Sub OnPropertyChanged(<CallerMemberName> Optional propertyName As String = Nothing) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) End Sub End Class
PopServerプロパティ、UserIdプロパティ、Passwordプロパティは使用しているメールサーバーの設定に合わせて値を設定しておいてください。
このクラスで最重要なのはGetMailメソッドの中の動きなので、メソッドの中を少し詳しく見ていきたいと思います。
pop.Session.RemoteEndPoint = New Dart.Mail.IPEndPoint(Me.Pop3Server, 110)
POP3サーバーのアドレスとポート番号を指定して、接続先をRemoteEndPointメソッドに設定します。
pop.Session.Username = Me.UserId / pop.Session.Password = Me.Password
POP3接続用のユーザIDとパスワードを指定します。
pop.Connect()
POP3サーバーに接続します。
pop.Authenticate(True, True)
認証を行い、POP3サーバーにログインできたら、pop.Messagesにメールの情報を取得します。
Await Task.Run(Sub()…)
Task.Runメソッドを使って、その中で指定しているコード(For Eachループ)を非同期実行しています。また、Awaitをつけてその非同期実行を待ち合せしているので、For Eachループがすべて回りきった後に次の行のpop.Close()やRemoveHandlerが実行されます。
MainForm.vbにあるet_Button_Clickイベントプロシージャは、この非同期待ち合わせが完了すると処理が終わることになります。
For Each… mes.Get(0)…
Task.Runの中で指定しているのは、pop.Messagesに格納されたメール情報を元に1通ずつ、Get(0)メソッドを実行して本文なし(0指定のため)でヘッダだけを受信しています。この受信のタイミングでProgressイベントが随時発生します。
PopProgressイベントプロシージャの中では、取得できたヘッダ情報から、From、Subject、DateをMe.Itemsに追加しています。
実行結果の確認
それでは、実行結果を確認してみましょう。
日本語のFromやSubjectの文字化けもなく、一覧が取得できました。