EC2のPostfixからAmazon SES経由でメール送信する設定

  • AWS
  • SES
  • Postfix

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

EC2上のPostfixから、直接送信ではなくAmazon SESのSMTPエンドポイントへリレーする設定をした。以下その手順。

構成

flowchart LR
    App[アプリ/OS] --> Postfix
    Postfix -->|SMTP 587 STARTTLS| SES[Amazon SES SMTPエンドポイント]
    SES --> Recipient[宛先メールサーバー]

Postfixは直接インターネットへ25番で送るのではなく、SESのSMTP認証情報を使って587番でリレーする形。

main.cfの変更

/etc/postfix/main.cf に以下を追加。

relayhost = [email-smtp.us-east-1.amazonaws.com]:587
smtp_tls_note_starttls_offer = yes
smtp_tls_security_level = encrypt
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_auth_enable = yes
smtp_use_tls = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

smtp_tls_CAfile のパスはディストリによって違う。Debian/Ubuntu系は /etc/ssl/certs/ca-bundle.crt だが、Amazon Linux系だと /etc/pki/tls/certs/ca-bundle.crt になっているはず(未確認、要環境確認)。

SASL認証情報ファイルの作成

smtp_sasl_password_maps で指定したパスと、実際に作るファイルのパスは一致させる必要がある。今回は /etc/postfix/sasl_passwd で統一した。

echo "[email-smtp.us-east-1.amazonaws.com]:587 SMTP-USERNAME:SMTP-PASSWORD" > /etc/postfix/sasl_passwd

中身にSMTP認証情報が平文で入るので、パーミッションは絞っておく。

chmod 600 /etc/postfix/sasl_passwd

ハッシュDBの生成

postmap hash:/etc/postfix/sasl_passwd

これで /etc/postfix/sasl_passwd.db が生成される。main.cf 側の hash: の指定と実ファイル名がズレていると、ここまで手順通りに進めても認証で落ちるので注意。

master.cfの変更

/etc/postfix/master.cf の、実際にメール送信で使うエントリ(smtp もしくは submission)の下にある smtp_fallback_relay= のコメントアウトを外す。

# -o smtp_fallback_relay=
-o smtp_fallback_relay=

どのエントリの下かはmaster.cfの構成次第なので、複数エントリがある場合はどこに入れたか記録しておいた方がいい。

反映

設定ファイルを変更したら、postmapの再実行とpostfixのreloadを忘れずに。

postmap hash:/etc/postfix/sasl_passwd
systemctl reload postfix