21

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

4

4 回答 4

16

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

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

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

于 2016-05-11T14:21:02.927 回答
8

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

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

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

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

于 2017-06-24T01:59:29.630 回答
1

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

于 2017-12-24T11:27:22.393 回答
0

在我的情况下,事实证明这只是由信誉良好的发件人的无效 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)。

  • 告诉域名所有者并希望他们修复它。
    (不过,如果他们还没有,祝他们好运,让他们相信问题就在他们这边。)

于 2019-09-28T19:55:00.267 回答