我向Mailgun支持团队询问了这个问题,但没有得到任何有用的答案。然而,解决方案实际上在他们的文档中:
注意:如果您将邮件转发到另一个电子邮件地址,则应通过编辑控制面板中的域设置来禁用点击跟踪、打开跟踪和退订功能。如果启用这些功能,则Mailgun在转发之前修改每个消息的内容,从而使DKIM签名无效。如果消息来自发布DMARC策略(如Yahoo!Mail)的域,则该消息将被转发目标拒绝为垃圾邮件。
https://documentation.mailgun.com/en/latest/user_manual.html#routes
所以,我关闭了主域名上的所有功能,该主域名用于接收邮件,这解决了DMARC的反弹问题。如果您想使用这些功能中的任何一个,您需要设置一个用于发送邮件的子域名。
在我的情况下,这似乎只是由于来自信誉良好的发件人的无效DKIM签名,尽管转发器没有修改消息。
如果没有中间转发器,SPF可能已经通过并允许电子邮件通过,但由于SPF也不会通过(因为您不是经过身份验证的发件人),DMARC告诉接收者进行硬拒绝,然后您的转发器可能会收到错误,例如来自Gmail的以下错误:
5.7.1 来自example.com的未经身份验证的电子邮件由于域的DMARC策略而不被接受。
如果这是合法邮件,请联系example.com域的管理员。
请访问https://support.google.com/mail/answer/2451690了解DMARC计划。
- gsmtp
关键短语在于未经身份验证的电子邮件,意味着没有有效签名的电子邮件。另一方面,经过身份验证的电子邮件可以从您的域中允许通过。
您可以按照以下步骤验证问题是否为无效的DKIM签名:$ pip install dkimpy # dkimpy supercedes pydkim
$ dkimpy -v < message.eml
Traceback (most recent call last):
File "/usr/sbin/dkimverify", line 10, in <module>
sys.exit(main())
File "/usr/lib/python/site-packages/dkim/dkimverify.py", line 41, in main
res = d.verify()
File "/usr/lib/python/site-packages/dkim/__init__.py", line 869, in verify
return self.verify_sig(sig, include_headers, sigheaders[idx], dnsfunc)
File "/usr/lib/python/site-packages/dkim/__init__.py", line 696, in verify_sig
(base64.b64encode(bodyhash), sig[b'bh']))
dkim.ValidationError: body hash mismatch (got b'...', expected b'...')
不幸的是,如果发生这种情况,您自己没有太多好的选择:
me@mydomain.com
邮箱可靠地转发到我的 @gmail.com 账户的用户,有没有任何方法可以在不需要发送者更改任何内容的情况下,使用任何转发方法/服务来实现这一点?目前 Mailgun 日志显示,由于 Gmail 表示“未经身份验证的电子邮件来自 [域名],由于域名的 DMARC 政策而不被接受”,因此会丢弃一些消息。 - philfreome@mydomain.com
的电子邮件,而不是将其转发。 - None