Skip to main content

8. 结果处理 (Result Handling)

本节为SPF验证器操作者提供了针对消息上check_host()各种可能输出的响应指导。SPF结果的定义在第2.6节中提供;本节为每个结果提供更多细节,用于开发消息处理的本地策略。

每个操作环境都不同。对于一些接收者来说,严格遵守SPF是合适的,明确处理被评估为明确未授权("fail",有时是"softfail")的消息是常态。对于其他接收者来说,"假阴性"的情况更令人担忧。这种担忧通常通过仅将结果记录在标头中并允许消息传递以进行附加处理来处理。还有其他情况,SPF是消息处理决策的几个输入之一。因此,对于任何特定结果,没有全面的规范性消息处理要求。本节旨在呈现每个结果可能原因的完整图景,以及在可用时在实验性部署期间获得的经验。

本质上有两类处理选择:

  • 在尝试传递消息的SMTP会话中进行处理,例如通过返回永久SMTP错误(拒绝)或临时SMTP错误("稍后再试");

  • 允许消息通过(成功的SMTP回复代码)并添加一个附加标头字段,指示check_host()返回的结果和其他突出细节;这在第9节中更详细地讨论。

8.1. None

对于"none"结果,SPF验证器完全没有关于客户端使用已检查身份或多个身份的授权或缺乏授权的信息。check_host()函数在没有错误的情况下完成,但无法得出任何结论。

8.2. Neutral

"neutral"结果表示虽然发现了身份的策略,但没有关于客户端的明确断言(正面或负面)。

"neutral"结果必须被完全像"none"结果一样处理;该区别仅用于信息目的。比"none"更严厉地处理"neutral"会阻碍ADMD测试SPF记录的使用(参见第10.1节)。

8.3. Pass

"pass"结果意味着客户端被授权使用给定身份注入邮件。就声誉而言,该域现在可以被认为负责发送消息。进一步的策略检查现在可以有信心地进行,相信身份的合法使用。这在附录G.1中进一步讨论。

8.4. Fail

"fail"结果是一个明确声明,表示客户端未被授权在给定身份中使用该域。SPF失败消息的处置是本地策略的问题。有关开发本地策略的考虑,请参见附录G.2。

如果检查软件选择在SMTP事务期间拒绝邮件,则应该使用SMTP回复代码550(参见[RFC5321]),如果支持,还应该使用5.7.1增强状态代码(参见[RFC3463]第3.8节),以及适当的回复文本。check_host()函数将返回默认解释字符串或来自发布SPF记录的域的解释字符串(参见第6.2节)。如果信息不是源自检查软件,最好清楚地表明文本是由发件人的域提供的。例如:

550 5.7.1 SPF MAIL FROM check failed:
550 5.7.1 The domain example.com explains:
550 5.7.1 Please see http://www.example.com/mailpolicy.html

如果检查软件选择不在SMTP事务期间拒绝邮件,则应该添加Received-SPF或Authentication-Results标头字段(参见第9节)以将此结果传达给下游消息处理器。虽然这对所有SPF结果都是正确的,但对于"fail"结果尤为重要,因为消息明确未被ADMD授权。

8.5. Softfail

"softfail"结果应该被视为介于"fail"和"neutral"/"none"之间的某处。ADMD认为主机未被授权,但不愿意做出强有力的策略声明。接收软件不应该仅基于此结果拒绝消息,但可以对消息进行比正常更仔细的审查。

ADMD希望阻止此主机的使用,因此希望在出现"softfail"结果时获得有限的反馈。例如,收件人的MUA可以突出显示"softfail"状态,或者接收MTA可以使用灰名单[RFC6647]向发件人提供消息,在第一次接收消息时提供注释,但根据接收方策略在稍后的尝试中接受它。

8.6. Temperror

"temperror"结果意味着SPF验证器在执行检查时遇到临时(通常是DNS)错误。检查软件可以选择接受或临时拒绝消息。如果由于这个原因在SMTP事务期间拒绝消息,软件应该使用SMTP回复代码451,如果支持,还应该使用4.4.3增强状态代码(参见[RFC3463]的第3.5节)。这些错误可能由发件人或接收方的DNS软件中的问题引起。有关开发本地策略的考虑,请参见附录G.4。

8.7. Permerror

"permerror"结果意味着域的已发布记录无法正确解释。这表明一个错误条件,肯定需要DNS操作者干预才能解决。如果由于这个原因在SMTP事务期间拒绝消息,软件应该使用SMTP回复代码550,如果支持,还应该使用5.5.2增强状态代码(参见[RFC3463]第3.6节)。请注意,如果ADMD使用宏(第7节),则此结果可能是由于已检查的身份具有意外格式。也有可能某些SPF验证器由于输入参数具有意外格式而生成此结果;参见第4.8节。有关开发本地策略的考虑,请参见附录G.3。