初めてのSESを最速で送信確認まで行う方法
西澤です。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ユーザは作らないようにしましょう。
- Amazon SES SMTP 認証情報を取得する - Amazon Simple Email Service
- AWS SES Create SMTP Password With Python
- Amazon SES SMTP Credentialsをpythonやrubyで作ってみる - asakawajunyaの日記
送信用メールアドレスの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
無事メール受信を確認できました!
確認ができたらメールを送信したいツールから、SMTP認証情報を設定して利用しましょう。本番化する場合には、AWSサポートへの申請もお忘れなく。
まとめ
SESを触ったことが無い方向けに、最速で動作確認まで行う方法をご紹介してみました。AWSの便利なサービスをどんどんご紹介して、触ったことが無い方にもすぐに試していただけるような記事を書いていけたらいいなと思っておりますです。