DMARC 是电子邮件转发的终结吗?

Is DMARC the end of email forwarding?

我在许多域上使用了相当多的电子邮件转发功能,而 AOL 最新的 p=reject 政策给我带来了一些问题,也让我很困惑。我对 DMARC 的理解是它基于具有报告层的 DKIM 和 SPF。我知道 SPF 是转发的问题,但只要 SPF 设置为 ~all soft fail 那么这就不是一个问题。我还认为 DKIM 可以毫无问题地通过转发,只要你不把 headers 搞得一团糟。但是,我发现 MailGun 转发的某些来自 AOL 的电子邮件在到达 GMail 时未通过 DMARC。 MailGun 说这是由于 sender/from 不匹配错误造成的。任何人都可以详细说明随着 DMARC 的出现,电子邮件转发是否注定要失败,或者 MailGun 是否无法正确转发?

我认为您遇到的问题不是转发问题,而是 DKIM 对齐问题。是的,SPF 会失败,但 DKIM 应该会通过,但 DKIM 对齐可能不会通过。 DMARC 要求根据您的政策严格或宽松地对齐。您可以在此处阅读更多关于对齐的信息:Identifier Alignments

有一些测试工具,例如向 mailtest@unlocktheinbox.com 发送电子邮件,可以显示结果的一致性,但这是一项付费功能。

因为这是一个问题,所以在作品中有一个新的规范叫做"ARC",目的是解决这个问题,你可以在这里阅读:ARC Spec

我向 Mailgun 支持人员询问了这个问题,但没有得到任何有用的答案。但是,解决方案实际上在他们的文档中:

Note If you forward messages to another email address, then you should disable click tracking, open tracking and unsubscribes, by editing your domain settings in the Control Panel. If these features are enabled, the content of each message is modified by Mailgun before forwarding, which invalidates the DKIM signature. If the message comes from a domain publishing a DMARC policy (like Yahoo! Mail), the message will be rejected as spam by the forwarding destination.

https://documentation.mailgun.com/en/latest/user_manual.html#routes

因此,我关闭了我用于接收邮件并解决 DMARC 弹跳问题的主域上的所有这些功能。如果您想使用这些功能中的任何一个,您将需要为外发邮件设置一个子域。

如上所述,问题是在发送电子邮件时 somedomain.com 用 DKIM(电子邮件内容的唯一哈希值)标记电子邮件。当 Mailgun 将邮件转发到 Gmail 时,它会插入 open/click/unsubscribe 修改,然后使 DKIM 哈希无效。

因为 somedomain.com DMARC 说 "reject anything that has had the DKIM invalidated" Gmail 或其他服务拒绝电子邮件。

我找到的解决方法是使用本机邮箱解决方案。 WhoIs 附带一个易于设置的示例:https://manage.whois.com/kb/servlet/KBServlet/faq579.html

后来我就在Gmail的设置里面简单的添加了POP邮箱。 (截至 Gmail 2017 年 12 月 24 日)。我能够重新启用打开和点击跟踪,现在一切正常,我仍然很高兴地在 Gmail 中收到我的邮件。

作为奖励,我们将电子邮件用作共享收件箱,这样现在每个人都可以在他们的收件箱中看到已发送的电子邮件,而不仅仅是转发的回复。

[编辑] 这样做之后,我意识到我现在只能在本机邮箱解决方案中收到我的电子邮件,而不再是在我也需要它们的 Mailgun 中。

为了解决这个问题,我添加了 MX 记录以使用子域指向 mxa.mailgun.org,因此 mg.exampledomain.com

然后我使用 WhoIs 中的转发规则将所有发送到 info@exampledomain.com 的电子邮件发送到 info@mg.exampledomain.com。现在我在 Mailgun 中收到邮件,并且仍然可以通过 POP 邮箱在 Gmail 中看到它。

在我的例子中,事实证明这仅仅是由来自信誉良好的发件人的无效 DKIM 签名引起的,尽管事实上转发器是 NOT 修改消息。

如果中间没有转发器,SPF 可能已经通过并允许电子邮件通过,但考虑到 SPF 也不会在这里通过(因为您不是经过身份验证的发件人),DMARC 会告诉收件人硬失败,然后您的转发器可能会收到错误,例如来自 Gmail 的错误:

5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policy.
Please contact the administrator of example.com domain if this was a legitimate mail.
Please visit https://support.google.com/mail/answer/2451690 to learn about the DMARC initiative.
- gsmtp

这里的关键词是unauthenticated email,意思是没有的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(可能还有其他收件人)实际上可以将附件内联显示为转发邮件。[​​=14=]

  • 用您自己的地址替换 "From" 地址,然后用您自己的 DKIM 密钥签名。
    也许将原始电子邮件作为附件包含在内,以便收件人知道它是什么。

  • 如果收件人是您自己,则编写一个脚本来下载电子邮件并将其直接推送到您的收件箱(例如,通过 IMAP,或 directly with an API).

  • 告诉域所有者并希望他们修复它。
    (不过,如果他们还没有,good luck convincing them 问题在他们这边。)