Amazon EC2でAmazon SES + Postfixを使ってメールを送信してみた

Amazon EC2でAmazon SES + Postfixを使ってメールを送信してみた

Amazon EC2上でAmazon SESとPostfixを使用し、メールを送信する環境を構築してみました。
2026.07.15

こんにちは、クラスメソッドのキム・ジェウク(Kim Jaewook)です。

今回は、Amazon EC2上でAmazon SESとPostfixを使用し、メールを送信する環境を構築してみました。本記事では、その手順を紹介します。

準備

今回の構成は以下のとおりです。

EC2をPrivate Subnetに配置し、AWS Systems Manager(SSM)を利用して接続します。また、EC2にPostfixをインストール・設定し、Amazon SES経由でメールを送信します。

image1

今回使用した環境は以下のとおりです。

  • EC2:Amazon Linux 2023
  • セキュリティグループ
    • インバウンド:なし
    • アウトバウンド:デフォルト(すべて許可)

次に、Amazon SESで、SMTP認証情報を作成します。PostfixからSMTP経由でメールを送信するため、この認証情報が必要になります。

image2

項目
Host email-smtp.ap-northeast-1.amazonaws.com
Port 587
TLS STARTTLS (encrypt)
SES SMTPユーザー名 作成後に確認可能
SES SMTPパスワード 作成時にのみ確認可能

続いて、Amazon SESのIDも作成します。今回は、IDタイプとして、ドメインを選択して作成しました。

image3

実行手順

それでは、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の設定

relayhostsmtp_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@送信者 発信者

想定どおり、メールが正常に届きました。

image4

最後に

今回は、Amazon EC2上にPostfixを構築し、Amazon SESをSMTPリレーとして利用してメールを送信する環境を作成しました。

EC2をPrivate Subnetに配置した構成でも、Amazon SESのSMTPエンドポイントを利用することで、外部メールサービスを経由したメール送信が可能です。

また、Postfixの設定ではSMTP認証情報やTLS設定など、いくつか確認ポイントがありましたが、設定内容を正しく確認することで問題なくメール送信まで行うことができました。

Amazon SESは大量メール送信だけではなく、アプリケーションやサーバーからの通知メール送信基盤としても利用できます。今回のような構成は、メール送信機能を必要とするシステムを構築する際の一つの選択肢になると思います。

最後までご覧いただき、ありがとうございました。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事