EC2インスタンスからメールを送信したいという要望は時々出てきます。 AWSのメール送信サービスには、SES(Simple Email Service)があります。 SESでメール送信するには、「AWSのAPIを利用する」 「SMTPインターフェースを利用する」の2通りがありますが、今回は後者のやり方を試してみました。
今回の構成
東京リージョンにはSESのSMTPエンドポイントがないため、今回はムンバイにしてみました。 海外リージョンを使いますが、メールというアプリケーション特性上、少々の遅延は問題はないかと思います。
ちなみにSESにはメール受信用に、受信エンドポイントというのもあるのですが、ムンバイは含まれていません。 利用可能なSESのエンドポイントはこちらに記載があります。
SESの設定
SESインスタンスの作成といったものはなく、基本的に必要な作業はメールアドレスの認証とユーザー名・パスワードの取得のみです。
メールアドレスの認証
送信元メールアドレスの認証は、必須です。
SES > Email addresses > Verify a New Email Address
送信元メールアドレスを入力します。 基本的にどんなメールアドレスでもいいのですが、このすぐ後に確認メールが届くので、自分で受け取れるものにしましょう。
確認メールを受け取ったら、URLが記載されているので、そちらにアクセスします。
認証されました。
検証に成功しました メールアドレスの確認に成功しました。このアドレスからのメール送信を開始できます。 Amazon SES の新規ユーザーの場合–上限緩和をまだ申請していない場合は、引き続きサンドボックス環境を使用しています。そのため、メールは確認済みのアドレスにのみ送信できます。新しいメールアドレスまたはドメインを確認するには、Amazon SES コンソールの [Identity Management] のセクションを参照してください。
こちらの文面の通りなんですが、サンドボックス環境にいる場合は、送信先メールアドレスにも制限がかかります。 状況に応じて、メールアドレスの認証の追加や、上限緩和申請をしましょう。
認証されると、Verifiedとなります。
ユーザー名・パスワードの取得
SESのSMTPインターフェースを使う場合、SMTP認証(SMTP AUTH)は必須です。 SMTP認証では、ユーザー名とパスワードのペアで認証されますが、SESはそれにIAMユーザー(のアクセスキーとシークレットアクセスキー)を利用します。
SES > SMTP Settings > Create My SMTP Credentials
IAMユーザーを作成するので、IAMユーザー名を入力します。 やや混乱しやすいのですが、このIAMユーザー名はメール送信の際は使わないですし、送信元メールアドレスとも関係がありません。 SMTP認証のユーザー名は、IAMユーザー名ではなく、アクセスキーとなります。
作成ボタンを押すと、SMTPユーザー名とSMTP パスワードが表示されます。 これをメモして、SES側の設定は完了です。
EC2インスタンスの構築
EC2インスタンスからSMTPインターフェースを利用する条件
Amazon Linux 2から、メールを送信できるようにします。 どんなメール送信ソフトやSMTPライブラリを使うかによって設定は異なりますが、以下の条件をクリアする必要があります。
- SMTP認証を使い、IAMユーザーのアクセスキーとシークレットアクセスキーを指定する
- TLSを使う
- SESのエンドポイントを指定する
- ポート番号を587に指定する(25も可能ですが、E メール送信制限解除申請が必要)
- 送信元メールアドレスにはSESで認証済みのものを指定する
mailxの導入
今回は、mailxコマンドを使って試してみました。
mailxのインストール
$ sudo yum install mailx
~/.mailrc
set smtp-use-starttls set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb/ set smtp=smtp://email-smtp.ap-south-1.amazonaws.com:587 set smtp-auth=login set smtp-auth-user=AKIAXL4UENVWADS7RB7X set smtp-auth-password=BPONGFkunZrQ2ZrKFPqAn1D5OTu4EcOxkBaqozixsPnl set from=xxxxxxx@serverworks.co.jp
メール送信してみる
sh-4.2$ echo "Test" | mailx -v -s "MySubject" xxxxxxxx@gmail.com Resolving host email-smtp.ap-south-1.amazonaws.com . . . done. Connecting to 13.233.47.18:587 . . . connected. 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-0OFIHHU41 dHqm8Mo95o43bT6wE5Kd >>> EHLO ip-10-0-0-88.ap-northeast-1.compute.internal 250-email-smtp.amazonaws.com 250-8BITMIME 250-SIZE 10485760 250-STARTTLS 250-AUTH PLAIN LOGIN 250 Ok >>> STARTTLS 220 Ready to start TLS Error in certificate: Peer's certificate issuer is not recognized. Comparing DNS name: "email-smtp.ap-south-1.amazonaws.com" SSL parameters: cipher=AES-256-GCM, keysize=256, secretkeysize=256, issuer=CN=Amazon,OU=Server CA 1B,O=Amazon,C=US subject=CN=email-smtp.ap-south-1.amazonaws.com >>> EHLO ip-10-0-0-88.ap-northeast-1.compute.internal 250-email-smtp.amazonaws.com 250-8BITMIME 250-SIZE 10485760 250-STARTTLS 250-AUTH PLAIN LOGIN 250 Ok >>> AUTH LOGIN 334 VXNlcm5hbWU6 >>> QUtJQVhMNFVFTlZXQURTN1JCN1g= 334 UGFzc3dvcmQ6 >>> QlBPTkdGa3VuWnJRMlpyS0ZQcUFuMUQ1T1R1NEVjT3hrQmFxb3ppeHNQbmw= 235 Authentication successful. >>> MAIL FROM:250 Ok >>> RCPT TO: 250 Ok >>> DATA 354 End data with . >>> . 250 Ok 0109017023c52050-12aa6cdb-2c6e-4095-8685-58690b17242e-000000 >>> QUIT 221 Bye
送信できました。
(おまけ)証明書エラーについて
メール送信できましたが、よく見ると証明書のエラーが出ています。
Error in certificate: Peer's certificate issuer is not recognized.
実は.mailrcの設定で、証明書の検証でエラーが出ても先に進めるように set ssl-verify=ignoreを入れていました。 その設定を削除すると、以下のように送信失敗します。
$ echo "Test" | mailx -v -s "MySubject" xxxxxxxx@gmail.com Resolving host email-smtp.ap-south-1.amazonaws.com . . . done. Connecting to 13.126.45.56:587 . . . connected. 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-T9PA1RU41 Y9WzztsfONEbNIg9Im9o >>> EHLO ip-10-0-0-88.ap-northeast-1.compute.internal 250-email-smtp.amazonaws.com 250-8BITMIME 250-SIZE 10485760 250-STARTTLS 250-AUTH PLAIN LOGIN 250 Ok >>> STARTTLS 220 Ready to start TLS Error in certificate: Peer's certificate issuer is not recognized. Continue (y/n)? SSL/TLS handshake failed: Peer's certificate issuer is not recognized. "/home/ssm-user/dead.letter" 11/327 . . . message not sent.
証明書のエラーを出さないためには、ルート証明書をインポートする必要があります。 Amazon SES + mailx で「Error in certificate: Peer's certificate issuer is not recognized.」が出た時の対処法を参考にして、再度メールしてみた結果が以下となります。
$ echo "Test" | mailx -v -s "MySubject" xxxxxxxx@gmail.com Resolving host email-smtp.ap-south-1.amazonaws.com . . . done. Connecting to 52.66.150.235:587 . . . connected. 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-PDKSW5U41 lxHo3D7G8mDO6lvq0XtE >>> EHLO ip-10-0-0-88.ap-northeast-1.compute.internal 250-email-smtp.amazonaws.com 250-8BITMIME 250-SIZE 10485760 250-STARTTLS 250-AUTH PLAIN LOGIN 250 Ok >>> STARTTLS 220 Ready to start TLS Comparing DNS name: "email-smtp.ap-south-1.amazonaws.com" SSL parameters: cipher=AES-256-GCM, keysize=256, secretkeysize=256, issuer=CN=Amazon,OU=Server CA 1B,O=Amazon,C=US subject=CN=email-smtp.ap-south-1.amazonaws.com >>> EHLO ip-10-0-0-88.ap-northeast-1.compute.internal 250-email-smtp.amazonaws.com 250-8BITMIME 250-SIZE 10485760 250-STARTTLS 250-AUTH PLAIN LOGIN 250 Ok >>> AUTH LOGIN 334 VXNlcm5hbWU6 >>> QUtJQVhMNFVFTlZXQURTN1JCN1g= 334 UGFzc3dvcmQ6 >>> QlBPTkdGa3VuWnJRMlpyS0ZQcUFuMUQ1T1R1NEVjT3hrQmFxb3ppeHNQbmw= 235 Authentication successful. >>> MAIL FROM:250 Ok >>> RCPT TO: 250 Ok >>> DATA 354 End data with . >>> . 250 Ok 0109017023ce650b-f193f175-f425-417e-90ca-8eb3b6889beb-000000 >>> QUIT 221 Bye
渡辺 信秀(記事一覧)
2017年入社 / 地味な内容を丁寧に書きたい