AWS SES:Postfix 中继出现“电子邮件地址未经验证”错误

AWS SES:Postfix 中继出现“电子邮件地址未经验证”错误

我已经设置了 Amazon SES、验证了我的域,并且已获准使用生产模式。当外部世界的电子邮件发送到我的域中的地址时,我的服务器会将其转发回 Gmail 账户,但 Amazon SES 拒绝了该转发并显示错误

Email address is not verified

例如,如果 yahoo.com 的某人向我发送了一封电子邮件至“[电子邮件保护]“,然后该电子邮件立即转发至”[电子邮件保护]“由于 /etc/aliases 中的条目,SES 拒绝向 gmail.com 发送邮件,即使“mydomain.com”是经过验证的域。当我在 Postfix 中打开与 gmail.com 的连接详细日志记录时,该邮件似乎来自 yahoo.com 并发送到 gmail.com——这两个都不是我的域。它是否在抱怨该邮件最初来自 yahoo.com?如果是这样,那么当我将邮件从外部域通过我的域转发到另一个 (gmail) 域时,我是否无法使用 SES?

但是,如果我发送一封来自我的域的电子邮件并发送到 gmail 地址,它就可以正常工作。

/var/log/maillog以下是SES 服务器拒绝转发到 gmail.com 的行:

Apr 15 02:11:43 ip-10-194-190-140 postfix/smtp10191: 9013922528: to=<[email protected]>, orig_to=<[email protected]>, relay=email-smtp.us-east-1.amazonaws.comhttp://54.243.71.143:25, delay=0.32, delays=0.01/0/0.11/0.2, dsn=5.0.0, status=bounced (host email-smtp.us-east-1.amazonaws.comhttp://54.243.71.143 said: 554 Message rejected: Email address is not verified. (in reply to end of DATA command))`

这是我添加到 /etc/postfix/main.cf 中的行:

relayhost = email-smtp.us-east-1.amazonaws.com:25
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
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

后续问题:

发生此问题时,电子邮件最终会发送到哪里?我的 Postfix 服务器正在接受该电子邮件,因为“[电子邮件保护]“,但转发到 gmail.com 被 Amazon SES 拒绝。但是该电子邮件不在我的服务器上的外发邮件队列中,也不在我的服务器上我的帐户的邮箱中,并且还没有被退回给原始发件人(在我上面的例子中是 yahoo)。它去哪儿了?

答案1

为什么 Amazon SES 在发送电子邮件时会抛出该错误?

例如,您已验证您的域名 example.com。 现在,[电子邮件保护]发送电子邮件至[电子邮件保护]。Postfix 很乐意接受它,并且由于别名文件,postfix 会将其转发到[电子邮件保护]

问题是,postfix 使用[电子邮件保护]作为信封发件人在 SMTP 事务中。这是 Postfix 的期望和默认行为。目的是当 GMAIL 从以下位置收到该电子邮件时不会丢失发件人信息[电子邮件保护]。不幸的是,Amazon SES 仅允许信封发件人域作为示例.com

解决方案

线程楼主在评论中提到,有一些解决方案可以改变信封发件人,以便它能够通过 Amazon SES 限制。一种可能的解决方案是使用sender_canonical_maps默认情况下,postfix 会重写信封和标题中的发件人。正确配置sender_canonical_classes,postfix 只会重写信封一个。

/etc/postfix/main.cf,添加

sender_canonical_maps = regexp:/etc/postfix/sender_canonical
sender_canonical_classes = envelope_sender

/etc/postfix/sender_canonical,添加

/.*/    [email protected]

问题是您的原始发件人不明。获取原始发件人的一种方法是使用 check_sender_access 的前置操作按照 Postfix 作者的建议。

/etc/postfix/main.cf,添加

smtpd_data_restrictions = check_sender_access pcre:/etc/postfix/sender_access

/etc/postfix/sender_access,添加

/(.*)/  prepend X-Envelope-From: <$1>

这些设置将添加X-Envelope-From包含原始发件人电子邮件地址的标题。

当这个问题发生时,电子邮件最终会到哪里?它去哪里了?

默认情况下,postfix 会将此邮件退回给原始发件人(Yahoo 地址)。您可以在被拒绝后通过查看 mail.log 来跟踪它。当然,某些 postfix 设置可能会抑制退回邮件,或者 Yahoo 可能会默默地拒绝它。

相关内容