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 をクライアントなりサーバに設定するだけです。