DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

SSL/TLSを使用してSMTPでメールを送信する

注意:ここで紹介しているコードを実際に使用する場合は、送信者、送信先などを必ず変更してください。

SmtpClientクラスを使用する方法

注意:SmtpClientクラスは、.NET Framework 2.0以降でしか使用できません。また、ここではSmtpClientクラスについて詳しくは説明しませんので、まずは「SmtpClientクラスを使ってメールを送信する」をご覧ください。

SmtpClientクラスでメールを送信する時、SSL/TLSを使用するには、SmtpClient.EnableSslプロパティをTrueにします。MSDNによると、対応している方式はSTARTTLSのみで、SMTP over SSL(SMTP/SSL、SMTPS)には対応していません。

補足:.NET Frameworkの古いバージョンでは、Credentialsプロパティを設定し、EnableSslプロパティをtrueにすると失敗するという報告がありましたが(例えば、「Cannot enable SSL with a username and password.」)、事実かどうかは未確認です。

以下の例では、GoogleのGmailを使用してメールを送信しています。ポート番号は、587を使用します(STARTTLSですので、465は使えません)。なお認証の方法については、「SMTP認証でメールを送信する」をご覧ください。

VB.NET
コードを隠すコードを選択
'Gmailでメールを送信する

'MailMessageの作成
Dim msg As New System.Net.Mail.MailMessage( _
    "xxx@gmail.com", "yyy@gmail.com", _
    "テスト", "このメールは、テストです。")

Dim sc As New System.Net.Mail.SmtpClient()
'SMTPサーバーなどを設定する
sc.Host = "smtp.gmail.com"
sc.Port = 587
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
'ユーザー名とパスワードを設定する
sc.Credentials = New System.Net.NetworkCredential("xxx@gmail.com", "pass")
'SSLを使用する
sc.EnableSsl = True
'メッセージを送信する
sc.Send(msg)

'後始末
msg.Dispose()
'後始末(.NET Framework 4.0以降)
sc.Dispose()
C#
コードを隠すコードを選択
//Gmailでメールを送信する

//MailMessageの作成
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(
    "xxx@gmail.com", "yyy@gmail.com",
    "テスト", "このメールは、テストです。");

System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();
//SMTPサーバーなどを設定する
sc.Host = "smtp.gmail.com";
sc.Port = 587;
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
//ユーザー名とパスワードを設定する
sc.Credentials = new System.Net.NetworkCredential("xxx@gmail.com", "pass");
//SSLを使用する
sc.EnableSsl = true;
//メッセージを送信する
sc.Send(msg);

//後始末
msg.Dispose();
//後始末(.NET Framework 4.0以降)
sc.Dispose();

MSNのHotmailでも同じように送信できます。ポート番号はやはり587です。

VB.NET
コードを隠すコードを選択
'Hotmailでメールを送信する

'MailMessageの作成
Dim msg As New System.Net.Mail.MailMessage( _
    "xxx@hotmail.com", "yyy@hotmail.com", _
    "テスト", "このメールは、テストです。")

Dim sc As New System.Net.Mail.SmtpClient()
'SMTPサーバーなどを設定する
sc.Host = "smtp.live.com"
sc.Port = 587
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
'ユーザー名とパスワードを設定する
sc.Credentials = New System.Net.NetworkCredential("xxx@hotmail.com", "pass")
'SSLを使用する
sc.EnableSsl = True
'メッセージを送信する
sc.Send(msg)

'後始末
msg.Dispose()
'後始末(.NET Framework 4.0以降)
sc.Dispose()
C#
コードを隠すコードを選択
//Hotmailでメールを送信する

//MailMessageの作成
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(
    "xxx@hotmail.com", "yyy@hotmail.com",
    "テスト", "このメールは、テストです。");

System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();
//SMTPサーバーなどを設定する
sc.Host = "smtp.live.com";
sc.Port = 587;
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
//ユーザー名とパスワードを設定する
sc.Credentials = new System.Net.NetworkCredential("xxx@hotmail.com", "pass");
//SSLを使用する
sc.EnableSsl = true;
//メッセージを送信する
sc.Send(msg);

//後始末
msg.Dispose();
//後始末(.NET Framework 4.0以降)
sc.Dispose();

SSL/TLSのバージョンを指定する

上記のようにしてメールを送信する時に使用されるSSL/TLSのバージョンは、ServicePointManager.SecurityProtocolプロパティで設定されたものになります。デフォルトの値は「SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls」で、SSL3.0かTLS1.0を使用します。ただこの場合でも、SSL3.0しか対応していないサーバーでは自動的にSSL3.0が選択されるという訳ではなく、TLSを使ってエラーが発生することがあるようです(「Set the SecurityProtocol (Ssl3 or TLS) on the .net HttpWebRequest per request」より)。そのため、もしSSL3.0しか使えないのであれば、ServicePointManager.SecurityProtocolプロパティを「SecurityProtocolType.Ssl3」のみにしておいた方がよさそうです。

なおServicePointManager.SecurityProtocolプロパティはアプリケーションドメイン毎の設定であり、接続毎の設定ではありません。

VB.NET
コードを隠すコードを選択
'SSL3.0しか使わないようにする
System.Net.ServicePointManager.SecurityProtocol = _
    System.Net.SecurityProtocolType.Ssl3

Dim msg As New System.Net.Mail.MailMessage( _
    "xxx@hotmail.com", "yyy@hotmail.com", _
    "テスト", "このメールは、テストです。")
Dim sc As New System.Net.Mail.SmtpClient()
sc.Host = "smtp.live.com"
sc.Port = 25
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
sc.Credentials = New System.Net.NetworkCredential("xxx@hotmail.com", "pass")
'SSLを使用する
sc.EnableSsl = True
sc.Send(msg)
msg.Dispose()
sc.Dispose()
C#
コードを隠すコードを選択
//SSL3.0しか使わないようにする
System.Net.ServicePointManager.SecurityProtocol =
    System.Net.SecurityProtocolType.Ssl3;

System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(
    "xxx@hotmail.com", "yyy@hotmail.com",
    "テスト", "このメールは、テストです。");
System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();
sc.Host = "smtp.live.com";
sc.Port = 25;
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
sc.Credentials = new System.Net.NetworkCredential("xxx@hotmail.com", "pass");
//SSLを使用する
sc.EnableSsl = true;
sc.Send(msg);
msg.Dispose();
sc.Dispose();

SmtpMailクラスを使う方法

.NET Framework 1.1からは、MailMessageクラスのFieldsプロパティを使用することにより、SSLを使ってメールの送信ができます。この場合は、STARTTLSではなく、SMTP over SSLとなるようです。

なおSmtpMailクラスを使ってメールを送信する基本的な方法は、「SMTPでメールを送信する」をご覧ください。

以下に、Gmailでメールを送信する例を示します。ポート番号は、465にします(587では送信できません)。なお認証の方法については、「SMTP認証でメールを送信する」をご覧ください。

VB.NET
コードを隠すコードを選択
'Gmailでメールを送信する

Dim mail As New System.Web.Mail.MailMessage()
mail.From = "xxx@gmail.com"
mail.[To] = "yyy@gmail.com"
mail.Subject = "テスト"
mail.Body = "これはテストです。"

'認証を使用する
mail.Fields( _
    "http://schemas.microsoft.com/cdo/configuration/sendusing") = _
    2
mail.Fields( _
    "http://schemas.microsoft.com/cdo/configuration/smtpserver") = _
    "smtp.gmail.com"
mail.Fields( _
    "http://schemas.microsoft.com/cdo/configuration/smtpserverport") = _
    465
mail.Fields( _
    "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = _
    1
'ユーザー名
mail.Fields( _
    "http://schemas.microsoft.com/cdo/configuration/sendusername") = _
    "xxx@gmail.com"
'パスワード
mail.Fields( _
    "http://schemas.microsoft.com/cdo/configuration/sendpassword") = _
    "password"

'SSLを使用する
mail.Fields( _
    "http://schemas.microsoft.com/cdo/configuration/smtpusessl") = _
    True

System.Web.Mail.SmtpMail.SmtpServer = "smtp.gmail.com"

'メールを送信
System.Web.Mail.SmtpMail.Send(mail)
C#
コードを隠すコードを選択
//Gmailでメールを送信する

System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage();
mail.From = "xxx@gmail.com";
mail.To = "yyy@gmail.com";
mail.Subject = "テスト";
mail.Body = "これはテストです。";

//認証を使用する
mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"]
    = 2;
mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserver"]
    = "smtp.gmail.com";
mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"]
    = 465;
mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"]
    = 1;
//ユーザー名
mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"]
    = "xxx@gmail.com";
//パスワード
mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"]
    = "password";

//SSLを使用する
mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"]
    = true;

System.Web.Mail.SmtpMail.SmtpServer = "smtp.gmail.com";

//メールを送信
System.Web.Mail.SmtpMail.Send(mail);

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。