2020/07/06

AWS SESを使ってEメールを送信してみた

awspythonemail

概要

AWSを使って、システムの構築をしています。メール送信サービスにSESを使うことになりました。
システムからEメールを送信する手順を忘れないようにメモしておきます。

基本的には、AWS SES 開発者ガイドを参考にしながら作業を実施しました。

実施事項

手順の確認

  1. AWSにサインアップ(当たり前)
  2. ドメインの確認(email送信元ドメインの確認)(このタイミングで、SPFレコードの登録も行います)
  3. Eメールアドレスの確認
  • テスト期間中(sandbox利用中)はメールアドレスの所有が確認できるメールアドレスに対してしか送信できないような仕様になっている
    • テスト期間中のspamメール送信を不正でいる(誰彼構わず送信できなくしている)
  1. プログラムから送信をテスト
  2. バウンスの考慮(今回は実施せず)
  3. サンドボックスの外への移動
  • メールアドレスの所有が確認できないものに対しても送信できるようにする

ドメインの確認

  • SES Home > Domainsへ移動して、fromに指定したいメールアドレスのドメインを追加する。
  • 追加すべきTXTレコードが表示されるので、使用しているDNSサービスを使って、TXTレコードを追加します。
  • 時間が経つとそのドメインが承認(Verify)されます。
  • このタイミングで、SPFレコードも追加しておきます
"v=spf1 include:amazonses.com ~all"

プログラムからの送信を実装

基本的には、AWS SDKを利用してメールを送信するのが良さそうなのですが、(セキュリティ的にAWS IAMの恩恵を享受できる)
SMTPを利用していメールを送信できた方が、色んなサービスへの変更にコードが対応できるので、今回はAWS SDKは使わずに送信ができるように対応しました。

SES SMTP認証情報を取得する

  • SES Home > SMTP Settings > Create My SMTP Credentialsから認証情報を作成します。
  • 認証情報を作成したら、その情報を使って、以下のように送信します。
    • tlsは絶対にTrueにする
    • portは587が良さそう(AWSコンソールから確認できます。)
    • hostは使っているregionのものを利用します(AWSコンソールから確認できます。)
import emails

message = emails.Message(
    subject="Emailの件名",
    html="HTMLメールの本文(HTML形式)",
    mail_from=("メール送信者の名前", "[email protected]"),
)
smtp_options = {
  "host": "email-smtp.your-region.amazonaws.com",
  "port": 587, # port should be 465 or 587
  "tls": True,
  "user": "認証情報で作成した Smtp Username",
  "password": "認証情報で作成した Smtp Password"
}
response = message.send(to=email_to, render=render_data, smtp=smtp_options)
logging.info(f"send email result: {response}")

emails.backend.SMTPResponse status_code=250 が返却されていれば、無事送信できています。

以上になります。