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

我已经设置了亚马逊SES,validation了我的域名,并且已被批准为生产模式。 当外部电子邮件发送到我的域中的地址时,我的服务器将其转发回Gmail帐户,但转发被Amazon SES拒绝并出现错误

Email address is not verified 

例如,如果yahoo.com上的某个人通过“[email protected]”发送一封邮件给我,那么由于/ etc / aliases中的条目,邮件会立即转发到“[email protected]”,SES是拒绝电子邮件到gmail.com,即使“mydomain.com”是一个经过validation的域名。 当我在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服务器接受的电子邮件地址是“[email protected]”,但转发给gmail.com的邮件被Amazon SES拒绝。 但是电子邮件不在我服务器上的发送邮件队列中,它不在我服务器上的帐户的邮箱中,并且没有被弹回到原始发件人(在我上面的示例中的yahoo上)。 它去了哪里?

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

例如,您已经validation了您的域example.com 。 现在, [email protected]发送邮件到[email protected] 。 Postfix很乐意接受它,因为别名文件,postfix将把它转发到[email protected]

问题是,postfix在SMTP事务中使用[email protected]作为信封发件人 。 这是postfix的一个理想的和默认的行为。 目的是在GMAIL从[email protected]收到该电子邮件时不丢失发件人信息。 不幸的是,Amazon SES只允许将信封发件人域名作为example.com

从OP在评论中提到的线程 ,有一些解决scheme来改变信封发件人,所以它会通过亚马逊的SES限制。 一个可能的解决scheme是使用sender_canonical_maps 。 默认情况下,postfix将重写信封和标题中的发件人。 通过正确configurationsender_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] 

问题是您的原始发件人是未知的。 获取原始文件的一种方法是使用postfix作者build议的check_sender_access的前置操作。

/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设置可能会抑制退回消息,或者也许雅虎默默地拒绝它。