c#でAWS SESメール送信方法(ドメイン認証編)

AWS SES とは、メールを送信したり受信したりできるサービスです。

AWS SESを用いたメールを送信方法は以下があります。

  • メールアドレス単位で認証してメール送信
       →認証したメールアドレスからしか送信できません。
  • ドメイン単位で認証してメール送信
       →認証したドメインであれば色々なメールアドレスから送信できます。

この記事では、c#でドメイン認証してメール送信する方法を紹介します。

ドメイン認証を行う

ドメインを取得したらAWSのRoute53に登録しましょう。

利用するドメイン取得サービスによってRoute53の登録方法は異なりますが、私が使用しているValue Domain では、ネームサーバをAWSのネームサーバに変更することで、AWS の Route53を参照してもらえるようになります。

Route53に登録したら、AWS SES 画面からドメイン認証を行いましょう。

AWS SESの Verified identities 画面を開き、Create Identity をクリックします。

Create Identity 画面が表示されたら、Domain か Email address を選びます。今回はテストメール送信のため両方の認証が必要になりますが、まず最初にDomainをクリックします。

Domainにドメイン名を入力します。

画面下部のCreate identityボタンをクリックします。

Identity Status が Verification pending に変わります。

ドメイン認証はドメインのCNAMEに認証キーを登録することで認証しますが、AWS Route53でドメイン管理していると自動的に登録されますので、何もする必要はありません。待つだけです。

しばらく待つと、Identity status が Verified に変わり、ドメイン認証が完了します。

テストメール送信先のメールアドレス認証を行う

テストメール送信先として使用するため、メールアドレス認証を行います。

メールアドレス認証を行うと、認証されたメールアドレスにテストメールを送信したり、メールを送信することができるようになります。

まず最初に、Verified identities画面からCreate identityボタンをクリックします。

Create identity画面が表示されます。Identity type を Email address、Email address に認証したいメールアドレスを入力します。

入力が完了したら、Create identityボタンをクリックします。

入力したメールアドレスへ認証URLが記載されたメールが送付されます。問題なければURLをクリックして認証しましょう。

無事認証されたら、Congratulations!画面が表示されます。

Verified identities画面に戻り、先ほどのメールアドレスが認証済み状態で表示されることを確認しましょう。

テストメールを送信する

ドメイン認証したドメインから任意のメールアドレスで送信できるかテストしてみましょう。

Send test email ボタンをクリックすると、テストメール送信画面が表示されます。

以下の通り入力していきます。

  • Email format : Formatted
  • From-address : 送信元にしたいメールアドレス @ ドメイン名
  • Scenario : Custom
  • Custom recipient : メールアドレス認証したメールアドレス
  • Subject : テストメールの件名
  • Body : テストメールの本文

テストメールの送信に成功すると、以下の画面のようにメールを受信できます。

プログラムからメール送信するために必要な情報

プログラムからメールを送信するには、以下の情報が必要になります。

  • SMTPユーザーID
  • SMTPユーザーパスワード
  • SMTPサーバーホスト名
  • SMTP接続ポート番号番号 

SMTPサーバホスト名とポート番号

AWS SES の SMTPサーバホスト名とポート番号は、SMTP Settingsに記載されています。

SMTPユーザーIDとパスワードを取得する

SMTPユーザーIDとパスワードは、同じくSMTP settings画面から「Create SMTP credentials」をクリックします。

IAM User Name の入力画面が表示されますので、デフォルトのまま次画面にいきましょう。

SMTP認証情報が作成されますので、ユーザー名とパスワードをメモしておきましょう。

使用する名前空間

ここで紹介するコードでは、以下2つの名前空間を使用します。

  • using System.Net;
  • using System.Net.Mail;

メール送信関数

以下の関数によりメール送信を行います。

送信されるメールはテキスト形式としています。

