コードの作成
実装する機能の概要は次のとおりです。
- プログラム起動時にForm2を表示し、メールサーバのアカウント情報を入力してもらいます。これを行わないとプログラムはエラーになります。
- StatusStripの[メール受信]を選ぶと、Popコンポーネントを利用してPOPメールサーバにログインします。
- サーバにあるメールをチェックし、メールがなければメッセージを表示してメールサーバからログアウトします。
- 受信メールがあれば件数を表示し、メールをダウンロードします。メールは、Popコンポーネントの
Messages
コレクションに、Message
オブジェクトとして格納されていますので、これをFor...Each...Next
ステートメントで取り出します。 - 取り出した「送信者」「件名」「受信日時」「サイズ」のデータは、そのままリストボックスに組み込みます。メール本文は、一度配列に入れておきます。すべてのメールをダウンロードしたら、メールサーバからログアウトします。
- ユーザーがリストボックスに表示されている「送信者」「件名」「受信日時」「サイズ」のいずれかの項目をクリックすると、そのリスト項目の位置から配列に格納してあるメール本文を取り出し、テキストボックスで表示します。
- Smtpコンポーネントを使ったメール送信は、メール受信のテスト用として作成します。
アカウント入力処理
フォーム「Form1」のLoadイベントハンドラで、アカウント情報を入力するフォーム「Form2」を表示します。各情報は、コードモジュールであるModule1で宣言した変数に格納します。
まず、プロジェクトにモジュールを追加し、変数を6つ宣言します。
Module Module1 Public PopAddress As String 'POPサーバーのアドレス Public SmtpAddress As String 'STMPサーバーのアドレス Public UserID As String 'ユーザーID Public UserPassword As String 'パスワード Public FromAddress As String 'あて先アドレス Public ToAddress As String '送信者アドレス End Module
Form2の[登録]ボタンのClick
イベントハンドラで、TextBoxに入力した内容をこれらの変数に代入する処理を作成します。
Public Class Form2 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Module1.PopAddress = Me.TextBox1.Text Module1.SmtpAddress = Me.TextBox2.Text Module1.UserID = Me.TextBox3.Text Module1.UserPassword = Me.TextBox4.Text Module1.ToAddress = Me.TextBox5.Text Module1.FromAddress = Me.TextBox6.Text Me.Close() End Sub End Class
Form1のLoad
イベントハンドラで、このForm2をモーダルで表示します。
Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load Dim fm2 As New Form2 fm2.ShowDialog() End Sub
Form1に配置したStatusStripの[設定]-[アカウント]のClick
イベントハンドラでも、Form2を表示できるようにしておきます。
Private Sub アカウントToolStripMenuItem_Click( _ ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles アカウントToolStripMenuItem.Click Dim fm2 As New Form2 fm2.ShowDialog() End Sub
メール受信処理
StatusStripの[メール受信]のClickイベントハンドラに、メールサーバへの接続とメールのダウンロード処理を作成します。
最初に、Dart.PowerTCP.Mail
名前空間をインポートしてください。次に、モジュールレベルの変数を3つ用意します。1つはメール本文を格納する配列、あとの2つはダウンロードするメールの位置を格納するのに使用します。
Imports Dart.PowerTCP.Mail Public Class Form1 Public Msg() As String Public Pos As String = "1" Public i As Integer = 0
PopコントロールはメールデータをPopMessage
オブジェクトとして返してくるので、StatusStripの[メール受信]のClickイベントハンドラでは、まずこれを格納する変数を用意します。
Private Sub メール受信ToolStripMenuItem_Click( _ ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles メール受信ToolStripMenuItem.Click Dim Hdr As PopMessage
メールサーバにログインしたら、メッセージを自動的に取得するように、Pop
クラスのAutoGet
プロパティを設定します。また、自動的にログアウトしないように、AutoLogout
プロパティも設定しておきます。
Pop1.AutoGet = MessageSection.Complete
Pop1.AutoLogout = False
次に、メールサーバにログインします。これは、PopコントロールのLogin
メソッドを実行するだけです。引数には、メールサーバーのアドレス、ログインアカウント(ユーザー名)、パスワードを指定します。これらは、前述したコードモジュール「Module1」の各変数を使って指定します。
Try
Pop1.Login(Module1.PopAddress, Module1.UserID, Module1.UserPassword)
これだけでPOPメールサーバへのログインが完了し、メッセージを自動で取得し始めます。
まずは、受信メールがあるかどうかをチェックします。これは、Pop
クラスのMessages
コレクションのLength
プロパティを参照します。このプロパティが「0」の場合は受信メールがないため、「メッセージはありません」とメッセージを表示し、処理を終了します。
If Pop1.Messages.Length = 0 Then Me.ToolStripStatusLabel1.Text = "メッセージはありません"
受信メールが1件でもあれば、その件数をメッセージで表示し、受信したメールの処理を行います。
Else Me.ToolStripStatusLabel1.Text = _ Pop1.Messages.Length & "件のメッセージを受信しました"
受信したメールの情報はすべてMessages
コレクションにMessage
オブジェクトとして格納されています。そして、メールの情報にアクセスするには、このMessage
オブジェクトの各プロパティを参照します。
個々のMessage
オブジェクトにアクセスするには、Messages
コレクションに対してFor...Each...Next
ステートメントを実行します。
For Each Hdr In Pop1.Messages
また、メール情報を取り出す前に、同じメールを重複して表示しないようにします。
このプログラムでは、メールを受信してもサーバのメールは削除しません。本来なら、メールをダウンロードした時点でサーバのメールを削除するので、同じメールを重複してダウンロードすることはないのですが、今回はサーバのメールを削除しないので、サーバにアクセスするたびにすべてのメールを毎回ダウンロードしてしまいます。
そこで、ダウンロード済みのメールのIDを保存しておき、同じメールを重複してリスト表示しないように、メールのIDをチェックします。
メールサーバ(注)では、受信したメールの先頭から順番に「1、2、3、……」とIDを付加していて、その値はMessage
オブジェクトのId
プロパティに格納されます。これを利用して、次のような手順で受信したメールの処理を行います。
変数Pos
に、最後に受け取ったメールのID+1(つまり、次に受け取るメールのID)を保存しておくようにし、これを処理対象のメール(Message
オブジェクト)のid
プロパティと比較します。
If Pos = Hdr.Id Then
例えば、最初にメールのIDが1から5までの、5通のメールをダウンロードしたとします。このとき、処理が終了した時点の変数Pos
の値は、「5+1」の「6」になります。
次に、ログアウトして再度ログインします。Popコンポーネントはメールの自動受信を開始し、先ほど受信した5通のメール(ID=1~5)も再度一緒にダウンロードされます。
ここで変数Pos
の値が「6」になっているため、Pos
の値と、この5通のメールのIDは一致せず、同じメールを重複して処理することはありません。新たに6番目のメールをPOPサーバが受け取れば、このメールのID「6」と変数Pos
の値「6」が一致するので、追加して処理するようになります。
受信したメールは、Message
クラスのFrom
プロパティから送信者を取り出します。ただし、このプロパティには送信元がMailAddress
オブジェクトとして格納されていますので、ToString
メソッドで文字列に変換する必要があります。
件名は、Message
クラスのSubject
プロパティに、受信日時はDate
プロパティに、メールのサイズはLength
プロパティに格納されているので、それぞれ取り出して各ListBoxのリスト項目に追加します。
Me.ListBox1.Items.Add(Hdr.Message.From.ToString) Me.ListBox2.Items.Add(Hdr.Message.Subject) Me.ListBox3.Items.Add(Hdr.Message.Date) Me.ListBox4.Items.Add(Hdr.Message.Length)
メール本文は、Message
クラスのText
プロパティに格納されています。このデータだけは配列に格納しておき、あとでユーザーがリストボックスにあるメールの件名や送信者名をクリックした時にだけ表示するようにします。
ReDim reserve Msg(i) Msg(i) = Hdr.Message.Text i += 1 Pos += 1 End If Next End If
最後に、Pop
クラスのLogout
メソッドを実行して、メールサーバからログアウトします。
' *** ログアウトします。 Pop1.Logout() Catch ex As Exception MessageBox.Show("アカウントを設定してください", _ "サーバに接続できません", MessageBoxButtons.OK, _ MessageBoxIcon.Error) End Try End Sub
メール本文の表示処理
ユーザーがリストボックスに表示されたメール情報をクリックした際に、そのメール本文をテキストボックスに表示する処理を実装します。
まず、4つのリストボックスの選択状況を同期させるようにします。ユーザーがリスト項目をクリックすると、ListBoxコントロールにはSelectedIndexChanged
イベントが発生します。このイベントハンドラを利用し、リストの何番目の項目がクリックされたのかをSelectedIndex
プロパティで取得します。
ここではまず一番左側のListBox1をクリックしたと仮定しましょう(ListBoxの名前は左から、ListBox1~4とします)。
Private Sub ListBox1_SelectedIndexChanged( _ ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles ListBox1.SelectedIndexChanged Dim Cnt As Integer = 0 Cnt = Me.ListBox1.SelectedIndex Me.ListBox2.SelectedIndex = Cnt Me.TextBox1.Text = Msg(Cnt)
選択された項目の番号をSelectedIndex
プロパティから取得して、1つ右側のListBox2のSelectedIndex
プロパティに代入し、ListBox2の選択項目をListBox1と同期させます。
また、この段階で選択された項目に対応するメール本文を、下部のテキストボックスに表示させます。
次はListBox2の選択項目が変更されたことによるSelectedIndexChanged
イベントを利用し、さらに一つ右のListBox3を同期させます。同様の手順を繰り返すとすべてのListBoxを同期させることができます。
なお、一周してListBox1のSelectedIndex
プロパティに代入される値は元の値と同じため、SelectedIndexChanged
イベントが発生せず、処理がループし続けることはありません。
この方法であれば、どのListBoxをクリックしても、処理のスタートが異なるだけで同様に選択項目を同期させることができます。
メール送信処理
最後に、テスト用にメール送信の処理を作成しておきます。
メールの送信はいたって簡単で、まずSmtpコンポーネントのServer
プロパティに、SMTPサーバのアドレスを設定します。
Private Sub メール送信ToolStripMenuItem_Click( _ ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles メール送信ToolStripMenuItem.Click Smtp1.Server = Module1.SmtpAddress
次に、Send
メソッドの引数にメールの宛先となるアドレス、送信者のメールアドレス、メールの件名、メールの本文テキストを設定し実行します。
Try Smtp1.Send(Module1.ToAddress, Module1.FromAddress, "Test", _ "This is a test message!") Catch ex As Exception MessageBox.Show(ex.Message) End Try
これだけで簡単にメールを送れます。
まとめ
メールの送受信を行うオリジナルのアプリケーションを作ってみました。
今回はとりあえず、「送信者」「件名」「日時」「サイズ」「本文」を取り扱う部分にフォーカスを当てて説明しましたが、iNetSuite for .NETを利用するとメソッドやプロパティを設定するだけで、簡単に実装できることがお分かりいただけたかと思います。
iNetSuite for .NETでは、添付ファイルの受信やヘッダー情報の取得など、さまざまなメール処理を行うことができます。ぜひ一度お試しください。