コードの作成
コードはとても簡単です。処理は大きく分けると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 _ )
引数 | 説明 |
indent (Integer 型) |
項目名の、リストの左端からの字下げを指定します。 |
image (Object 型) |
項目の画像 |
content (Object 型) |
項目の内容 |
description (Object 型) |
項目の説明文 |
value (Object 型) |
項目の値 |
backColor (System.Drawing.Color 型) |
項目の背景色 |
enabled (Boolean 型) |
項目がキーボードやマウスの操作に応答できるかどうか |
foreColor (System.Drawing.Color 型) |
項目の文字色 |
toolTipText (String 型) |
項目ツールチップに表示するテキスト |
visible (Boolean 型) |
項目が表示されているかどうか |
実際のコンストラクタの引数の設定方法は、コードを見てください。ここでは、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サーバを利用してメール送信を実行するクラスです。
その作成手順は次のとおりです。
MailMessage
クラスのコンストラクタを使用して、MailMessage
オブジェクトを作成する。コンストラクタの引数には、送信者のメールアドレスと送信先のメールアドレスを指定する。Subject
プロパティにメールのタイトル(件名)を、Body
プロパティにメール本文を指定する。- もし、CCのメールアドレスが入力されていれば、
MailAddress
クラスのコンストラクタでオブジェクトを作成し、MailMessage
クラスのCC
プロパティ(CCメールアドレスのコレクションオブジェクト)に追加する。 SmtpClient
クラスのコンストラクタで、SmtpClient
オブジェクトを作成する。コンストラクタの引数は、SMTPメールサーバのアドレス。- そして、この
SmtpClient
クラスのSend
メソッドを実行する。引数は、MailMessage
オブジェクトへの参照。
Try Dim msg As New System.Net.Mail.MailMessage( _ "xxx@xxxxx.ne.jp", Me.Combo1_to.Text) With msg
.Subject = Me.Edit2_subject.Text .Body = Me.RichTextBox1.Text End With
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
Dim client As New System.Net.Mail.SmtpClient("smtp.xxxxx.ne.jp")
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になっていますが、皆さんはぜひおしゃれなメーラーを作ってみてください。