CodeZine(コードジン)

特集ページ一覧

Smtpコンポーネントでメーラーの送信機能を簡単に実装する

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/12/01 00:00

 iNetSuite for .NETのPopコンポーネントとSmtpコンポーネントを利用すると、メソッドとプロパティを設定するだけで簡単にメールソフトを作成できます。今回は、SMTPコンポーネントを使って、Eメールを作成・送信するアプリケーションを作成します。ファイルを添付する機能や、送信情報をログファイルに記録する機能も組み込みます。

宛先や件名、添付ファイルを持ったメールを作成し送信する
宛先や件名、添付ファイルを持ったメールを作成し送信する
メール送信の情報をログファイルに記録する
メール送信の情報をログファイルに記録する

はじめに

 iNetSuite for .NETのPopコンポーネントとSmtpコンポーネントは、インターネット通信を使ったメール送受信機能を提供するコンポーネントです。

 PopコンポーネントはEメールの受信、SmtpコンポーネントはEメールの送信を担当し、いずれもメソッドとプロパティの操作だけで簡単にEメールの送受信を行うことができます。

 前回は、Popコンポーネントを使ったメール受信ソフトを作成しました。今回はSmtpコンポーネントとコンボボックス、エディットを使って、Eメールを作成して送信するアプリケーションを作成します。

 メールには添付ファイルを付けられるようにし、メール送信の情報をログファイルに記録する機能も組み込みます。

対象読者

 Visual Basic 2005を使ってプログラムを作ったことのある人。

必要な環境

 Visual Basic 2005またはVisual Studio 2005、およびEメールの操作ができる環境。

プログラム実行時の注意事項

 本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下のファイルが必要になります。

  1. Dart.PowerTCP.Mail.dll …… 本体アセンブリファイル
  2. Dart.PowerTCP.Mail.Forms.dll …… フォーム用アセンブリファイル
  3. Dart.PowerTCP.Mail.resources.dll …… サテライトリソース

 1.と2.のファイルを、実行プログラムと同じフォルダに格納します。3.のファイルはサブフォルダ「ja」を作成し、その中に格納してください。

 また、.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。

GUIの作成

 今回のアプリケーションは、「MyMail-2」というプロジェクト名で作成し、GUIはWindowsのコモンコントロールと、InputMan for .NET 4.0Jのコントロールを組み合わせて使用します。

 Smtpコンポーネントは、メール送信を行うコンポーネントで、.NET Frameworkクラスライブラリにあるメール系のクラスを使うよりも簡単に送信メールを作成することができます。

 フォームには、宛先や送信者のアドレス、件名と本文の入力、添付ファイルの指定を行うための入力コンポーネントを配置します。

 また、ccとbccを設定した場合のアドレスと、メール送信の結果を表示するステータスバーを持たせます。

GUIの使用コントロール
GUIの使用コントロール
InputMan for .NET 4.0Jのインストール
 InputMan for .NET 4.0Jは、便利な入力機能を提供するグレープシティ社のコンポーネントです。利用方法やトライアル版の入手方法などについては、『Excelのワークシートに交通費を入力するプログラムの作成』を参照してください。
もちろん、今回のプログラムは、VS標準コントロールのテキストボックスやコンボボックスを使ってもかまいません。問題なく動作します。

コンポーネントのインストール

 本稿のプログラムを試すには、コンポーネント「iNetSuite for .NET」をインストールする必要があります。インストール方法については、前稿『Popコンポーネントを利用して簡易メーラーを作成する』を参照してください。

コントロールの追加

 iNetSuite for .NETをインストールしたら、ツールボックスに専用のタブを作成し、iNetSuite for .NETのコンポーネントを追加します。追加するコンポーネントは、[.NET Frameworkコンポーネント]の「Dart.PowerTCP」で始まる名前空間のコンポーネントです。

「Dart.PowerTCP」で始まる名前空間のコンポーネントを追加する
「Dart.PowerTCP」で始まる名前空間のコンポーネントを追加する

