DMARC 是电子邮件转发的终结吗? [关闭]

Posted

技术标签:

【中文标题】DMARC 是电子邮件转发的终结吗? [关闭]【英文标题】:Is DMARC the end of email forwarding? [closed] 【发布时间】:2016-09-05 02:48:48 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

由于这是一个问题,因此有一个名为“ARC”的新规范正在开发中,其目的是解决这个问题,您可以在此处阅读:ARC Spec

【讨论】:

非常感谢。到目前为止,我只收到了人们模糊的回应。这涉及到细节。 如果我正确回答了您的问题,您应该将其标记为正确答案。 令人难以置信的补丁上的补丁(SPF,DKIM 现在是 ARC)。 因此,作为一个只想让me@mydomain.com 电子邮件可靠地转发到我的@gmail.com 帐户的用户,有没有办法可靠地做到这一点(无需发件人更改任何内容),使用任何转发方法/服务?目前,Mailgun 日志显示,由于 Gmail 说“由于域的 DMARC 政策,不接受来自 [域] 的未经身份验证的电子邮件”,因此某些邮件被丢弃了 @philfreo 使用 gmail 的 POP 检索方法从me@mydomain.com 拉取电子邮件,而不是转发它。【参考方案2】:

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

注意如果您将邮件转发到另一个电子邮件地址,那么您应该 通过编辑禁用点击跟踪、打开跟踪和取消订阅 控制面板中的域设置。如果这些功能 启用后,每条消息的内容都被Mailgun修改过 转发,这会使 DKIM 签名无效。如果消息来了 从发布 DMARC 策略的域(如 Yahoo! Mail), 邮件将被转发目的地作为垃圾邮件拒绝。

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

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

【讨论】:

这对我有用,而且似乎是接收电子邮件的最佳解决方案! 我从未启用这些功能,但我仍然收到 DMARC 错误。 这应该是公认的答案。我之前启用了open 跟踪,它在 AOL 邮件服务器上失败,但在 GMAIL 上成功。禁用后它也适用于 AOL。 我写了你引用的Mailgun文档的一部分!我很高兴知道它对其他人有用:-) 我仍然认为 Mailgun 应该自动执行此操作。修复它比记录它更好。【参考方案3】:

如上所述,问题在于在发送电子邮件时 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 中看到它。

【讨论】:

【参考方案4】:

在我的情况下,事实证明这只是由来自信誉良好的发件人的无效 DKIM 签名引起的,尽管转发者修改了邮件。

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

5.7.1 由于域的 DMARC 政策,来自 example.com 的未经身份验证的电子邮件不被接受。 如果这是一封合法邮件,请联系 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'...')

很遗憾,如果发生这种情况,您将没有很好的选择:

从您自己的域发送单独的传递失败消息,并将原始电子邮件作为附件包含在内。如果操作正确,Gmail(可能还有其他接收者)实际上可以将附件内嵌显示为转发的消息。

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

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

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

【讨论】:

以上是关于DMARC 是电子邮件转发的终结吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Office365混合部署进阶系列教程一:使用SPF+DKIM+DMARC技术提升邮件安全

DMARC:ESP 主机作为报告中的发件人

在数据库中存储邮件的最佳方式(后缀)[关闭]

DMARC/SPF 配置错误

使用 php 脚本从自己的本地 apache 服务器发送电子邮件 [关闭]

Dmarc指定外域邮箱接收报告