我在多个域上使用了相当多的电子邮件转发,而 AOL 的最新 p=reject 政策给我带来了一些问题,也给我带来了很多困惑。我对 DMARC 的理解是它基于带有报告层的 DKIM 和 SPF。我知道 SPF 是转发的问题,但只要将 SPF 设置为 ~all soft fail 那么这不是一个显示停止器。我还认为 DKIM 可以毫无问题地通过转发,只要你不把标题弄乱。但是,我发现 MailGun 转发的来自 AOL 的某些电子邮件在到达 GMail 时未能通过 DMARC。MailGun 说这是由于发件人/来自不匹配错误。任何人都可以详细说明电子邮件转发是否注定会因为 DMARC 占据主导地位,还是 MailGun 只是没有正确转发?
4 回答
我向 Mailgun 支持人员询问了这个问题,但没有得到任何有用的答案。但是,解决方案实际上在他们的文档中:
注意 如果您将邮件转发到另一个电子邮件地址,那么您应该通过在控制面板中编辑您的域设置来禁用点击跟踪、打开跟踪和取消订阅。如果启用了这些功能,Mailgun 在转发之前会修改每封邮件的内容,这会使 DKIM 签名无效。如果邮件来自发布 DMARC 策略的域(如 Yahoo! Mail),则该邮件将被转发目的地作为垃圾邮件拒绝。
https://documentation.mailgun.com/en/latest/user_manual.html#routes
因此,我关闭了我用于接收邮件的主域上的所有这些功能,从而解决了 DMARC 退回问题。如果您想使用这些功能中的任何一个,您需要为外发邮件设置一个子域。
如上所述,问题是在发送电子邮件时 somedomain.com 用 DKIM(电子邮件内容的唯一哈希)标记电子邮件。当 Mailgun 将邮件转发到 Gmail 时,它会插入它的打开/单击/取消订阅修改,然后使 DKIM 哈希无效。
因为 somedomain.com DMARC 说“拒绝任何使 DKIM 无效的内容”Gmail 或其他服务拒绝电子邮件。
我发现的解决方法是使用本机邮箱解决方案。WhoIs 带有一个易于设置的软件,例如:https ://manage.whois.com/kb/servlet/KBServlet/faq579.html
之后我只是在 Gmail 的设置中添加了 POP 邮箱。(截至 2017 年 12 月 24 日的 Gmail)。我能够重新启用打开和点击跟踪,现在一切正常,我很高兴仍然可以在 Gmail 中收到我的邮件。
作为奖励,我们将电子邮件用作共享收件箱,因此现在每个人都可以在收件箱中看到已发送的电子邮件,而不仅仅是转发的回复。
[编辑] 这样做之后,我意识到我现在只能在本机邮箱解决方案中接收我的电子邮件,而不再是在我也需要它们的 Mailgun 中。
为了解决这个问题,我使用子域添加了 MX 记录以指向 mxa.mailgun.org,因此 mg.exampledomain.com
然后,我使用 WhoIs 中的转发规则将所有发送到 info@exampledomain.com 的电子邮件也发送到 info@mg.exampledomain.com。现在我在 Mailgun 中收到邮件,并且仍然可以通过 POP 邮箱在 Gmail 中看到它。
在我的情况下,事实证明这只是由信誉良好的发件人的无效 DKIM 签名引起的,尽管转发器没有修改邮件。
如果中间没有转发器,SPF 可能已经通过并允许电子邮件通过,但鉴于 SPF 也不会在此处通过(因为您不是经过身份验证的发件人),DMARC 会告诉接收者硬失败,并且那么您的转发器可能会收到错误消息,例如来自 Gmail 的错误消息:
5.7.1 由于域的 DMARC 政策,来自 example.com 的未经身份验证的电子邮件不被接受。
如果这是一封合法邮件,请联系 example.com 域的管理员。
请访问https://support.google.com/mail/answer/2451690了解 DMARC 计划。
-gsmtp
这里的关键词是unauthenticated email,意思是没有有效签名的电子邮件。另一方面,经过身份验证的电子邮件可能已被您的域允许。
您可以验证问题是无效的 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'...')
不幸的是,如果发生这种情况,您将没有很好的选择:
从您自己的域发送单独的传递失败消息,并将原始电子邮件作为附件包含在内。如果操作正确,Gmail(可能还有其他接收者)实际上可以将附件内嵌显示为转发的消息。
将“发件人”地址替换为您自己的地址,然后使用您自己的 DKIM 密钥进行签名。
也许将原始电子邮件作为附件包含在内,以便接收者知道它是什么。如果接收者是您自己,那么编写一个脚本来下载电子邮件并将其直接推送到您的收件箱中(例如,通过 IMAP 或直接使用 API)。
告诉域名所有者并希望他们修复它。
(不过,如果他们还没有,祝他们好运,让他们相信问题就在他们这边。)