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メソッドでは、次のようにして電子メールを送信することができる。
| |
電子メールを送信するためのコード(Visual Basic .NET版) |
| |
電子メールを送信するためのコード(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に指定したり、添付ファイルを付けたりすることも可能だ。以下にこれを使用した例を示す。
| |
より詳細な設定で電子メールを送信するためのコード(Visual Basic .NET版) |
| |
より詳細な設定で電子メールを送信するためのコード(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)を添付ファイルとしている。
| |
添付ファイルを添付するためのコード(Visual Basic .NET版) |
| |
添付ファイルを添付するためのコード(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プロパティでいうエンコードは意味が異なることに注意しなければならない。前者は、バイナリ・データをテキストで表現することを意味し、後者は文字をどのようなビット列で表現するかを意味する。

以上,是转的文章,自己使用了一下,确实能发送mail。
但是,只是在XP系统下面。而且如果你的StmpMailServer需要验证的话,还要加上下面这句话。
message.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "******")
在 2003 操作系统中,会出现“CDO.Message”无法访问的错误。
解决方法,也查找了很多,但是都没有什么操作性。正在进一步的解决。
0704
问题解决:
smtp服务器需要验证。