注意: この記事はLLMによって英語から翻訳されたものです。正確性については保証いたしかねますので、あらかじめご了承ください。英語の原文はこちら。
自分でメールサーバーを管理したことがある方なら、SMTPを正しく運用することがいかに大変かご存知でしょう。設定の複雑さに加えて、IPアドレスがブラックリストに登録されたり、大手メールプロバイダーにメールを拒否されたりと、多くの問題が発生する可能性があります。
サーバーから手間やメンテナンスをあまりかけずにメールを送信できるようにする簡単な方法は、PostfixをAmazon SES(Simple Email Service)経由でメールをルーティングするように設定することです。この記事では、両方のシステムの設定方法を見ていきます。
SESの設定#
最初のステップはAmazon SESの設定です。SMTPサーバーのアドレスと認証情報が必要になるためです。また、SMTPユーザーに必要以上の権限を与えないよう、適切なパーミッションも設定します。
IDの作成#
まず、メール送信に使用するドメインを新しいSES IDとして追加します。メールアドレスのIDだけを追加することも可能ですが、その場合AmazonはDKIMの設定を提供しないため、メールの到達性に良くありません。
- SESダッシュボードに移動し、
Verified IdentitiesをクリックしてからCreate Identityをクリックします(地域が重要な場合は、画面右上のリージョンを確認してください) Identity TypeとしてDomainを選択し、メール送信に使用するドメインを入力しますAdvanced DKIM SettingsでEasy DKIM、RSA_2048_BITを選択し、ドメインがRoute53に登録されていない場合はPublish DNS records to Route53を無効にします- 以下のスクリーンショットと同じ画面が表示されるはずです。提供されたCNAMEでDNSレコードを編集してください。また、配信性を向上させるためにSPF設定に
include:amazonses.comを追加することを忘れないでください(SPFとDKIMに関する以前の記事を参照してください)

すべての手順が完了すれば、このドメインを使用してメールを送信できるようになります。
SMTP認証情報、IAMユーザー、パーミッション#
次に、SMTP認証情報を作成しましょう。Amazon SES -> SMTP Settingsに移動し、提供されているSMTP endpointをメモします。次にCreate SMTP Credentialsをクリックします。作成するIAMユーザーの名前を選ぶよう求められます。ses-noreply-test-donainのように、ユーザーの用途がわかる名前を選んでください。その後、SMTP認証情報を保存します。
次に、新しいIAMユーザーが自分のドメインからのみメールを送信できるようにします(デフォルトでは、IAMユーザーにはアカウント内の任意のIDを使用してメールを送信する権限が付与されています)。IAMユーザーの設定で、以下のようなインラインポリシーが表示されるはずです:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ses:SendRawEmail",
"Resource": "*"
}
]
}*をAmazon Resource Name (ARN)に置き換えます。ARNはAmazon SES/Verified identitiesのドメインの詳細で確認できます。arn:aws:ses:us-east-1:123455:identity/test.domain.comのような形式になります。
これで、IAMユーザーは新しく追加したドメインのみでメール送信の権限を持つようになりました。さらに進めて、特定のアドレスからのみメール送信を許可することもできます。SESのドメインのVerified Identitiesパネルで、Authorizationタブに移動し、ポリシージェネレーターを使用します。そこから、例えばIAMユーザーのARNに対してses:FromAddressが特定のアドレスとStringNotEqualsの場合にSendRawEmailを拒否するように設定できます。
なお、ドメインIDのポリシージェネレーターを使用する代わりに、メールIDを作成し、そのIDのARNをIAMユーザーのアクセスポリシーで許可リソースとして設定することも可能です。
Postfixの設定#
AWS側の準備がすべて整ったので、サーバーにSSH接続して必要な設定を行いましょう。以下はDebian系システムでの手順です。また、現時点でPostfixを他の用途に使用していないことを前提としています。使用している場合、以下の変更で設定が壊れる可能性があります。
sendmailがシステムにインストールされていないことを確認した後、必要なパッケージをすべてインストールしましょう。
sudo apt install postfix libsasl2-modules次に、以下のコマンド(rootとして実行)で必要な設定を追加します。email-smtp.us-east-1.amazonaws.com、SMTPUSERNAME、SMTPPASSWORDを前のパートでSESから提供された値に置き換える必要があります。
postconf -e "relayhost = [email-smtp.us-east-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"
# We configure the credentials, compile the credentials database, and give correct permissions
echo "[email-smtp.us-east-1.amazonaws.com]:587 SMTPUSERNAME:SMTPPASSWORD" > /etc/postfix/sasl_passwd
postmap hash:/etc/postfix/sasl_passwd
chown root: /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
# So that Postfix can validate Amazon SES server's certificate
postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt'
systemctl restart postfixこの設定中に以下の問題が発生する可能性があります:
/etc/postfix/main.cfが存在しない ->cp /etc/postfix/main.cf.proto /etc/postfix/main.cfpostmap: fatal: bad string length 0 < 1: setgid_group =->/etc/postfix/main.cfのsetgid_group行をコメントアウトする
すべての設定が完了したら、メールが正しく送信されることをテストできます:
echo "Test Message"| mail -s "Subject" -a "From:me@test.domain.tld" recipient@domain.tldメールが配信されない場合は、/var/log/mail.logを確認してください。AAAAレコードが見つからないという問題がある場合は、main.cf設定ファイルにinet_protocols = ipv4を追加できます。
複数のリレーとローカルメール配信の問題#
以下の設定により、複数のドメインを異なるリレー経由でルーティングできます。
前の手順に従った場合、システムがローカルメール(例えば、cronの問題発生時のroot@myhostname.localdomain宛て)を配信できなくなっている可能性もあります。以下の設定でこの問題も解決できます。
設定を少し編集して問題を修正しましょう。main.cf設定ファイルで、relayhost =で始まる行をコメントアウトし、以下の2行を追加します:
sender_dependent_relayhost_maps = hash:/etc/postfix/relayhost_map
smtp_sender_dependent_authentication = yes次に、relayhost_mapを編集し、(main.cfでコメントアウトした)以下の情報を追加します。これにより、Postfixはどのドメインをリレー経由でルーティングすべきかを判断できるようになります。
@my-domain.tld [email-smtp.us-east-1.amazonaws.com]:587
# Was not in the previous file, but we can do that
@my-domain2.tld [email-smtp.us-east-1.amazonaws.com]:587その後、以下のコマンドを実行してデータベースを更新すれば、問題は解決するはずです。
# We update the database with the previous configuration
postmap hash:/etc/postfix/relayhost_map
# In case where the logs complain about /etc/aliases.db not being present
newaliases
# All done
systemctl restart postfixリソース#
クレジット#
- カバー写真: Daria Nepriakhina 🇺🇦(Unsplash)