Base64 でエンコードする度に、文字列はどんどんと大きくなっていくのでありました。
SES は API も呼べますが SMTP インターフェースも備えています。認証は AUTH LOGIN や AUTH PLAIN が使えます。その際の Username と Password の取得方法が以下のページ。
Obtaining Your Amazon SES SMTP Credentials - Amazon Simple Email Service
方法が 2 通り紹介されていて、1 つは Management Console から、もう一つは Secret Access Key を使います。で、後者がちょっと気になるわけですが、
The following pseudocode shows the algorithm that converts an AWS Secret Access Key to an Amazon SES SMTP password.
key = AWS Secret Access Key; message = “SendRawEmail”; versionInBytes = 0x02; signatureInBytes = HmacSha256(message, key); signatureAndVer = Concatenate(versionInBytes, signatureInBytes); smtpPassword = Base64(signatureAndVer);
pseudocode! その下に Java の場合もあるんですが手元の環境に javac が入ってなくてダウンロードするのが面倒臭かったので、Python でやってみました。
import base64 import hashlib import hmac import sys key = sys.argv[1].encode() message = b"SendRawEmail" versionInBytes = b"\x02" signatureInBytes = hmac.new(key, message, hashlib.sha256).digest() signatureAndVer = versionInBytes + signatureInBytes smtpPassword = base64.b64encode(signatureAndVer).decode() print(smtpPassword)
これで、以下のように SMTP Password を吐き出してくれます。
$ python SMTPPassword.py 'fs+ZTtZ9WcqCzBVTql/3Fg0/icXhO01zi3683llk' ArvpA+Ub71jSDRTQWbMDuNrJ2f3jLXk7TeBvAFe9gT7x
これがちゃんと動くか確認したいので IAM Policy を適切に設定した後に
import base64 import sys username = sys.argv[1].encode() password = sys.argv[2].encode() plain = base64.b64encode(b"\x00" + username + b"\x00" + password) print(plain.decode())
ってのをまた用意しまして
$ openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-east-1.amazonaws.com:25 2> /dev/null HELO localhost 250 email-smtp.amazonaws.com AUTH PLAIN AEFLSUFKRVpaQ0lPUEtaUTZTU1BBAEFydnBBK1ViNzFqU0RSVFFXYk1EdU5ySjJmM2pMWGs3VGVCdkFGZTlnVDd4 235 Authentication successful. QUIT 221 Bye
わ〜い、successful したよ!!
あとはこの SMTP Password をクライアントなりサーバに設定するだけです。