SHOEISHA iD

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

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

ComponentZine(InputMan)

見映えのするコンボコントロールを使用したメール送信ソフトの作成

カラフルリストで自分専用のメーラーを作る

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

コードの作成

 コードはとても簡単です。処理は大きく分けると3つで、「コンボの初期化」「メール送信」「送信内容のテキストファイルへの保存」です。また、コードを作成する場所も、フォームのLoadイベントプロシージャと[送信]ボタンのClickイベントプロシージャだけです。

コンボの初期化処理

 フォームのLoadイベントプロシージャで、コンボのリスト作成と初期設定を実行します。

リストの表示状態の設定

 このコンボは、完成画面にあるように、1行にリスト項目とその説明文の2項目を表示します。そこで、コンボのテキストエリアとリストのスタイルを2列表示にし、イメージ(アイコン)の表示も可能にします。

 まずは、DescriptionAutoFitプロパティをFalseにします。このプロパティは、Trueにすると項目の表示数によってリストの幅を自動的に決定してくれます。自分でサイズを指定したい場合は、Falseにしておきます。

Combo1_to.DescriptionAutoFit = False

 次に、テキストエリアの表示を、アイコンと文字列の両方を表示できるように、TextBoxStyleプロパティに定数TextBoxStyle.Bothを代入します。

 また、リストにもアイコン、内容、および説明の3つが表示できるように、ListBoxStyleプロパティに値の定数ListBoxStyle.BothWithDescriptionを設定しておきます。これらのプロパティを設定しておかないと、完成図のようなコンボは作成できません。

Combo1_to.TextBoxStyle = TextBoxStyle.Both
Combo1_to.ListBoxStyle = ListBoxStyle.BothWithDescription

 そして、リストの高さとアイコンの幅を設定し、説明文の表示幅を指定します。

Combo1_to.ItemHeight = 20
Combo1_to.ImageWidth = 18
Combo1_to.DescriptionWidth = 220
 

 これで、リストにはアイコン・項目名・説明文の3つが、テキストエリアにはアイコンと項目名の2つが表示されるようになります。

 ただし、リストを選択して取得できるのは項目名のみで、アイコンと説明文はあくまでも表示のみ、ということになります。

リスト項目の設定

 まず、ImageListに組み込んだアイコンを取り出し、「type0」という名前のImageオブジェクトにしておきます。

Dim type0 As Image = Me.ImageList1.Images(0)

 次に、リスト項目を組み込みますが、単一の項目名であればそのままItemsコレクションにAddメソッドで追加するだけなのですが、今回のようにアイコン・項目名・説明文を組み込み、さらにリストの背景色と文字色まで変える設定を行うとなると、専用のオブジェクトを作成し、これをコンボのItemsコレクションに組み込む形を取ります。

 ComboItemクラスは、この装飾された項目名を担当するクラスで、このクラスのコンストラクタを使ってカラフルなリスト項目を設定します。コードの記述としては次のようになります。

Combo1.Items.Add(NewComboItemクラスのコンストラクタ)

 そして、ComboItemクラスのコンストラクタはオーバーロードになっており、その中の次の書式を使用します。

Overloads Public sub New( _
    ByVal indent As Integer, _
    ByVal image As Object, _
    ByVal content As Object, _
    ByVal description As Object, _
    ByVal value As Object, _
    ByVal backColorAs System.Drawing.Color, _
    ByVal enabled As Boolean, _
    ByVal foreColor As System.Drawing.Color, _
    ByVal toolTipText As String, _
    ByVal visible As Boolean _
)
引数 説明
indentInteger型) 項目名の、リストの左端からの字下げを指定します。
imageObject型) 項目の画像
contentObject型) 項目の内容
descriptionObject型) 項目の説明文
valueObject型) 項目の値
backColorSystem.Drawing.Color型) 項目の背景色
enabledBoolean型) 項目がキーボードやマウスの操作に応答できるかどうか
foreColorSystem.Drawing.Color型) 項目の文字色
toolTipTextString型) 項目ツールチップに表示するテキスト
visibleBoolean型) 項目が表示されているかどうか

 実際のコンストラクタの引数の設定方法は、コードを見てください。ここでは、5つのメールアドレスをリストに組み込みます。

Combo1_to.Items.Add(New ComboItem(0, type0, "seto@big.or.jp", _
    "ビッグ商事 瀨戸 遥様", 1, Color.Aqua, True, Color.Blue, _
    "瀨戸様", True))

 そして、リストの先頭を選択状態にしておきます。

Combo1_to.SelectedIndex = 0
End Sub

 以上で、フォームの初期化処理はできあがりです。

メール送信の処理

 今度は、[送信]ボタンを押したときのメール送信の処理を作成します。

入力チェックの処理

 最初に、メール本文が入力されているのかどうか、またメールのタイトル(件名)が入力されているのかどうかをチェックします。本文が空欄の時は、メール送信は行いません。タイトルが空欄の時は、空欄のまま送信するのかどうかを問い合わせます。

Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    If Me.RichTextBox1.Text = "" Then
        MessageBox.Show("本文が入力されていません")
        Exit Sub
    End If

    If Me.Edit2_subject.Text = "" Then
        Dim ret As Integer

        ret = MessageBox.Show("本文が入力されていません", _
            "タイトルの確認", MessageBoxButtons.YesNo)
        If ret = Windows.Forms.DialogResult.No Then
            Exit Sub
        Else
            MessageBox.Show("タイトルが空欄のまま送信します。")
        End If
    End If

