kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

Amazon SESとpostfixの連携

個別でメールサーバーを作るのは個人的に好ましくないと思っていたため、Amazon SESのようなサービスを利用したサーバーの依存がない構成を作りたいと思っていました。

個別のメールサーバーを作る場合のデメリットとして以下の内容があると思っています。

  • IPの登録の問題
  • サーバーの並列化の問題

メールを送信するサーバーを専用で建てることが多いイメージですが、構成を変更する際にネックになる場合があり、自由度がほしいと思っていました。

postfixとAmazonSESの連携ができることを最近知り、実践してみました。

docs.aws.amazon.com

SESでのドメイン登録

kazu22002.hatenablog.com

docs.aws.amazon.com

ドメインの登録とテストメールまでできることを確認できればこの作業は完了です。

postfixの設定

サーバーにpostfixをインストールし、SESへの設定を手順通りに実行していきます。

  1. postfixのmain.cfを設定
  2. sesのSMTP Credentials作成
  3. postfixにてsasl_passwdを設定
  4. CA証明書設定
  5. postfix再起動
  6. testメール送信

東京のリージョンを設定する場合の設定です。

sudo postconf -e "relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587" \
"smtp_sasl_auth_enable = yes" \
"smtp_sasl_security_options = noanonymous" \
"smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" \
"smtp_use_tls = yes" \
"smtp_tls_security_level = encrypt" \
"smtp_tls_note_starttls_offer = yes"

/etc/postfix/master.cfに内容が追加されることを確認

awsGUIより、SESのSMTP Credentialsを作成

f:id:kazu22002:20210206054627p:plain

f:id:kazu22002:20210206054637p:plain

作成より取得できたユーザー:パスワード情報を保存します。

touch /etc/postfix/sasl_passwd
vi sasl_passwd

「SMTPUSERNAME:SMTPPASSWORD」の部分に先ほど取得したSMTP Credentialsを設定します。

[email-smtp.ap-northeast-1.amazonaws.com]:587 SMTPUSERNAME:SMTPPASSWORD
sudo postmap hash:/etc/postfix/sasl_passwd

CA証明書の設定

sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'

postfixの再起動( amazon linux2 )

sudo systemctl restart postfix

テストメール送信 ( 適宜内容を変更 )

sendmail -f sender@example.com recipient@example.com
From: Sender Name <sender@example.com>
Subject: Amazon SES Test                
This message was sent using Amazon SES.                
.

メールが送信されていることを確認できれば完了です。

懸念点

SMTP Credentialsで作成したIAMユーザーがありますが、サーバーからの検証はできますが、ドメインごとにIAMの制限ができるのかどうか気になっています。

設定さえできてしまえば、VPNで分離しているはずのサーバーからでもSESからメールが送信できてしまうと思っています。

できれば制限を強くしてIAMとドメインを制限したいけど、どうなんだろう。

正直メール周りのサーバー知識や運用知識が乏しく、問題となる設定や良い設定があまりわかっていない状態です。

PHP等のコードから直接SESの実行も考えましたが、postfixとSESの組み合わせで機能として疎結合になったと思っています。

運用して経過をみたいと思います。