//using System.Net;
//using System.Net.Mail;

        public static void sendMail(string toAddr, string subject, string body)
        {

            string fromAddr = "noreply@test….com";

            string  SMTP_USERNAME = "XXXXXXXXXXXXXXX";
            string SMTP_PASSWORD = "yyyyyyyyyyyyyyyyyy";

            string Host = "email-smtp.us-east-1.amazonaws.com";
            int port = 587;

            MailMessage message = new MailMessage();
            message.IsBodyHtml = false;
            message.From = new MailAddress(fromAddr, fromAddr);
            message.To.Add(new MailAddress(toAddr));
            message.Subject = subject;
            message.Body = body;

            using (SmtpClient client = new SmtpClient(Host, port))
            {
                client.Credentials = new NetworkCredential(SMTP_USERNAME, SMTP_PASSWORD);
                client.EnableSsl = true;
                try
                {

                    client.Send(message);
                    Console.WriteLine("email sent");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("the email was not sent");
                    Console.WriteLine(ex.Message);
                }
            }

        }

メール送信関数の使い方

この関数は以下の引数をとります。

  • 宛先メールアドレス
  • 件名
  • 本文
sendMail("testmail@test….com", "test", "this is test mail.");

以下のようにテストメールが送信されます。

宛先・送信元メールアドレス、件名や本文を設定する

以下のソースコードで、メールの送信内容を設定していきます。

MailMessage message = new MailMessage();
message.IsBodyHtml = false;
message.From = new MailAddress(fromAddr, fromAddr);
message.To.Add(new MailAddress(toAddr));
message.Subject = subject;
message.Body = body;

MailMessage.IsBodyHtml = falseで、メール本文をテキスト形式としています。

FromやToは、new MailAddressとしてオブジェクトを生成してせってしていきます。

Toは複数の設定が可能なので、Addメソッドを使用して設定します。

MailMessage.Subjectは件名、MailMessage.Bodyはメール本文を設定します。

SMTPクライアントオブジェクトの生成とメール送信

以下のコードでメール送信処理を行なっています。

using (SmtpClient client = new SmtpClient(Host, port))
            {
                client.Credentials = new NetworkCredential(SMTP_USERNAME, SMTP_PASSWORD);
                client.EnableSsl = true;
                try
                {

                    client.Send(message);
                    Console.WriteLine("email sent");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("the email was not sent");
                    Console.WriteLine(ex.Message);
                }
            }

SmtpClientオブジェクトを生成します。引数に渡す「Host」と「Port」は、「SMTPサーバホスト名とポート番号 」で紹介した部分を設定します。

その後、SmtpClient.Credentialsに認証情報を入れていきます。「SMTP_USERNAME」と「SMTP_PASSWORD」は、「SMTPユーザーIDとパスワードを取得する 」で取得した情報を設定します。

SmtpClient.Sendメソッドでメール送信を行います。

ソースコード全文

using System;
using System.Net;
using System.Net.Mail;

namespace SendMailApp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            sendMail("testmail@test….com", "test", "this is test mail.");
        }

        public static void sendMail(string toAddr, string subject, string body)
        {

            string fromAddr = "noreply@test….com";

            string  SMTP_USERNAME = "XXXXXXXXXXXXXXX";
            string SMTP_PASSWORD = "yyyyyyyyyyyyyyyyyy";

            string Host = "email-smtp.us-east-1.amazonaws.com";
            int port = 587;

            MailMessage message = new MailMessage();
            message.IsBodyHtml = false;
            message.From = new MailAddress(fromAddr, fromAddr);
            message.To.Add(new MailAddress(toAddr));
            message.Subject = subject;
            message.Body = body;

            using (SmtpClient client = new SmtpClient(Host, port))
            {
                client.Credentials = new NetworkCredential(SMTP_USERNAME, SMTP_PASSWORD);
                client.EnableSsl = true;
                try
                {

                    client.Send(message);
                    Console.WriteLine("email sent");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("the email was not sent");
                    Console.WriteLine(ex.Message);
                }
            }

        }

    }
}

最後に:サンドボックスについて

AWS SES では不正利用を防ぐために最初はサンドボックス環境が構築されています。サンドボックス環境内では、送信先に設定可能なメールアドレスが制限されているなど、通常利用として使うには難しいと思わせる制限がかけられています。

このサンドボックス(送信制限)を解除する方法は以下に記載しています。

AWS SES 送信制限解除(サンドボックス外への移動)申請内容の書き方 https://usefuledge.com/awssessandbox.html

コメント

タイトルとURLをコピーしました