メール送信の処理

 本文が入力されていれば、メールを送信します。.NET FrameworkクラスライブラリのSystem.Net.Mail.MailMessageクラスは、SMTPサーバを利用してメール送信を実行するクラスです。

 その作成手順は次のとおりです。

     
  1. MailMessageクラスのコンストラクタを使用して、MailMessageオブジェクトを作成する。コンストラクタの引数には、送信者のメールアドレスと送信先のメールアドレスを指定する。
  2.  
    Try
        Dim msg As New System.Net.Mail.MailMessage( _
            "xxx@xxxxx.ne.jp", Me.Combo1_to.Text)
        With msg
    
     
  3. Subjectプロパティにメールのタイトル(件名)を、Bodyプロパティにメール本文を指定する。
  4.  
        .Subject = Me.Edit2_subject.Text
        .Body = Me.RichTextBox1.Text
    End With
    
     
  5. もし、CCのメールアドレスが入力されていれば、MailAddressクラスのコンストラクタでオブジェクトを作成し、MailMessageクラスのCCプロパティ(CCメールアドレスのコレクションオブジェクト)に追加する。
  6.  
    If Me.Edit1_cc.Text <> "" Then
        Dim ccadrs As Net.Mail.MailAddress = _
            New Net.Mail.MailAddress(Me.Edit1_cc.Text)
        msg.CC.Add(ccadrs)
    End If
    
     
  7. SmtpClientクラスのコンストラクタで、SmtpClientオブジェクトを作成する。コンストラクタの引数は、SMTPメールサーバのアドレス。
  8.  
    Dim client As New System.Net.Mail.SmtpClient("smtp.xxxxx.ne.jp")
    
     
  9. そして、このSmtpClientクラスのSendメソッドを実行する。引数は、MailMessageオブジェクトへの参照。
  10.  
    client.Send(msg)
    
     

 これで、指定した送信先に、メールを送ることができます。CCは、アドレスがコレクションオブジェクトになっているので、送信したいアドレス分のMailAddressオブジェクトを作成し、Addメソッドでコレクションに追加します。

 また、今回はToのアドレスは1つしか使いませんでしたが、このToもコレクションオブジェクトになっていますので、同じように送信したいアドレス分のMailAddressオブジェクトを作成し、Addメソッドでコレクションに追加します。

 BCCもCCと同様の方法でアドレスを設定します。

 なお、この処理は、アドレス間違いなどでメールが送信できない場合もありますので、全体をTry...Catchステートメントで囲み、エラー処理を組み込んでおきます。

    MessageBox.Show("メールを送信しました。", "送信終了")
Catch ex As Exception
    MessageBox.Show("送信できませんでした。", "エラー")
End Try

メール内容の保存処理

 最後に、作成したメールの内容をテキストファイルに保存しておきましょう。これは、FileSystemオブジェクトのWriteAllTextメソッドを利用します。

 まず、保存するファイル名を実行時の日付・時刻から作成します。日時をシステムから取得するには、Nowプロパティを使用します。このプロパティは、現在の日時をDate型で返してきますのでこれを変数に受け取りますが、そのままではyyyy/mm/ddと「/」で区切られた数字になっており、「/」記号はファイル名に使用できません。そこで、取得した日時を年月日時分秒に分解し、「-」で区切るように作り直してファイル名にします。

Dim SendMailName As String = ""
Dim ND As Date
ND = Now
With ND
    SendMailName = "c:\送信メール保存\" & .Year & "-" & .Month & _
                   "-" & .Day & "-" & .Hour & "-" & .Minute & "-" & _
                   .Second & ".txt"
End With

 そして、WriteAllTextメソッドでファイルに書き出します。WriteAllTextメソッドメソッドは、ファイルにデータを追記します。ファイルが存在しない場合は自動的にファイルを作成します。

My.Computer.FileSystem.WriteAllText( _
    SendMailName, "To:" & Me.Combo1_to.Text & Chr(10), True)
My.Computer.FileSystem.WriteAllText( _
    SendMailName, "CC:" & Edit1_cc.Text & Chr(10), True)
My.Computer.FileSystem.WriteAllText( _
    SendMailName, "Subject:" & Me.Edit2_subject.Text & Chr(10), True)
My.Computer.FileSystem.WriteAllText( _
    SendMailName, Me.RichTextBox1.Text, True)

 これで出来上がりです。

送信したメール内容をアドレスと共に、日付をファイル名にしてファイルに保存する
送信したメール内容をアドレスと共に、日付をファイル名にしてファイルに保存する

まとめ

 .NET FrameworkクラスライブラリとInputMan for .NET 4.0Jのコンボを使って、オリジナルのメールソフトを作成しました。コンボのカラフルな説明文付きリストの作成は、ヘルプファイルを読んでも説明されていないので、使ってみたい方は本稿のコードを参考にしていただけるといいのではないかと思います。

 メールの送信手順も、複数のクラスを使うためちょっと分かりづらいのですが、一度コードを書いてみればすぐに使い方を覚えると思います。今回は、筆者のデザイン力が乏しいので、味も素っ気もないGUIになっていますが、皆さんはぜひおしゃれなメーラーを作ってみてください。

 

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

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

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング