[ VB.NET / C# ] SSL自己署名環境でメールを送信する ( NetworkCredential )

Pocket

開発環境などのデバッグ環境では SSL に自己署名証明書 ( オラオラ証明書 ) を使用していることが多いですが、そのような環境でも正常にメールを送信するサンプルコードを掲載しています。

スポンサーリンク

メール送信サンプルプログラム

下記が、メール送信サンプルプログラムになります。MailMessage, SmtpClient クラスを使用してメールの送信を行っています。詳細はサンプル内のコメントを参照ください。

VB.NET

Imports System.Net
Imports System.Net.Mail
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates

    ''' メールを送信する
    Private Sub SendMail()

        '送信メールの生成
        Dim mlMsg As New MailMessage()

        mlMsg.Subject = "Subject"                 ' サブジェクト
        mlMsg.Body = "Body"                       ' 本文
        mlMsg.From = New MailAddress("from@mail") ' 送信元アドレス
        mlMsg.To.Add("to@mail")   ' 宛先TO
        mlMsg.CC.Add("cc@mail")   ' 宛先CC
        mlMsg.Bcc.Add("bcc@mail") ' 宛先BCC
        mlMsg.Attachments.Add(New Attachment("E:\aaa.txt")) ' 添付ファイル

        ' SMTP サーバーアドレスとポート番号
        Dim smtpClient As New SmtpClient("smtp.mail", 587)

        ' 認証を行う場合
        smtpClient.Credentials = New NetworkCredential("from@mail", "password")

        ' SSLで通信する場合
        smtpClient.EnableSsl = True

        ' 自己署名証明書でも通信OK
        Dim cb As RemoteCertificateValidationCallback = _
            New RemoteCertificateValidationCallback(AddressOf OnRemoteCertificateValidationCallback)

        ' コールバックメソッドを登録(デバッグや試験の場合にのみ使用されるべき)
        ServicePointManager.ServerCertificateValidationCallback = cb

        '送信
        smtpClient.Send(mlMsg)

        ' メッセージを破棄する
        mlMsg.Dispose()

    End Sub

    ' コールバックメソッド
    Private Function OnRemoteCertificateValidationCallback(ByVal sender As Object, _
                                                           ByVal certificate As X509Certificate, _
                                                           ByVal chain As X509Chain, _
                                                           ByVal sslPolicyErrors As SslPolicyErrors) _
                                                           As Boolean
        ' 自己署名証明書証明書でもOKとする
        ' デバッグで自己署名証明書を使用している場合などにのみ使うこと
        Return True

    End Function

C#

using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

    /// メールを送信する
    public void SendMail()
    {
        //送信メールの生成
        MailMessage mlMsg = new MailMessage();

        mlMsg.Subject = "Subject";                //サブジェクト
        mlMsg.Body = "Body";                      //本文
        mlMsg.From = new MailAddress("from@mail"); // 送信元アドレス
        mlMsg.To.Add("to@mail");   // 宛先TO
        mlMsg.CC.Add("cc@mail");   // 宛先CC
        mlMsg.Bcc.Add("bcc@mail"); // 宛先BCC
        mlMsg.Attachments.Add(new Attachment(@"E:\aaa.txt")); // 添付ファイル

        // SMTP サーバーアドレスとポート番号
        SmtpClient smtpClient = new SmtpClient("smtp.mail", 587);

        // 認証を行う場合
        smtpClient.Credentials = new NetworkCredential("from@mail", "password");

        // SSLで通信する場合
        smtpClient.EnableSsl = true;

        // 自己署名証明書でも通信OK
        RemoteCertificateValidationCallback cb  = 
            new RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback);

        // コールバックメソッドを登録(デバッグや試験の場合にのみ使用されるべき)
        ServicePointManager.ServerCertificateValidationCallback = cb;

        // 送信
        smtpClient.Send(mlMsg);

        // メッセージを破棄する
        mlMsg.Dispose();

    }

    // コールバックメソッド
    private Boolean OnRemoteCertificateValidationCallback(object sender, 
                                                          X509Certificate certificate,
                                                          X509Chain chain,
                                                          SslPolicyErrors sslPolicyErrors)
    {
        // 自己署名証明書証明書でもOKとする
        // デバッグで自己署名証明書を使用している場合などにのみ使うこと
        return true;
    }
注意事項

MailMessage クラスの Dispose メソッドは必ず呼び出し必要があります。( using を使用することが最も確実です ) 。Dispose メソッドを呼び出さないと、プログラムが添付ファイルをつかんだままとなってしまいます。

参考
スポンサーリンク


Pocket

One thought on “[ VB.NET / C# ] SSL自己署名環境でメールを送信する ( NetworkCredential )”

Leave a Comment

Your email address will not be published. Required fields are marked *