当邮件传入 Messaging Server 时,MTA 将进行 SPF 查询以确定地址是否确实来自该地址上的域。SPF 查询查阅 DNS 中属于此邮件的域的 TXT 记录 (domain)。 domain 可以是作为 HELO 或 EHLO 参数指定的域名(如果使用了 spfhelo 通道关键字),也可以是在 MAIL FROM: 命令中给出的邮件始发者地址中的域名(通常是 @ 字符之后的部分)。如果没有指定的或可用的域名,则在 HELO/EHLO 期间指定的那个域名将被用作 domain。请注意,大部分 ISP 会发布一个与其域匹配的授权 IP 地址列表。如果 IP 地址与域名不匹配,则邮件将被认为是伪造的。
在查询 DNS 之前,我们会先检查 SPF_LOCAL 映射表中是否存在匹配的域。如果在表中找到匹配的域,则首先使用此域。
如果在映射表中找到的记录包含 redirect = domain 子句,则会通过 DNS 查询重定向到域,而跳过递归和冗余的映射文件检查。
生成的 TXT 记录示例:
v=spf1 +mx a:colo.siroe.com/28 -all
对于此 RFC 支持的 SPF 记录而言,v=spf1 令牌是必须的。
+mx 指示我们检查 domain 的 MX 记录,并确认此 SMTP 连接的源 IP 地址与作为 domain MX 查询结果给出的 IP 地址之一匹配。如果存在匹配项,则 + 表示此操作的结果为 Pass。
a:colo.siroe.com/28 指示我们检查 colo.siroe.com 的 A 记录,然后确认此 SMTP 连接的源 IP 地址与 A 记录位于同一指定的 CIDR 子网,只比较 28 位(掩码 255.255.255.240)。未指定限定字符,因此使用默认值 +,表示匹配导致 Pass。
最后,-all 与任何其他项匹配,并导致 Fail。有关 SPF 记录更完整的介绍,请参阅 http://www.ietf.org/rfc/rfc4408.txt 上的 RFC 4408。
SPF 处理可以得到以下结果之一。下表显示了结果及其说明。
表 15–1 SPF 处理结果
结果 |
说明 |
---|---|
Pass |
查找已通过,表示找到了 SPF 记录,并且该记录验证了始发系统有权使用 domain。 |
Fail |
查找找到了匹配的 SPF 记录,但是,该记录明确地拒绝向 SMTP 客户端授予在 SMTP 事务期间使用 domain 的权限。我们 SPF 实现的默认行为是使用 5xx 回复拒绝 SMTP 命令。 |
SoftFail |
查找找到了匹配的 SPF 记录并且该记录也拒绝为 SMTP 客户端授权使用 domain,但是,拒绝不是很严格且记录不会指向彻底失败。我们实现的默认行为是接受邮件,但是在 Received-SPF: 标题中注明 SoftFail,以进行后续评测,如 Sieve 处理。 |
Neutral |
SPF 记录未声明授权 SMTP 客户端使用 domain。邮件将被接受。规范要求 Neutral 与下面的 None 处理方法一样。 |
None |
未找到匹配 SPF 记录,因此不进行任何 SPF 处理。 |
PermError |
在 SPF 处理中遇到永久错误,例如 SPF 记录中的语法错误、处理嵌套 SPF 记录时发生 DNS 故障(由于 include: 机制或 redirect= 修饰符所致),或处理嵌套 SPF 记录时超过为 SPF 处理配置的限制。默认行为是使用 5xx 回复拒绝 SMTP 命令。 |
TempError |
在 SPF 处理中遇到临时错误,很可能是由于查询 SPF 记录时 DNS 超时。默认行为是使用 4xx 回复拒绝 SMTP 命令。 |
在 SPF 处理完成后,Received-SPF: 标题将被写入记录 SPF 处理结果的邮件。然后,可以在 Sieve 处理期间查询此标题以做进一步考虑。如果启用 option.dat 文件中的 MTA 选项 MM_DEBUG (>0),则可以使用全面的调试。