Form1の作成

 フォームにコントロールを配置していきます。

  1. フォーム全体にContainerコンポーネントを配置します。送信者と宛先は、複数のアドレスに対応させるためにInputMan for .NET 4.0Jのコンボコンポーネントを使用します。
  2.  
  3. 件名と本文はEditコンポーネントを使用し、いずれもContainerのキャプション設定機能を使ってキャプションを付けます。
  4.  
  5. ccとbccのアドレス入力用としてButtonを配置します。入力はInputBoxを使用します。
  6.  
  7. 添付ファイル用に、ButtonとLabel、OpenFileDialogコントロールを配置します。
  8.  
  9. フォームの最下部に、StatusStripコントロールを配置します。DropDownボタンを2つと、StatusLabelを2つ組み込みます。
  10. DropDownボタンは、cc・bccに入力されたアドレスを表示するのに使用します。StatusLabelは、送信後のメッセージ表示と現在日時を表示するのに使用します。
     
  11. Smtpコンポーネント、Popコンポーネント、Timerコントロールを配置します。Timerは、現在の日時を表示するのに使用します。

コードの作成

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

  1. 送信者、宛先をコンボに入力します。cc、bccがある場合は、それぞれのボタンを押すとInputBoxが表示されるので、ここから入力します。cc、bccはいくつも入力できますが、実際に送信されるのは最後に入力されたアドレスのみです。
  2.  
  3. 添付ファイルがある場合は、ボタンを押すと[ファイルを開く]ダイアログボックスが表示されるので、ここから添付ファイルを指定します。添付ファイルも1件のみ指定できます。
  4.  
  5. 件名と本文をエディットコンポーネントに入力します。入力がないのに送信しようとすると、メッセージボックスで確認を求めます。
  6.  
  7. メールの送信処理は、すべて[送信する]ボタンのClickイベントハンドラで行います。
  8.  
  9. Timerコントロールを使って、StatusStripに現在の日時を表示します。
  10.  
  11. メールの送受信を行うと、SmtpコンポーネントにはTraceイベントが発生します。このイベントハンドラの引数「SegmentEventArgs」には、メール送信の詳しいデータが格納されますので、これを使って送信記録を作成します。

