初めてのSESを最速で送信確認まで行う方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

西澤です。sendmailやpostfixの構築を1から行うのは、前提知識やセキュリティ考慮が必要でなかなか敷居が高いです。ちょっとした通知メールを送りたいだけの要件の場合でも、マネージドサービスであるSESを利用することで、SMTPサーバとして簡単に利用することができます。その設定および確認手順を必要最低限のところに絞ってお伝えしたいと思います。

事前準備

準備と言っても以下のものを用意するだけです。サンドボックス環境で動作確認を行うだけであれば、これだけです。あっという間です。

  • SMTP認証用のユーザとパスワード
  • 送信用メールアドレスの用意とVerify

サンドボックス環境では、送信可能なメッセージ数や、Verifyされた宛先にしか送信ができない等の制限がありますのでご注意ください。本番利用する場合には、AWSサポートから送信制限の引き上げをリクエストしましょう。最速がテーマなので、今回はこの作業は行いません。

SMTP認証用のユーザとパスワードを用意する

SES APIを利用する(ses:SendRawEmail)のであれば、通常利用するIAMアクセスキーとシークレットアクセスキーのペアから操作が可能です。しかし、SMTPサーバとしてメーラーやツールから利用したい(ses:SendEmail)場合がほとんどだと思いますので、SMTP認証用のユーザとパスワードを用意しましょう。AWS Management ConsoleのSESの項目から、新規にIAMユーザを作成するのが簡単ですが、ses:SendRawEmail権限を有したアクセスキー/シークレットアクセスキーが既にあるなら、SES SMTP認証ユーザ/パスワードに変換することが可能です。

  • SMTPユーザ = アクセスキー(同じ)
  • SMTPパスワードシークレットアクセスキー = シークレットアクセスキーをHMAC-SHAで署名したもの

シークレットアクセスキーをSMTPパスワードに変換する方法については、公式ドキュメントではjavaのサンプルコードしかありませんが、pythonやrubyでも変換スクリプトを公開してくれている方が。ありがたく使わせていただき、無駄なIAMユーザは作らないようにしましょう。

送信用メールアドレスのVerify

SESのサンドボックス環境では、送信元アドレスも送信先アドレスも、Verifyされたドメインやメールアドレスのみに制限されます(本番移行後は送信先制限なし)。今回は最速で試すところまでが目標なので、利用するリージョンでメールアドレスだけVerifyしておきましょう。Verifyするメールアドレス宛のメールを受信できる準備が整っていれば5分もかかりません。具体的な手順は下記記事をご覧ください。

今回の作業では不要ですが、利用するドメイン単位でVerifyする場合には、対象ドメインのDNSレコード登録が必要になります。詳細は下記ドキュメントをご確認ください。今回は実施しません。

SESを利用したメール送信確認

もう準備ができてしまいました。メーラーがあればそれを利用してSMTPユーザ/パスワードを指定しても良いですが、送信確認を行うだけであれば、コマンドラインから確認する方が簡単です。

SMTPユーザ/パスワードをbase64エンコード

SMTP認証情報をbase64エンコードして整形しておきます。

$ SMTP_USER=AKIAxxxxxxxxxxxxxxxx
$ SMTP_PASSWORD=Aminxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ printf "%s\0%s\0%s" ${SMTP_USER} ${SMTP_USER} ${SMTP_PASSWORD} \
  | openssl base64 -e \
  | tr -d '\n'; echo
QUtJxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

コマンドラインからメール送信確認

まずは、base64エンコードした認証情報をテキストファイルに用意します。サンドボックス環境では、MAIL FROM,RCPT TOに指定するメールアドレスはVerify済である必要がありますが、サンドボックス外に移動が完了すれば、送信先(RCPT TO)には任意のアドレスを指定可能です。

$ cat mail.txt
EHLO localhost
AUTH PLAIN QUtJxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
MAIL FROM: nishizawa.tetsunori@classmethod.jp
RCPT TO: nishizawa.tetsunori@classmethod.jp
DATA
SUBJECT: TestMail

TEST MAIL from SES
.

QUIT

用意したテキストファイルの内容を、opensslコマンドに渡してメールを送信します。下記ではOregonリージョン(us-west-2)を利用していますが、メールアドレスをVerifyしたリージョンを指定してください。

$ cat mail.txt \
  | openssl s_client -starttls smtp -crlf -connect email-smtp.us-west-2.amazonaws.com:587
CONNECTED(00000003)
depth=2 C = US, O = "VeriSign, Inc.", OU = VeriSign Trust Network, OU = "(c) 2006 VeriSign, Inc. - For authorized use only", CN = VeriSign Class 3 Public Primary Certification Authority - G5
verify return:1
depth=1 C = US, O = Symantec Corporation, OU = Symantec Trust Network, CN = Symantec Class 3 Secure Server CA - G4
verify return:1
depth=0 C = US, ST = Washington, L = Seattle, O = "Amazon.com, Inc.", CN = email-smtp.us-west-2.amazonaws.com
verify return:1
---
Certificate chain
 0 s:/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=email-smtp.us-west-2.amazonaws.com
   i:/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
 1 s:/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
   i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFATCCA+mgAwIBAgIQHCm1NCsZXYw+i/K/sRSFNzANBgkqhkiG9w0BAQsFADB+
...(省略)
WDvAU15L+LURO80AeMDb7KHeN2uFFs4RwHpJ5LIf3liB/VgfFQ==
-----END CERTIFICATE-----
subject=/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=email-smtp.us-west-2.amazonaws.com
issuer=/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
---
No client certificate CA names sent
---
SSL handshake has read 3005 bytes and written 679 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 56A3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Session-ID-ctx: 
    Master-Key: D59Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1453551433
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
250 Ok
DONE

無事メール受信を確認できました!

ses_testmail

確認ができたらメールを送信したいツールから、SMTP認証情報を設定して利用しましょう。本番化する場合には、AWSサポートへの申請もお忘れなく。

まとめ

SESを触ったことが無い方向けに、最速で動作確認まで行う方法をご紹介してみました。AWSの便利なサービスをどんどんご紹介して、触ったことが無い方にもすぐに試していただけるような記事を書いていけたらいいなと思っておりますです。

  • KenkichiOkazaki

    opensslでCLIでメールを送信するのが大変参考になりました。ありがとうございます。
    ところで
    s/IAMAアクセスキー/IAMアクセスキー/
    でしょうか。。

  • Tetsunori Nishizawa

    ご指摘ありがとうございます!誤記を修正いたしました。