SESをSMTPを利用して送信したい
SESを利用するならばboto3を利用するのが一番簡単かと思いますが,
ローカル開発環境ではMailHog等の開発用SMTPサーバを用いて動作確認を行なっている環境で
汎用的なsmtplibをテスト・本番で利用したいというのがそもそものはじまり
SMTPを利用するには
通常のsmtp同様以下のような形で行えます
email.py
def send_mail(self, host, user, password, msg):
smtp_con = smtplib.SMTP_SSL(host=host)
smtp_con.ehlo()
smtp_con.login(user, password)
result = smtp_con.send_message(msg=msg)
smtp_con.close()
が、ここで渡すpasswordが曲者
以下のリンクを見るとわかりますが
通常boto3などのAPI経由であれば、パスワードにはIAMのAWS_SECRET_ACCESS_KEY
を用いるが
SMTP認証情報にはAWS_SECRET_ACCESS_KEY を Amazon SES SMTPパスワードに変換したもの
を利用する必要があります
Amazon SES SMTP 認証情報の取得
新たにSMTP認証情報を持つIAMユーザを作る方法もありますが
今回はAWS_SECRET_ACCESS_KEY->SMTPCredentials
の変換を行います
Amazon SES SMTP Credentialsを python3 で生成する
実際に利用したコードがこちら
keyにAWS_SECRET_ACCESS_KEYを渡してあげればSMTP認証に利用できるパスワードが返却される
aws_ses_hash.py
def hash_smtp_pass_from_secret_key(self, key):
message = "SendRawEmail"
sig_bytes = bytearray(b'\x02')
h = hmac.new(key.encode(), message.encode(), digestmod=hashlib.sha256)
digest = h.hexdigest()
sig_bytes.extend(bytearray.fromhex(digest))
return base64.b64encode(sig_bytes).decode()
ちなみにpython2であれば以下が参考になります
■[tips][aws][python][ruby] Amazon SES SMTP Credentialsをpythonやrubyで作ってみる