cc、bccの入力と時刻表示、添付ファイル名の取得処理

 [cc][bcc]ボタンが押されたときの処理を作成します。

 cc、bccはモジュールレベルの変数に格納します。

  1. 「Dart.PowerTCP.Mail」名前空間をインポートして、3つのモジュールレベル変数を用意します。
  2.  
    Imports Dart.PowerTCP.Mail
    Public Class Form1
    
    Public tocc As String = ""         'ccのアドレスを格納
    Public tobcc As String = ""        'bccのアドレスを格納
    Public attachfname As String = ""  '添付ファイル名を格納
    
     
  3. ボタン[cc]のClickイベントハンドラでは、InputBoxを表示し、アドレスを入力してもらいます。そして、そのアドレスをStatusStripコントロールのToolStripStatusLabelオブジェクトの、DropDownItemsコレクションに追加します。
  4.  
    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
        tocc = InputBox("ccのアドレスを入力してください")
    
        If tocc <> "" Then
            Me.ToolStripStatusLabel1.DropDownItems.Add(tocc)
        End If
    End Sub
    
     
  5. ボタン[bcc]のイベントハンドラでも同様の処理を行います。
  6.  
    Private Sub Button2_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button2.Click
        tobcc = InputBox("bccのアドレスを入力してください")
    
        If tobcc <> "" Then
            Me.ToolStripStatusLabel2.DropDownItems.Add(tocc)
        End If
    End Sub
    
    cc、bccはInputBoxを使って入力する
    cc、bccはInputBoxを使って入力する
    入力したアドレスはステータスラベルに表示される
    入力したアドレスはステータスラベルに表示される
     
  7. TimerコントロールのTickイベントハンドラで、Now関数を使って現在の日時を取得します。Itervalプロパティはデフォルトの100ミリ秒のままです。
  8. プロパティウィンドウで、EnabledプロパティをTrueにするのを忘れないでください。
     
    Private Sub Timer1_Tick(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Timer1.Tick
        Me.ToolStripStatusLabel4.Text = Now()
    End Sub
    
     
  9. [添付ファイル]ボタンのClickイベントハンドラで、[ファイルを開く]ダイアログボックスを表示し、ユーザーに添付ファイルを選択してもらいます。
  10. 選んだファイルは、モジュールレベル変数attachfnameにフルパスで格納し、その内容をLabelで表示します。
     
    Private Sub Button4_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button4.Click
        Dim ret As Integer
    
        ret = Me.OpenFileDialog1.ShowDialog
        If ret = Windows.Forms.DialogResult.OK Then
            attachfname = Me.OpenFileDialog1.FileName
            Me.Label1.Text = attachfname
        End If
    End Sub
    
     

メール送信処理

 メール送信の処理は、すべて[送信する]ボタンのClickイベントハンドラで処理します。

  1. 最初に、宛先が入力されているかどうかをチェックします。入力されていなければ、送信処理を中止します。
  2.  
    If MeCombo2.Text = "" Then
        MessageBox.Show("宛先が入力されていません")
        Exit Sub
    End If
    
     
  3. 次に、件名と本文が入力されているかどうかをチェックします。入力されていなければ、そのまま送信するのかどうかをユーザーに確認します。
  4.  
    If Edit1.Text = "" Then
        Dim ret As Integer = MessageBox.Show( _
            "件名がありません。送信しますか?", "確認", _
            MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        If ret = Windows.Forms.DialogResult.No Then
            Exit Sub
        End If
    End If
    
    If Me.Edit2.Text = "" Then
        Dim ret As Integer = MessageBox.Show( _
            "本文がありません。送信しますか?", "確認", _
            MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        If ret = Windows.Forms.DialogResult.No Then
            Exit Sub
        End If
    End If
    
     
  5. 送信内容を作成します。これは、MessageStreamクラスのインスタンスを作成して、送信するようにします。
  6. というのも、メールの送信はSmtpコンポーネントのSendメソッドで行うのですが、この引数に送信者や受信者のアドレス、件名、本文を指定する際に日本語(2バイト文字)を使うと、受信するメーラーによっては文字化けを起こしてしまいます。
    メール内容をMessageStreamオブジェクトとしてSendメソッドで送信すると、文字化けを起こしません。MessageStreamオブジェクトは、送信メールの各データを一括で格納するオブジェクトです。
     
    Dim msg As New MessageStream()
    
     
  7. 宛先は、同じメールを同時に複数のアドレスに送信する場合があるので、MessageStreamオブジェクトのToプロパティでMailAddressコレクションにアクセスし、Addメソッドでコレクションに追加する、という形をとります。Addメソッドの引数はアドレスを文字列で渡すのではなく、MailAddressオブジェクトに変換して渡します。MailAddressオブジェクトは、クラスのコンストラクタの引数にアドレスを文字列で渡します。
  8.  
    With msg
        .To.Add(New MailAddress(Me.Combo2.Text))
    
     
    送信者は、1人ですからFromプロパティに設定します。これも、アドレスを文字列からMailAddressオブジェクトに変換して設定します。
     
    .From = New MailAddress(Me.Combo1.Text)
    
     
  9. 件名と本文は、それぞれSubjectプロパティとTextプロパティに文字列のまま設定します。
  10.  
    .Subject = Edit1.Text
    .Text = Edit2.Text
    
     
  11. 添付ファイルは、設定されていればMimeAttachmentStreamオブジェクトを作成し、これをAttachmentsコレクションに加える、という形をとります。これも複数のファイルを添付できるようにAttachmentオブジェクトのコレクションを使用します。
  12. まず、添付ファイル名が設定されているのかどうかをチェックし、MimeAttachmentStreamクラスのコンストラクタからインスタンス作成します。コンストラクタの引数は、添付ファイル名です。
     
    If attachfname <> "" Then
        Dim attach As MimeAttachmentStream = Nothing
        attach = New MimeAttachmentStream(attachfname)
    
     
    作成したMimeAttachmentStreamオブジェクトを、Addメソッドを使ってAttachmentsコレクションに追加します。
     
        .Attachments.Add(attach)
    End If
    
     
  13. ccとbccのアドレスが設定されている場合は、これもMessageStreamオブジェクトに組み込みます。
  14. ccは、CCプロパティを使ってMailAddressesコレクションにアクセスし、このコレクションにMailAddressオブジェクトとして追加します。
    MailAddressオブジェクトは、クラスのコンストラクタを使って作成します。引数はccのアドレス文字列です。
     
    If tocc <> "" Then
        .CC.Add(New MailAddress(tocc))
    End If
    
     
    同じように、bccのアドレスもMailAddressコレクションに組み込みます。
     
        If tobcc <> "" Then
            .BCC.Add(New MailAddress(tobcc))
        End If
    End With
    
     
    これで、宛先、送信者、件名、本文、cc、bcc、添付ファイル名の設定がすべて出来上がり、MessageStreamオブジェクトとして作成されました。
     
  15. メールの送信は、Smtpクラスのメンバを操作します。まず、メールサーバのアドレスをServerプロパティに文字列で設定します。
  16.  
    With Me.Smtp1
        .Server = "mail.xxxxx.ne.jp"
    
     
    そして、Sendメソッドを実行します。引数には、送信データをMessageStreamオブジェクトで指定します。
     
        .Send(msg)
    End With
    
     
    これで、送信完了です。最後に、StatusStripにメッセージを表示します。
     
        Me.ToolStripStatusLabel3.Text = _
            "メールを送信しました。送信ログを記録しました。"
    
    End Sub
    
     

メール送信ログの作成処理

 メールを送信すると、SmtpコンポーネントにはTraceというイベントが発生します。そして、このイベントハンドラの引数「e As Dart.PowerTCP.Mail.SegmentEventArgs」には、SMTPサーバとのやり取りなどの送信状況が記録されます。

 そこで、その内容を取り出しファイルに書き出してログファイルを作成します。

Private Sub Smtp1_Trace(ByVal sender As Object, _
    ByVal e As Dart.PowerTCP.Mail.SegmentEventArgs) Handles Smtp1.Trace
  1. まず、Byte型の配列を用意します。そして、GetBytesメソッドを使用してイベントハンドラの引数eからの情報を取得し格納します。SegmentEventArgsオブジェクトのSegmentオブジェクトには、送受信されたデータやこのデータのバイト数などの情報が含まれています。
  2.  
    Dim buffer As Byte() = _
        System.Text.Encoding.Default.GetBytes(e.Segment.ToString())
    
     
  3. つぎに、FileStreamオブジェクトを作成してファイルを作ります。
  4.  
    Dim fs As New IO.FileStream("C:\メール送信ログ.log", _
        IO.FileMode.Append)
    
     
    FileStreamクラスのWriteメソッドを使用して、Byte型配列bufferの中身をファイルに書き出します。
     
    fs.Write(buffer, 0, buffer.Length)
    fs.Close()
    
     
    これで、メール送信のサーバとのやり取りなどをファイルに記録することができます。

まとめ

 メール送信処理を組み込んだアプリケーションを作ってみました。

 アドレスの文字列をオブジェクトに変換して使う点で少し手間がかかりますが、コンポーネントのメソッド・プロパティを操作するだけで、CCやBCC、添付ファイルなどに対応したメールを手軽に送信できるようになるのはとても魅力です。

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

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

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

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5