SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(iNetSuite)

Popコンポーネントを利用して簡易メーラーを作成する

iNetSuite for .NETを使ったメール受信ソフトの作成

  • このエントリーをはてなブックマークに追加

コードの作成

 実装する機能の概要は次のとおりです。

  1. プログラム起動時にForm2を表示し、メールサーバのアカウント情報を入力してもらいます。これを行わないとプログラムはエラーになります。
     
  2. StatusStripの[メール受信]を選ぶと、Popコンポーネントを利用してPOPメールサーバにログインします。
     
  3. サーバにあるメールをチェックし、メールがなければメッセージを表示してメールサーバからログアウトします。
     
  4. 受信メールがあれば件数を表示し、メールをダウンロードします。メールは、PopコンポーネントのMessagesコレクションに、Messageオブジェクトとして格納されていますので、これをFor...Each...Nextステートメントで取り出します。
     
  5. 取り出した「送信者」「件名」「受信日時」「サイズ」のデータは、そのままリストボックスに組み込みます。メール本文は、一度配列に入れておきます。すべてのメールをダウンロードしたら、メールサーバからログアウトします。
     
  6. ユーザーがリストボックスに表示されている「送信者」「件名」「受信日時」「サイズ」のいずれかの項目をクリックすると、そのリスト項目の位置から配列に格納してあるメール本文を取り出し、テキストボックスで表示します。
     
  7. 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
 メールサーバの仕様により、メールのIDを付加する規則が違う場合があるかも知れません。ここでは、メールサーバが記述のとおり受信した順番にIDを付加しているという前提で処理を組み立てています。
 

メール本文の表示処理

 ユーザーがリストボックスに表示されたメール情報をクリックした際に、そのメール本文をテキストボックスに表示する処理を実装します。

 まず、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では、添付ファイルの受信やヘッダー情報の取得など、さまざまなメール処理を行うことができます。ぜひ一度お試しください。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
ComponentZine(iNetSuite)連載記事一覧
この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/677 2009/03/17 11:54

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング