带有 DMARC 的电子邮件:'FAIL' 即使它从 https://mxtoolbox.com 验证程序通过

Emails with DMARC: 'FAIL' even though it passes from the https://mxtoolbox.com validator

出于隐私考虑,我在下面使用用户名@example.net,但这是真实域和电子邮件地址发生的。

在我们发送的大量电子邮件中,DMARC 失败:

在我的 TXT 记录中,这是我对 DMARC 的记录:

_dmarc 14400 IN TXT "v=DMARC1; p=none; rua=mailto:username@example.net; sp=none; aspf=r"

当我去 https://mxtoolbox.com 验证我的 DMARC 记录时,这是我得到的:

为什么 DMARC 会失败,即使验证器说它通过了,没有语法错误并且一切看起来都是正确的?注意 SPF 和 DKIM 是如何通过的。出于某种我试图理解的原因,问题仅出在 DMARC 上。

更新 1:我在 https://support.google.com/a/answer/2466563?hl=en:

找到了这一段

Alignment mode refers to the precision with which sender records are compared to SPF and DKIM signatures, with the two possible values being relaxed or strict. represented by "r" and "s" respectively. In short, relaxed allows partial matches, such as subdomains of a given domain, while strict requires an exact match.

请注意我的 _dmarc 14400 IN TXT "v=DMARC1; p=none; rua=mailto:username@example.net; sp=none; aspf=r" 我是如何尝试使用轻松模式的。

我猜(因为我无法从你发布的内容中判断)这是因为你的 SPF 发件人域不是 "aligned" 而你的发件人 header。您正在通过 sendgrid 发送,所以我希望 sendgrid 也在处理您的退回,因此您可能在收到的消息上有一个 return-path header,例如:

Return-path: <bounces-username=example.net@sendgrid.net>

但是您的发件人 header 在您自己的域中:

From: <username@example.net>

你的 SPF 可能允许从 sendgrid 的 IPs 发送(通过他们的 SPF 记录的 include),所以你会得到一个通行证,但显然 example.netsendgrid.net 不是同一个域,因此它们不被认为是对齐的,您将遇到 DMARC 失败。

为了使其更多地对齐 aspf=s,您的发件人地址需要是 sendgrid.net 地址(可能不是您想要的),或者您的邮件服务器需要位于 example.net(您可能正在使用 sendgrid,因为您不想 运行 您自己的邮件服务器),所以您需要恢复到 aspf=r(宽松)模式。这将允许您在您的 DNS 中创建一个指向您域中的名称的 CNAME,例如 sendgrid 的邮件服务器上的 mail.example.net,并且他们需要知道该安排已经到位,以便他们可以使用该安排发送邮件信封发件人,在宽松模式下,example.netmail.example.net 被认为是对齐的,您将获得 DMARC PASS.

mxtoolbox 会给你一个通行证,因为你的 DMARC 记录在孤立的情况下确实是完全有效的,但除非你的发送邮件的域实际对齐,否则它仍然不会工作。

只需使用子域名在您的 DNS 设置中添加一条 txt 记录 _dmarc

"v=DMARC1\;p=none\;pct=100\;rua=mailto:serveradmin@mydomain.com\;ruf=mailto:serveradmin@mydomain.com"

注意:删除其他 _dmarc 条记录

要测试您的结构是否正确,您可以检查

$ dig +short txt _dmarc.mydomain.com 

应该return

"v=DMARC1\;p=none\;pct=100\;rua=mailto:serveradmin@mydomain.com\;ruf=mailto:serveradmin@mydomain.com"

已接受答案的附录,专门针对 Sendgrid:

如果您的主用户帐户中的所有设置都正确,这并不意味着子用户帐户能够发送并通过 DMARC。您必须将已验证的域分配给子用户

我已经验证了我的域,还设置了专用 IP 地址并配置了反向 DNS。 IP 地址已正确分配给子用户。我认为域验证也适用于子用户,因为 SPF 和 DKIM 通过了。但事实证明,他们通过了发件人域 sendgrid.com,而不是我的自定义域。这就是 DMARC 失败的原因。

Sendgrid 提供了在您首次设置验证域时将验证域分配给子用户的选项(这是一个“高级”选项;文档 here)。如果域已经过验证,似乎没有办法从“发件人身份验证”选项卡将其分配给子用户。

另一方面,子用户管理选项卡中似乎确实有一个位置。如果您编辑特定的子用户,则会有一个“更改发送”按钮;单击该按钮后,您可以选择一个域。我还没有尝试过这种方法,但看起来应该可行。上面链接的文档中没有提到它。

我认为以子用户身份登录时也可以验证域,但我还没有尝试过。

我不知道您的 DMARC 记录是否需要 aspf=radkim=r 才能正常工作。我有它们以防万一,但在我看来 DKIM 发件人域是我的自定义域,而不是子域,所以我认为这就足够了。