我试图弄清楚为什么即使电子邮件标有 SPF 也会将伪造的电子邮件发送给主要的电子邮件提供商(gmail.com、outlook.com)hardfail
。该电子邮件还被传递到 Microsoft Exchange,它为PermError
相同的 SPF 记录抛出一个。
我正在使用 SOME_DOMAIN.com 域发送电子邮件,该域定义了损坏的 SPF 记录。该电子邮件是从我自己的 IP 地址传输的,该地址未在 SOME_DOMAIN.com 的 SPF 记录中明确列出。SOME_DOMAIN.com 的 SPF 记录具有以下三个属性,前两个违反 SPF RFC-4408:
- 由于
include:
. - SPF 记录之一中的语法错误,python-spf 引发解析错误。
- SPF 记录包含规则
~all
和-all
,都表示所有地址的集合应该softfail
和hardfail
发送到模拟 admin@SOME_DOMAIN.com 的 Outlook.com 地址的电子邮件将在已发送电子邮件的 SMTP 标头中包含以下错误。此电子邮件已正常发送到用户的收件箱:
Received-SPF: PermError (: domain of SOME_DOMAIN.com used an invalid SPF mechanism)
Gmail 还会将电子邮件发送到用户的收件箱,但会引发不同的 SPF 错误:
spf=hardfail (google.com: domain of admin@SOME_DOMAIN.COM does not designate x.x.x.x as permitted sender) smtp.mail=admin@SOME_DOMAIN.COM
那么这里发生了什么?为什么尽管有 SPF 仍会发送电子邮件hardfail
?SPF 记录损坏是否意味着其他 SMTP 服务器完全无视 SPF?还是我在这里缺少什么...
如此多的站点对 SPF 的配置非常糟糕,以至于接收 MTA 通常仅被
hardfail
视为建议,并且仅将其计入垃圾邮件检测分数。最后,如何处理 SPF 故障由 MTA 管理员决定。SPF 错误条件不指示有关所需策略的任何内容。因此,它们不提供关于是否接受该消息的指导。预期的策略可能是
+all
. 在这种情况下接受邮件是正常的。谷歌似乎对这个不符合标准的域很宽容。在验证发件人地址时,即使 SPF 策略拒绝 (
-all
) 也不可靠。在许多情况下拒绝此类邮件是不合适的,包括:我运行一个相当小的服务器,我可以推迟硬故障。这使我可以将合法故障列入白名单。如果发件人注意到邮件没有送达,他们可能会修复他们的配置。在某些情况下,我会尝试联系相关的
postmaster
,但许多域没有postmaster
地址。想要执行更强大策略的用户可以使用 DMARC,这还不是标准。邮件仍有可能被递送,但可能会按照该政策的规定被隔离或拒绝。未通过策略的邮件可能会被递送到垃圾邮件文件夹,而不是正常的收件箱。
SPF 硬故障似乎确实可以可靠地验证发送服务器的身份。不久前我做了一些研究,发现即使是 HELO 名称上的软失败也是失败或延迟传入消息的合理原因。
许多邮件服务器没有 SPF 记录。如果邮件服务器没有 SPF 记录,我会检查父域是否有 SPF 记录。这是非标准的,但有效。我鼓励电子邮件管理员确保 PTR 记录中列出的服务器 IP 有一个 SPF 记录。您的服务器也应该通过其 PTR 记录返回的名称来标识自己。验证您是否有对应的 A 记录用于反向 DNS 验证。