.NET TIPS

電子メールを送信するには?

株式会社ピーデー  川俣 晶
2003/04/18

 C#やVB.NETのプログラムからインターネット電子メールを送信する場合には、SmtpMailクラス(System.Web.Mail名前空間)のSendメソッドを使用する。このクラスは、「Web」という文字列が入っている名前空間に属しているが、Webアプリケーションだけでなく、どのような種類のプログラム中からも利用できる。例えば、Windowsアプリケーションやコンソール・アプリケーションから利用しても問題ない。

 このSmtpMailクラスは、もともとOSに組み込まれているCDOSYS(Collaboration Data Objects for Windows 2000)メッセージ コンポーネントを使用してメッセージを送信するもので、このクラス自身が電子メールの送信機能を持っているわけではない。このため、OSよりこの機能を取り除くような操作を行っている場合、このクラスを通して電子メールを送信できない可能性がある。

 このクラスは、クラス・ライブラリのDLLであるSystem.Web.dllの中に含まれているので、これが参照されていない場合は参照をプロジェクトに追加する必要がある。Visual Studio .NETではメニューの[プロジェクト]−[参照の追加]を実行して、System.Web.dllを追加する。コマンドラインからコンパイルする場合は、cscコマンドやvbcコマンドで、/r:System.Web.dllというオプションを追加する。

 Sendメソッドでは、次のようにして電子メールを送信することができる。

System.Web.Mail.SmtpMail.Send( _
  "system@sample.domain", _
  "kodai@sample.domain", _
  "プログラムから送信する電子メール", _
  "この電子メールはプログラムから送信しています。" & vbCrLf _
    & "これは本文の2行目です" & vbCrLf)
電子メールを送信するためのコード(Visual Basic .NET版)
 
System.Web.Mail.SmtpMail.Send(
  "system@sample.domain",
  "kodai@sample.domain",
  "プログラムから送信する電子メール",
  "この電子メールはプログラムから送信しています。\r\n"
    + "これは本文の2行目です\r\n");
