Amazon EC2でAmazon SES + Postfixを使ってメールを送信してみた
こんにちは、クラスメソッドのキム・ジェウク(Kim Jaewook)です。
今回は、Amazon EC2上でAmazon SESとPostfixを使用し、メールを送信する環境を構築してみました。本記事では、その手順を紹介します。
準備
今回の構成は以下のとおりです。
EC2をPrivate Subnetに配置し、AWS Systems Manager(SSM)を利用して接続します。また、EC2にPostfixをインストール・設定し、Amazon SES経由でメールを送信します。

今回使用した環境は以下のとおりです。
- EC2:Amazon Linux 2023
- セキュリティグループ
- インバウンド:なし
- アウトバウンド:デフォルト(すべて許可)
次に、Amazon SESで、SMTP認証情報を作成します。PostfixからSMTP経由でメールを送信するため、この認証情報が必要になります。

| 項目 | 値 |
|---|---|
| Host | email-smtp.ap-northeast-1.amazonaws.com |
| Port | 587 |
| TLS | STARTTLS (encrypt) |
| SES SMTPユーザー名 | 作成後に確認可能 |
| SES SMTPパスワード | 作成時にのみ確認可能 |
続いて、Amazon SESのIDも作成します。今回は、IDタイプとして、ドメインを選択して作成しました。

実行手順
それでは、EC2に接続し、Postfixのインストールから設定、メール送信までの手順を順番に確認していきます。
Postfixのインストール
まずは、必要なパッケージをインストールします。
sudo dnf install -y postfix cyrus-sasl-plain mailx
インストールされる主なパッケージは以下のとおりです。
- Postfix 3.7.2
- mailx 12.5
- cyrus-sasl-plain
- 依存パッケージ(libicuなど)
インストールが正常に完了すると、Complete! と表示されます。
SES SMTP認証情報ファイルの作成
準備段階で作成したSMTP認証情報を設定します。
sudo vi /etc/postfix/sasl_passwd
[email-smtp.ap-northeast-1.amazonaws.com]:587 SES_SMTPユーザー名:SES_SMTPパスワード
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
実行時にエラーが表示されなければ問題ありません。
main.cfの設定
relayhost、smtp_sasl_*、smtp_tls_security_level = encrypt などの設定を追加します。
sudo vi /etc/postfix/main.cf
# ファイルの末尾に追加
relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_tls_note_starttls_offered = yes
header_size_limit = 4096000
Postfixの再起動
systemctl status postfix の実行結果で、Active: active (running) と表示されれば正常に起動しています。
sudo systemctl restart postfix
sudo systemctl enable postfix
sudo systemctl status postfix
ポートの疎通確認
実行結果に Connected to xx.xxx.xxx.xxx:587 と表示されれば、Amazon SESの587ポートへ正常に接続できています。
sudo dnf install -y nc
nc -zv email-smtp.ap-northeast-1.amazonaws.com 587
テストメール送信
設定が完了したら、テストメールを送信してみます。
echo "This is a test body." | mail -s "SES Postfix Test" -r no-reply@送信者 発信者
メールを送信すると、以下のような警告メッセージが表示されました。
send-mail: warning: ... line 753: overriding earlier entry: smtp_tls_security_level=may
postdrop: warning: ... line 753: overriding earlier entry: smtp_tls_security_level=may
smtp_tls_security_level が重複して設定されているようなので、確認してみます。
sudo grep -n "smtp_tls_security_level" /etc/postfix/main.cf
745:smtp_tls_security_level = may ← デフォルト設定
753:smtp_tls_security_level = encrypt ← 追加した設定
デフォルト設定を削除します。
sudo sed -i '745d' /etc/postfix/main.cf
sudo grep -n "smtp_tls_security_level" /etc/postfix/main.cf
752:smtp_tls_security_level = encrypt
最後に、Postfixを再起動し、設定内容に問題がないことを確認します。
sudo systemctl restart postfix
sudo postfix check
再起動が完了したら、改めてメールを送信してみます。
echo "This is a test body." | mail -s "SES Postfix Test" -r no-reply@送信者 発信者
想定どおり、メールが正常に届きました。

最後に
今回は、Amazon EC2上にPostfixを構築し、Amazon SESをSMTPリレーとして利用してメールを送信する環境を作成しました。
EC2をPrivate Subnetに配置した構成でも、Amazon SESのSMTPエンドポイントを利用することで、外部メールサービスを経由したメール送信が可能です。
また、Postfixの設定ではSMTP認証情報やTLS設定など、いくつか確認ポイントがありましたが、設定内容を正しく確認することで問題なくメール送信まで行うことができました。
Amazon SESは大量メール送信だけではなく、アプリケーションやサーバーからの通知メール送信基盤としても利用できます。今回のような構成は、メール送信機能を必要とするシステムを構築する際の一つの選択肢になると思います。
最後までご覧いただき、ありがとうございました。







