Amazon Linux 2上のPostfixで宛先ドメイン毎にリレー制御してみた

EC2上のPostfixにて宛先ドメイン毎のリレー制御を実施してみたいと思います。ここでは宛先ドメインがclassmethod.jpの場合、SendGridのSMTPサーバにリレーし、それ以外のドメインの場合は、EC2のPostfixから直接送信してみたいと思います。
2020.03.23

構成

以下のようなイメージです。

00

環境/前提

Route53設定

前提の環境に加え、迷惑メール対策としてexample.jpのHosted ZoneにSPFレコード(TXTレコード)を追加しました。Valueは"v=spf1 a:test.example.jp -all"を設定しています。

以下に従い、SPFレコードの代わりにTXTレコードにしています。

Postfix設定ファイル編集

/etc/postfix/main.cf

SendGridのSMTPサーバは認証が必要ですので、SMTPクライアントとして以下設定を行います。前提の環境で設定しているsmtpd_sasl_auth_enableと、今回設定するsmtp_sasl_auth_enableは別物なのでご注意ください。

smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = may
transport_maps = hash:/etc/postfix/transport
smtp_sasl_password_maps = hash:/etc/postfix/relay_password

/etc/postfix/transport

宛先ドメイン毎のリレー先設定を行います。ここでは宛先ドメインがclassmethod.jpの場合にSendGridにリレーし、その他の宛先についてはリレーせずに直接送信する設定です。

classmethod.jp       smtp:[smtp.sendgrid.net]:587
*                       :

/etc/postfix/relay_password

リレー先の認証情報を記載するファイルを作成します。ここではSMTP認証が必要となるSendGridのSMTP認証情報を設定します。

[smtp.sendgrid.net]:587 apikey:SendGridのAPIキー

SendGridのAPIキーの発行など、詳細については以下を確認ください。

設定ファイルのハッシュ化

リレー関連で更新した設定ファイルをハッシュ化します。

$ sudo postmap /etc/postfix/transport
$ sudo postmap /etc/postfix/relay_password

Postfixの再起動

Postfixを再起動して設定を反映します。

$ sudo service postfix restart
Redirecting to /bin/systemctl restart postfix.service
$ sudo service postfix status
Redirecting to /bin/systemctl status postfix.service
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2020-03-23 08:53:23 UTC; 4s ago

(省略)

動作確認

ここではmailxコマンドを利用して動作を確認してみたいと思います。

パッケージインストール

必要なパッケージをインストールします。

$ sudo yum install mailx

リレー確認

宛先ドメインがclassmethod.jpのケースです。マスクしていますが以下のようなコマンドでEC2(MTAサーバ)からメールを送信しました。

echo "This is a test mail"| mail -s "Test Mail" -r test@example.jp xx@classmethod.jp

SendGridを通して送信が行われたか、SendGridのコンソール「Activity」を確認してみます。イベントがDeliveredになっており、受信側メールサーバに送付されていそうです。

SendGrid経由でメールが送信されていることを確認できました。

直接送信

宛先ドメインにclassmethod.jp以外を指定するケースです。マスクしていますが以下のようなコマンドでEC2(MTAサーバ)からメールを送信しました。

echo "This is a test mail"| mail -s "Test Mail" -r test@example.jp xx@gmail.com

SendGridを経由せずメールが送信されていることを確認できました。

さいごに

Postfixにて宛先ドメイン毎のリレー制御を実施する方法をご紹介しました。EC2から直接メールを送信する場合、25ポートの解除申請や、SPFレコード(TXTレコード)等、迷惑メール判定されないよう意識することが多くあると改めて実感しました。直接送信する特別な理由がなければ、SendGrid等から送信することで、迷惑メール判定との闘いは減るのではないでしょうか。

参考