電子メールを送信するためのコード(C#版)

 見て分かるとおり、たった1つのメソッド呼び出しを記述するだけで電子メールの送信が実現できている。メソッドのパラメータには、上から順に次の項目を文字列で指定する。

  • 送信者のメール・アドレス
  • 受信者のメール・アドレス
  • 件名(Subject)
  • 本文

 この方法で送信すると、プレーン・テキストの電子メールとして送信されるので、HTMLのタグなどを記述する意味はない。

 本文に渡す文字列は、電子メールの仕様が要求する制限を意識して記述する必要がある。1行の文字数は改行を含まないで78文字以下であるべきで、998文字を超えてはならない。また、改行は「復帰(CR)+改行(LF)」というシーケンスでなければならない。VB.NETではvbCrLfを、C#では"\r\n"を使用するとよいだろう(RFC 2822参照)。

 さて、この方法を使用した場合、電子メールは、そのプログラムを実行しているWindows上で稼働するIISのSMTP機能を経由して送信される。IISが使用するInetpub\mailroot\Pickupディレクトリに送信したいメール本体が書き込まれ、それをIISのSMTP機能が拾い上げて送信してくれるわけである。そのため、IISがインストールされていなかったり、SMTP機能が停止されていたりする場合には、電子メールを送信することができない(ただし次項で述べているように、SmtpServerプロパティを利用すれば、この方法でもIISのSMTP機能を使用せずに電子メールの送信が可能)。

より高度な電子メール送信

 SmtpMailクラスのSendメソッドには、オーバーロードされたもう1つのバリエーションがある。これを用いると、よりきめ細かく電子メールの内容を指定することができる。このバリエーションは、パラメータに4つの文字列ではなく、MailMessageクラス(System.Web.Mail名前空間)のインスタンスを1つだけ渡すようになっている。きめ細かい条件は、このインスタンスに設定することができる。あて先をCcに指定したり、添付ファイルを付けたりすることも可能だ。以下にこれを使用した例を示す。

System.Web.Mail.SmtpMail.SmtpServer = "tina.sample.domain"

Dim message As New System.Web.Mail.MailMessage()
message.From = "system@sample.domain"
message.To = "kodai@sample.domain; shima@sample.domain"
message.Cc = "okita@sample.domain; mori@sample.domain"
message.Subject = "プログラムから送信する電子メール"
message.BodyEncoding = System.Text.Encoding.UTF8
message.BodyFormat = System.Web.Mail.MailFormat.Html

message.Body = "<html><body><p>この電子メールはプログラムから送信しています。</p>" & vbCrLf _
  & "<p>これは本文の2行目です</p></body></html>" & vbCrLf

System.Web.Mail.SmtpMail.Send(message)
より詳細な設定で電子メールを送信するためのコード(Visual Basic .NET版)
 
System.Web.Mail.SmtpMail.SmtpServer = "tina.sample.domain";

System.Web.Mail.MailMessage message
    = new System.Web.Mail.MailMessage();
message.From = "system@sample.domain";
message.To = "kodai@sample.domain; shima@sample.domain";
message.Cc = "okita@sample.domain; mori@sample.domain";
message.Subject = "プログラムから送信する電子メール";
message.BodyEncoding = System.Text.Encoding.UTF8;
message.BodyFormat = System.Web.Mail.MailFormat.Html;

message.Body = "<html><body><p>この電子メールはプログラムから送信しています。</p>\r\n"
  + "<p>これは本文の2行目です</p></body></html>\r\n";

System.Web.Mail.SmtpMail.Send(message);
より詳細な設定で電子メールを送信するためのコード(C#版)

 ここではまず、SmtpMailクラスのSmtpServerプロパティに、"tina.sample.domain"を代入している。これは、メール送信に使用するSMTPサーバを独自に指定する方法を示している。すでに述べたように、通常はIISのSMTP機能を経由して送信されるが、このプロパティに使用したいSMTPサーバを指定しておくと、それを経由して送信されることになる。このSmtpServerプロパティは、前の例で使用した4つの文字列をパラメータに取るSendメソッドでも有効である。

 さて、次がメール本体の作成である。まず、MailMessageクラスのインスタンスを作成し、そのプロパティでメールに必要な情報を設定していく。各プロパティの設定は次のようになっている。

・Fromプロパティ
 送信者の電子メール・アドレスを記述する。

・Toプロパティ
 送信先の電子メール・アドレスを記述する。複数ある場合はセミコロンで区切って続けて記述することができる。このルールは次のCcプロパティなどでも同じである。

・Ccプロパティ
 カーボン・コピーのあて先となる電子メール・アドレスを記述する。

・Subjectプロパティ
 件名(Subject)を記述する。

・BodyEncodingプロパティ
 電子メールの本文に使用する文字のエンコーディング方式を指定する。ここにはEncodingクラス(System.Text名前空間)のインスタンスを指定する。この例ではUTF-8を指定しているが、日本語の電子メールでは通常ISO-2022-JPを使用する(System.Text.Encoding.UTF8の代わりにSystem.Text.Encoding.GetEncoding("ISO-2022-JP")を使用する)。Encodingクラスについては、TIPS: Encodingクラスで扱えるエンコーディング名は?で解説している。

・BodyFormatプロパティ
 MailFormat列挙体(System.Web.Mail名前空間)の値により、メッセージのフォーマットを指定する。MailFormat.HtmlならHTMLメールであることを示す。MailFormat.Textなら、プレーン・テキストのメールであることを示す。

・Bodyプロパティ
 このプロパティには本文を指定するが、BodyFormatプロパティでMailFormat.Htmlを指定した場合は、正しくHTMLメールとなるような文字列を設定する必要がある(この例は、本来省略できないhead要素を記述していないなど、厳密にいうとあまり正しいHTMLになっていない)。

電子メールに添付ファイルを添付する場合

 最後に、メールに添付ファイルを添付する場合についても少し触れておこう。これには上記のコードの最後にあるSendメソッド呼び出しの直前に、次のようなコードを追加すればよい。ここでは画像ファイル(c:\sample.png)を添付ファイルとしている。

Dim attachment As New System.Web.Mail.MailAttachment( _
  "c:\sample.png", _
  System.Web.Mail.MailEncoding.Base64)
message.Attachments.Add(attachment)
添付ファイルを添付するためのコード(Visual Basic .NET版)
 
System.Web.Mail.MailAttachment attachment
  = new System.Web.Mail.MailAttachment(
    @"c:\sample.png",
    System.Web.Mail.MailEncoding.Base64);
message.Attachments.Add(attachment);
添付ファイルを添付するためのコード(C#版)

 添付ファイルは、MailAttachmentクラス(System.Web.Mail名前空間)を用いて指定する。1つの添付ファイルにつき、このクラスのインスタンスを1つ作成する。そして、MailMessageオブジェクト(上記のコードでは変数message)のAttachmentsプロパティに、これらのインスタンスをAddメソッドで追加するのである。これにより、Sendメソッドで送信されるときに、指定された添付ファイルが添付される。

 では、具体的に添付ファイルの内容はどうやって指定するのだろうか。それには、MailAttachmentクラスのコンストラクタのパラメータを使う。このコンストラクタには、ファイル名のみを渡すものと、ファイル名とエンコード方式を渡すものの2つのバリエーションが存在する。

 後者の方のコンストラクタを使う場合、エンコード方式の指定には、MailEncoding列挙体(System.Web.Mail名前空間)を使用する。ここには、Base64方式を意味するMailEncoding.Base64とuuencode方式を意味するMailEncoding.UUEncodeの値を指定することができる。しかし、uuencode方式はRFCで定義されたエンコード方式ではないので、特に必要がなければ、使用しない方がよいだろう(コンストラクタでファイル名のみを指定する場合、リファレンス・マニュアルには「既定では、EncodingプロパティはUUEncodeに設定されます」と記述されているが、筆者が試したところ実際にはBase64方式が既定となっているようだ。方式を厳密に指定したい場合には、省略しない方が安全だろう)。

 なお、ここでいうエンコードと、BodyEncodingプロパティでいうエンコードは意味が異なることに注意しなければならない。前者は、バイナリ・データをテキストで表現することを意味し、後者は文字をどのようなビット列で表現するかを意味する。End of Article

カテゴリ:クラス・ライブラリ 処理対象:電子メール
使用ライブラリ:SmtpMailクラス(System.Web.Mail名前空間)
使用ライブラリ:MailMessageクラス(System.Web.Mail名前空間)
使用ライブラリ:Encodingクラス(System.Text名前空間)
使用ライブラリ:MailFormat列挙体(System.Web.Mail名前空間)
使用ライブラリ:MailAttachmentクラス(System.Web.Mail名前空間)
使用ライブラリ:MailEncoding列挙体(System.Web.Mail名前空間)
関連TIPS:Encodingクラスで扱えるエンコーディング名は?

この記事と関連性の高い別の.NET TIPS
.NET Framework 2.0で電子メールを送信するには?
JISコード(JIS-2022-JP)でメールを送信するには?
[ASP.NET]PasswordRecoveryコントロールのパスワード通知メールをカスタマイズするには?
プログラムからブラウザやメーラを起動するには?
[ASP.NET]ユーザーから入力されたデータを任意のあて先にメールするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

更新履歴
【2003/05/07】 見出し「電子メールに添付ファイルを添付する場合」の直前に、「(ただし次項で述べているように、SmtpServerプロパティを利用すれば、この方法でもIISのSMTP機能を使用せずに電子メールの送信が可能)」を追記しました。
 
「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間