SHOEISHA iD

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

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

ComponentZine(iNetSuite)

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

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

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

コードの作成

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

  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、添付ファイルなどに対応したメールを手軽に送信できるようになるのはとても魅力です。

 

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

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

瀬戸 遥(セト ハルカ)

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング