为什么 SPF 验证失败:none, neutral, fail(hard fail), soft fail, temperror, and permerror 全解释

SPF

DMARC (Domain-based Message Authentication, Reporting and Conformance) 指定了这些在 SPF 中可能出现的错误(除了 pass 以外的结果):none, neutral, fail (hard fail), softfail (soft fail), temperror (临时错误), 以及 permerror (永久错误)。

对于那些不熟悉 SPF 和 DMARC 的读者来说,这些问题可能令人困惑:为什么 SPF 会返回这些错误,DMARC 如何解读这些错误,以及采取什么措施来修复它们。

本文将逐一考察这些问题。

SPF 验证结果是什么?

SPF 验证结果是在接收邮件服务器上面执行的 SPF 验证检查的结果。当主机试图将邮件送达目标邮箱时:

  • 接收邮件服务器从信封来源地址中提取域名;比如,business.com
  • 接收邮件服务器检查连接主机的 IP 地址,看它是否在 business.com 的 SPF 记录上面。如果是的话,SPF 检查通过,否则失败。

要了解更多信息,请参照:SPF 工作原理

如果是通过的情形,一切都很简单:SPF 记录存在,语法正确,IP 地址位于列表之中。但是,当 SPF 验证由于各种原因失败的时候,情况就变得有些复杂。

下面列出了导致 SPF 验证检查失败的常见原因:

  • 无法在 DNS 中解释域名;
  • 无法在域名上找到 SPF 记录;
  • 域名上找到多条 SPF 记录;
  • SPF 记录语法不正确;
  • IP 地址不在 SPF 记录指定的列表上;
  • SPF 记录中包含的 DNS 查询次数超过 10;
  • SPF 记录中包含的返回结果为空的查询 (void lookups) 数量超过 2;

当以上任意一个发生时,下面 SPF 验证结果之一将被返回给 DMARC:

  • none;
  • neutral;
  • soft fail;
  • fail, or hard fail;
  • temperror, 即临时错误;
  • permerror, 即永久错误.

下面我们将逐一解释。

SPF none 解释

当服务器试图为 SPF 验证解释域名时,如果以下之一为真的话,返回 none 结果:

  • 无法在 DNS 中解释域名;
  • 无法在域名上找到 SPF 记录;

换句话说,如果域名上没有 SPF 记录,SPF none 将被返回。

SPF none 被 DMARC 视为 fail:SPF 验证检查失败。这意味着如果 DKIM 验证也失败的话,最终的 DMARC 验证也会失败。

修复这个问题很简单,在域名上面发布一个有效的 SPF 记录就可以了:

SPF neutral 解释

SPF neutral 意味着域名上的 SPF 记录并不对 IP 地址是否被允许下断言。一般来说,这可以通过在 SPF 记录的末尾添加 ?all mechanism 来实现。当该 mechanism 被估值时,所有的 IP 地址都会使 SPF 返回 neutral 结果。

根据您在邮件服务器上面的 DMARC 设置情况,SPF neutral 可以在 DMARC 中被解释为 pass 或者 fail(!)。这通常由 DMARC 设置中的一个标志位来确定,并且不同的 DMARC 包情况也不一样。在由 Trusted Domain 发布的 OpenDMARC 中,SPF neutral 缺省被 DMARC 解释成 fail。

SPF softfail 解释

SPF softfail 是一个弱宣称,意思是连接主机 IP 很可能不被允许。域名并没有发布一个更强更确定的策略,使得结果为 "fail"。这可以通过在 SPF 记录的末尾添加 ~all mechanism 来实现。当该 mechanism 被估值时,所有的 IP 地址都会使 SPF 返回 softfail 结果。

neutral 一样,根据您在邮件服务器上面的 DMARC 设置情况,SPF softfail 可以在 DMARC 中被解释为 pass 或者 fail。在 OpenDMARC 中,SPF softfail 缺省被 DMARC 解释成 fail。

SPF fail 解释

SPF fail,也被称为 SPF hardfail,显式地宣称连接主机不被允许使用该域名来发送邮件。这可以通过在 SPF 记录的末尾添加 -all mechanism 来实现。当该 mechanism 被估值时,所有的 IP 地址都会使 SPF 返回 fail 结果。

不管您的邮件服务器使用哪一种 DMARC 包,SPF fail 一律被 DMARC 视为 fail。

SPF temperror 解释

SPF temperror,也被称为 SPF temporary error,意味着在 SPF 验证时遇到了一个临时错误,比如说 DNS 超时。过后的重试也许会通过,无需 DNS 管理员干预。

SPF temperror 使得邮件服务器返回一个临时错误,例如,对应的 SMTP 命令会返回一个合适的 4xx 状态码。根据重试策略的设置,连接主机可以过后重试来投递邮件。

因此,DMARC 对 SPF temperror 的解释在这里无关紧要:该错误被用来返回一个 4xx 状态码,SMTP 会话随即终止。邮件被延后,而不是被投递。

SPF permerror 解释

SPF permerror,也就是 SPF permanent error(SPF 永久错误),意味着域名上发布的记录无法被正确地解释。这意味着 SPF 记录设置不正确,并且需要 DNS 管理员手工修复。

当以下之一发生的时候,SPF 返回 permerror

  • 域名上发现多条 SPF 记录;了解更多
  • SPF 记录语法不正确;
  • SPF 记录中包含的 DNS 查询次数超过 10;
  • SPF 记录中包含的返回结果为空的查询 (void lookups) 数量超过 2。

下面是一个由于超过 SPF 10 次 DNS 查询极限导致返回 permerror 的例子:

SPF permerror 被 DMARC 解释为 fail。因此,当您遇到 SPF permerror 时,您应该修复您的 SPF 记录。否则,将会对您的邮件送达率产生负面影响。

SPF permanent error: too many DNS lookups

一个常见的 SPF 永久错误的类型是:SPF permanent error: too many DNS lookups。当您的 SPF 记录包含超过 10 次 DNS 查询时,就会发生该错误。

在下面的例子,域名的 SPF 记录有 19 次 DNS 查询,远远超过了 10 次:

要修复这个错误,您可以使用 DMARCLY 的 Safe SPF 功能。

使用 Safe SPF 来修复 SPF PermError: Too Many DNS Lookups 问题.

请参阅:SPF PermError: Too Many DNS Lookups - 当 SPF 记录超过 10 次 DNS 查询极限.

?all,~all,和 -all 有什么不同?

一个常见的问题是:我应该在 SPF 记录中使用哪个??all,~all,还是 -all?

如上所述,这三者的一个关键的不同是 DMARC 如何解释结果:

  • 对 ?all (neutral) 和 ~all (soft fail) 来说,结果缺省被 OpenDMARC 解释为 fail;尽管您可以改变设置使得它们被解释为 pass;
  • 对 -all (fail),所有的 DMARC 包都将其解释为 fail。

所以如果您选择使用 -all,SPF 结果在所有的 DMARC 部署中都被解释为 fail;但如果使用 ?all 或者 ~all,SPF 结果可能会在不同的邮件服务器上有不同的解释。

Previous Post Next Post

 Protect Business Email & Improve Email Deliverability

Get a 14 day trial. No credit card required.

Create Account