ドメインのメールを受け入れるPostfixMTAがインストールされたサーバー(以下、@ example.com)があります。特定の[email protected]から他のメールへの転送を設定する必要があります。例えば@ gmail.com。これは、SES経由のSMTPトランスポートを使用して実行する必要があります。
SES本番アクセスとログイン/パスワードのペアがあり、アクティブでIAM権限を持っていることを確認しました。 SESで特定のFrom:アドレスを確認しました。これらのSMTPユーザー名/パスワードを使用してPHPスクリプトからSES経由で直接メールを送信すると、すべて正常に機能します。これは、ログイン/パスワードのペアとFrom:が大丈夫。
次に、外部から送信されて転送される必要のある電子メールについて、From:を書き直す必要があります。たとえば、メールは@ gmail.com-> [email protected]から送信されます。エントリユーザーはvirtual_alias_mapsで設定されており、別の@ gmail.comにアクセスする必要があります。 From:ヘッダーを書き換えるために、次のsmtp_header_checks
が使用されます。
smtp_header_checks = pcre:/etc/postfix/header_checks
/etc/postfix/header_checks
の内容は次のとおりです。
/^From:(.*)/ REPLACE From: "$1" <[email protected]>
[email protected]はSESで確認されています。これは、SESを直接使用する、つまりヘッダーを書き換えないPHPスクリプトでテストするときに使用しているのと同じメールです。
@gmailから[email protected]に何かを送信すると、ログで何が起こっているかを次に示します。
Apr 8 15:04:05 ip-10-191-106-25 postfix/smtpd[32545]: connect from mail-wg0-f42.google.com[74.125.82.42]
Apr 8 15:04:06 ip-10-191-106-25 postfix/smtpd[32545]: 3252A2415D: client=mail-wg0-f42.google.com[74.125.82.42]
Apr 8 15:04:06 ip-10-191-106-25 postfix/cleanup[32550]: 3252A2415D: message-id=<CADLOpCq4ZFR5=xqTNxPO73-tVkF63urLt_9ueGBDrLSggy29MQ@mail.gmail.com>
Apr 8 15:04:06 ip-10-191-106-25 postfix/qmgr[32192]: 3252A2415D: from=<[email protected]>, size=1687, nrcpt=1 (queue active)
Apr 8 15:04:06 ip-10-191-106-25 postfix/smtpd[32545]: disconnect from mail-wg0-f42.google.com[74.125.82.42]
Apr 8 15:04:07 ip-10-191-106-25 postfix/smtp[32551]: 3252A2415D: replace: header From: "User" <[email protected]>: From: " "User" <[email protected]>" <[email protected]>
Apr 8 15:04:07 ip-10-191-106-25 postfix/smtp[32551]: 3252A2415D: to=<[email protected]>, orig_to=<[email protected]>, relay=email-smtp.us-west-2.amazonaws.com[54.149.142.243]:25, delay=1.3, delays=0.22/0.03/0.57/0.43, dsn=5.0.0, status=bounced (Host email-smtp.us-west-2.amazonaws.com[54.149.142.243] said: 554 Message rejected: Email address is not verified. (in reply to end of DATA command))
Apr 8 15:04:07 ip-10-191-106-25 postfix/cleanup[32550]: 7FD75243F8: message-id=<[email protected]>
Apr 8 15:04:07 ip-10-191-106-25 postfix/qmgr[32192]: 7FD75243F8: from=<>, size=3700, nrcpt=1 (queue active)
Apr 8 15:04:07 ip-10-191-106-25 postfix/bounce[32552]: 3252A2415D: sender non-delivery notification: 7FD75243F8
Apr 8 15:04:07 ip-10-191-106-25 postfix/qmgr[32192]: 3252A2415D: removed
Apr 8 15:04:08 ip-10-191-106-25 postfix/smtp[32551]: 7FD75243F8: to=<[email protected]>, relay=email-smtp.us-west-2.amazonaws.com[54.69.81.169]:25, delay=0.67, delays=0.01/0/0.59/0.07, dsn=5.0.0, status=bounced (Host email-smtp.us-west-2.amazonaws.com[54.69.81.169] said: 501 Invalid MAIL FROM address provided (in reply to MAIL FROM command))
Apr 8 15:04:08 ip-10-191-106-25 postfix/qmgr[32192]: 7FD75243F8: removed
これにより、From:ヘッダーが実際には書き直されていないことがわかります。ただし、次の行は次のとおりです。
Apr 8 15:04:07 ip-10-191-106-25 postfix/smtp[32551]: 3252A2415D: replace: header From: "User" <[email protected]>: From: " "User" <[email protected]>" <[email protected]>
実際にそうだったと私たちに伝えます。
AWSサーバーに送信する前に、書き換えられたメール本文全体を表示する必要があることに気付きましたが、デバッグ方法がわかりません。
Main.cfの内容は次のとおりです。
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = example.com, ip-10-191-106-25.ec2.internal, localhost.ec2.internal, localhost, domain2.example.com
relayhost = email-smtp.us-west-2.amazonaws.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
default_transport = smtp
relay_transport = relay
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
smtp_use_tls = yes
smtp_tls_security_level = encrypt
smtp_tls_note_starttls_offer = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_header_checks = pcre:/etc/postfix/header_checks
virtual_alias_maps = hash:/etc/postfix/virtual
sender_canonical_maps = hash:/etc/postfix/canonical
#debug_peer_list=email-smtp.us-west-2.amazonaws.com 127.0.0.1
#debug_peer_level=5
header_checks
の最初の目標は、元の送信者を保持し、Amazon SESの許可された送信者に置き換えることです。
上記のアプローチの問題は、From:ヘッダーが複数の引用符で囲まれているため、非標準になることです。
From: " "User" <[email protected]>" <[email protected]>
Daniel R. Tobiasは、彼の記事でこの問題について言及しています。 Dan's Mail Format Site |ヘッダー| From/To/CC/BCC
メールプログラムがメッセージに非標準のヘッダー行を表示するリスクを冒す可能性があるのは、Jesse "The Body" Ventura。ヘッダーに直接挿入すると、二重引用符で囲まれ、 "Jesse" The Body "Ventura"が取得されます。これは、実際には2つの引用符で囲まれた文字列に解析されます。 "Jesse"and "Ventura"、with目的が不確かな真ん中に座っている体。
したがって、この非標準ヘッダーを利用して、AmazonSESチェッカーをバイパスできます。
この問題を解決するための1つのアプローチは、上記の2つの目標を2つのheader_checks、header_checks
とsmtp_header_checks
に分割することです。最初のheader_checksは、元の送信者を別のカスタムヘッダー(たとえば、X-Original-From)に保持します。 2つ目は、From:ヘッダーを置き換えます。
#main.cf
header_checks = pcre:/etc/postfix/first_header_checks
smtp_header_checks = pcre:/etc/postfix/second_header_checks
#first_header_checks
/^From:(.*)/ PREPEND X-Original-From: $1
#second_header_checks
/^From:(.*)/ REPLACE From: <[email protected]>
このスキーマのため、X-Original-From:ヘッダーがすべての受信メールに追加されます。ただし、置換アクションは送信メールでのみ実行されます。
もう1つの方法は、pcreを使用して、元のFrom:ヘッダーの引用符を除外することです。残念ながら、今はいくつかのアイデアをテストする時間がありません。多分後で...私は他の回避策でこの答えを更新します。
上記の部分はまだ半旅です。 Amazon SESに合格するには、エンベロープの送信者アドレスも書き換える必要があります。
ラベルを含むアドレス(以下を参照)を除いて、「From」または「Return-Path」として使用する各メールアドレス(またはメールアドレスのドメイン)を確認する必要があります"メッセージのアドレス。アカウントがAmazon SESサンドボックスの外に出るまで、AmazonSESメールボックスシミュレーターによって提供される受信者を除くすべての受信者のEメールアドレスも確認する必要があります。
この記事 のエンベロープアドレスとメッセージヘッダーアドレスの違いを参照してください。
この同様のスレッドで送信者を書き換えるいくつかの手順を説明しました: AWS SES:「Eメールアドレスが確認されていません」エラーとPostfixリレー 。基本的に、このパラメータをmain.cf
に配置する必要があります
sender_canonical_maps = regexp:/etc/postfix/sender_canonical
sender_canonical_classes = envelope_sender
smtpd_data_restrictions = check_sender_access pcre:/etc/postfix/sender_access
/ etc/postfix/sender_canonicalに追加します
/.*/ [email protected]
/ etc/postfix/sender_accessに追加します
/(.*)/ prepend X-Envelope-MailFrom: <$1>
/etc/postfix/sender_access
は、元のエンベロープ送信者アドレスを保持するために使用されます。
このステップに続いて、サーバー内から顧客に電子メールを転送することができます->
sender_canonical_maps = regexp:/etc/postfix/sender_canonical
sender_canonical_classes = envelope_sender
smtpd_data_restrictions = check_sender_access pcre:/etc/postfix/sender_access
/etc/postfix/sender_canonical
に追加
/.*/ [email protected]
/etc/postfix/sender_access
に追加
/(.*)/ prepend X-Envelope-MailFrom: <$1>