メインコンテンツへスキップ
  1. 記事/

PostfixでAmazon SES経由のメール送信を設定する方法

·2 分
Ixonae
著者
Ixonae
目次

注意: この記事は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 SettingsEasy DKIMRSA_2048_BITを選択し、ドメインがRoute53に登録されていない場合はPublish DNS records to Route53を無効にします
  • 以下のスクリーンショットと同じ画面が表示されるはずです。提供されたCNAMEでDNSレコードを編集してください。また、配信性を向上させるためにSPF設定にinclude:amazonses.comを追加することを忘れないでください(SPFとDKIMに関する以前の記事を参照してください)
Amazon SES -> Configuration: Verified Identities
Amazon SES -> Configuration: Verified Identities -> test.ixonae.com

すべての手順が完了すれば、このドメインを使用してメールを送信できるようになります。

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.comSMTPUSERNAMESMTPPASSWORDを前のパートで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.cf
  • postmap: fatal: bad string length 0 < 1: setgid_group = -> /etc/postfix/main.cfsetgid_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

リソース
#

クレジット
#