.NET發送Mail介紹

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( _
  "[email protected]", _
  "[email protected]", _
  "プログラムから送信する電子メール", _
  "この電子メールはプログラムから送信しています。" & vbCrLf _
    & "これは本文の2行目です" & vbCrLf)
電子メールを送信するためのコード(Visual Basic .NET版)

System.Web.Mail.SmtpMail.Send(
  "[email protected]",
  "[email protected]",
  "プログラムから送信する電子メール",
  "この電子メールはプログラムから送信しています。/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 = "[email protected]"
message.To = "[email protected]; [email protected]"
message.Cc = "[email protected]; [email protected]"
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 = "[email protected]";
message.To = "[email protected]; [email protected]";
message.Cc = "[email protected]; [email protected]";
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


 

以上,是轉的文章,自己使用了一下,確實能發送mail。

但是,只是在XP系統下面。而且如果你的StmpMailServer需要驗證的話,還要加上下面這句話。
 message.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "******")

在 2003 操作系統中,會出現“CDO.Message”無法訪問的錯誤。
解決方法,也查找了很多,但是都沒有什麼操作性。正在進一步的解決。


0704
問題解決:
        smtp服務器需要驗證。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章