2009-12-07T02:28:42の更新内容

programming/netfx2/System.Net.Mail.SmtpClient/index.wiki.txt

current previous
1,108 0,0
+
${smdncms:title,System.Net.Mail.SmtpClient}
+
${smdncms:keywords,System.Net.Mail,SmtpClient,MailMessage}
+

          
+
System.Net.Mail.SmtpClientの使い方、メールの送信方法など。
+

          
+
#googleadunit
+

          
+
*SmtpClientとMailMessageの使い方
+
**基本・メールを送信する
+
本文・ヘッダともにiso-2022-jpを使用してメールを送信する例。 コメントにあるように、ヘッダのエンコーディングにiso-2022-jpなどを指定しても正しいQエンコーディング文字列にはならないので、代わりに自前でBエンコードするようにする。
+

          
+
#code(cs){{
+
private static string GetBEncoded(string str, Encoding encoding)
+
{
+
  return string.Format("=?{0}?B?{1}?=", encoding.HeaderName, Convert.ToBase64String(encoding.GetBytes(str)));
+
}
+

          
+
public static void Main()
+
{
+
  var message = new MailMessage("from@mail.example.com", "to@mail.example.net");
+

          
+
  message.Body = "本文";
+
  message.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");
+

          
+
  /*
+
   * http://support.microsoft.com/kb/933866/ja
+
   * NET Framework 2.0 ベースのアプリケーションで MailMessage を使ってメッセージを送信すると送受信者名、件名が文字化けする
+
   */
+
  message.Subject = GetBEncoded("件名", Encoding.GetEncoding("iso-2022-jp"));
+

          
+
  var client = new SmtpClient("localhost", 25);
+

          
+
  client.Send(message);
+
}}
+

          
+
**ヘッダの長さと折り返し
+
SubjectプロパティやHeadersプロパティでヘッダの内容を指定する場合、長さなどは制限されない上、折り返しもされない模様。
+
#code(cs){{
+
var message = new MailMessage(...);
+

          
+
// 送信されるメッセージのSubjectヘッダには360文字のxが折り返されずに指定される
+
message.Subject = new string('x', 360);
+
}}
+

          
+
また、改行やタブなどを含む文字列を指定することもできないので、無理矢理折り返させることも出来ない。
+
#code(cs){{
+
message.Subject = "line1\r\n\tline2\r\n\tline3";  // ArgumentException
+
message.Subject = "line1\r\n line2\r\n line3";    // ArgumentException
+
message.Subject = "line1\n line2\n line3";        // ArgumentException
+
message.Headers["Subject"] = "line1\r\n\tline2\r\n\tline3"; // FormatException
+
message.Headers["Subject"] = "line1\r\n line2\r\n line3";   // FormatException
+
message.Headers["Subject"] = "line1\n line2\n line3";       // FormatException
+
}}
+

          
+
*SmtpClientインスタンスの作成
+
**SMTPサーバとしてGMailを使用する
+
GMail SMTPサーバでは認証とSSLでの接続が必要になるため、CredentialsとEnableSsl設定する必要がある。
+
#code(cs){{
+
/*
+
 * 前略
+
 */
+

          
+
var client = new SmtpClient("smtp.gmail.com", 587);
+

          
+
client.DeliveryMethod = SmtpDeliveryMethod.Network;
+
client.Credentials = new NetworkCredential("user", "pass");
+
client.EnableSsl = true;
+

          
+
client.Send(message);
+
}}
+

          
+
**SMTPサーバの設定にアプリケーション構成ファイルを使用する
+
SmtpClientのHost, Port, Credentailsなどのプロパティは、コンストラクタ等で明示的に指定しない場合、アプリケーション構成ファイルから設定が読み込まれる。 SMTPサーバが不変の場合などは、アプリケーション構成ファイルを使うことができる。
+

          
+
前項のGMailを使用する場合の例をアプリケーション構成ファイルを使って記述すると次のようになる。
+
#code(xml,test.exe.config){{
+
<?xml version="1.0" encoding="utf-8" ?>
+
<configuration>
+
  <system.net>
+
    <mailSettings>
+
      <smtp deliveryMethod="network">
+
        <network
+
          host     = "smtp.gmail.com"
+
          port     = "587"
+
          userName = "user"
+
          password = "pass"
+
        />
+
      </smtp>
+
    </mailSettings>
+
  </system.net>
+
</configuration>
+
}}
+

          
+
ただし、EnableSslプロパティはアプリケーション構成ファイルでは指定できないので、コード中で指定するほかない。
+
#code(cs){{
+
/*
+
 * 前略
+
 */
+

          
+
var client = new SmtpClient();
+

          
+
client.EnableSsl = true;
+

          
+
client.Send(message);
+
}}
+

          
+
.NET Framework 4からはアプリケーション構成ファイルで指定できる項目が増え、EnableSslプロパティに相当する属性も指定出来るようになる模様。
+