SESのSMTPインターフェースでメール送信

記事タイトルとURLをコピーする

EC2インスタンスからメールを送信したいという要望は時々出てきます。 AWSのメール送信サービスには、SES(Simple Email Service)があります。 SESでメール送信するには、「1.AWSのAPIを利用する」「2.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

渡辺 信秀 (記事一覧)