Partager via


SMTP における SSL 通信

こんにちは。Exchange サポート チームの小間です。
今回はプログラムから SSL を使用してメール送信を行う方法についてご案内します。
最後に Exchange Online へプログラムからメールを送信する方法も参考として紹介します。

一般的に SSL 通信では Implicit SSL と Explicit SSL と呼ばれる 2 種類の接続方法があります。
メール送信で使用する SMTP では、SSL 通信として SMTP over SSL と STARTTLS がありますが、SMTP over SSL は Implicit SSL に該当し、STARTTLS は Explicit SSL に該当します。
それぞれ以下のような特徴があります。

Implicit SSLの特徴
-------------------
一般的には 465 番ポートを使用します。
サーバーに接続した直後から SSL による暗号化通信を実施します。

Explicit SSL の特徴
-------------------
一般的には 587 番ポートを使用します。
サーバーに接続した後に AUTH コマンドを実行 (この時は非暗号化通信) して使用するプロトコルをネゴシエートします。
ネゴシエート完了後は SSL による暗号化通信を実施します。

次にプログラム (.NET Framework を使用するプログラム) から SSL を使用してメールを送信する際に利用できる方法を考えると、System.Web.Mail と System.Net.Mail の 2 種類の方法が考えられます。

内部で古いテクノロジーである CDOSYS を使用している System.Web.Mail は、現在は使用が推奨されませんが、Implicit SSL に対応しており Explicit SSL には非対応です (CDOSYS 自体も同様です)。
反対に System.Net.Mail は Explicit SSL には対応していますが Implicit SSL は対応していません。

このような違いがあるため、送信先の SMTP サーバーがサポートする方法に合わせて、送信側の実装も変える必要があります。

では Exchange の場合はどうかというと、オンプレミスの Exchange サーバーや Exchange Online では STARTTLS がサポートされています。
そのため、Exchange に SSL でメールを送信するときは、System.Net.Mail を使用することになります。

例えば以下のように実装することで Exchange Online へ SSL を使用して System.Net.Mail からメールを送信することができます。
実装の参考になりましたら幸いです。


using System;
using System.Net.Mail;

namespace SmtpClientDemo
{
   class Program
{
static void Main(string[] args)
{
           string emailSmtpServer = "smtp.office365.com"; // 接続先 SMTP サーバー
           int emailSmtpServerPort = 587; // ポート番号

           MailAddress emailFrom = new MailAddress("User01@contoso.onmicrosoft.com"); // 差出人 SMTP アドレス
           MailAddress emailTo = new MailAddress("User02@contoso.onmicrosoft.com"); // 宛先 SMTP アドレス

           MailMessage emailMessage = new MailMessage(emailFrom, emailTo); // メッセージを作成
           emailMessage.Subject = "Testing e-mail"; // 件名
           emailMessage.Body = "This message was sent by System.Net.Mail using STARTTLS."; // 本文

           SmtpClient smtpClient = new SmtpClient(emailSmtpServer, emailSmtpServerPort); // SmtpClient を作成
           smtpClient.Credentials = new System.Net.NetworkCredential("User01@contoso.onmicrosoft.com", "password"); // 認証のための資格情報 (UPN とパスワード)
           smtpClient.EnableSsl = true; // SSL を使用

           smtpClient.Send(emailMessage); // 送信

           Console.WriteLine("Done!"); // 送信完了を通知
           Console.ReadLine(); // 自動でコンソールが閉じるのを防ぐ
       }
}
}


今後も当ブログおよびサポート チームをよろしくお願いいたします。

※サンプル コードについて
サンプル コードは本ブログ記事の説明のための部分コードであり、弊社にてその動作を保証するものではございません。
ご使用の際にはお客様のシステムに合わせて修正していただき、十分なテストを実施していただきますようお願いいたします。
なお、サンプル内で使用しておりますコードの詳細な情報に関しては、MSDN、PlatformSDK などをご参照くださいますようお願いいたします。

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。