发件人策略框架 (SPF)

垃圾邮件是电子邮件营销行业每天面临的主要瓶颈问题。欺诈者经常尝试伪造电子邮件的发件人地址并尝试执行恶意活动。保护您的电子邮件并提高可传递性的唯一方法是实施电子邮件身份验证。 发件人策略框架 (SPF) 是一种身份验证技术,可帮助接收电子邮件服务器识别合法的电子邮件发件人并防止垃圾邮件进入电子邮件收件人的收件箱。

SPF,全称为 Sender Policy Framework,即发件人策略框架。

当前 Email 通信,还是在使用 SMTP 这个协议。SMTP 的全称为 Simple Mail Transfer Protocol,即「简单邮件传输协议」。正如它的名字锁暗示的,SMTP 实际上是一个非常简单(甚至简陋)的传输协议,本身并没有很好的安全措施。根据 SMTP 的规则,发件人的邮箱地址是可以由发信方任意声明的。在 SMTP 协议制定的时候也许还好,但在垃圾和诈骗邮件横行的今天,这显然是极不安全的。SPF 出现的目的,就是为了防止随意伪造发件人。

SPF的工作原理 #

SPF 记录实际上是服务器的一个 DNS 记录,原理其实很简单:

SPF 允许电子邮件发件人发布代表他们发送电子邮件的 IP 列表。当我们发送电子邮件活动时,邮箱提供商的接收服务器将对返回路径域执行 TXT 记录 DNS 查找。因此,将返回 SPF 记录。SPF 记录将包含授权代表我们发送电子邮件的 IP 地址列表。当用于发送电子邮件活动的 IP 地址出现在该列表中时,该电子邮件将通过 SPF 验证。

假设邮件服务器收到了一封邮件,来自主机的 IP 是173.194.72.103,并且声称发件人为email@example.com。为了确认发件人不是伪造的,邮件服务器会去查询example.com的 SPF 记录。如果该域的 SPF 记录设置允许 IP 为173.194.72.103的主机发送邮件,则服务器就认为这封邮件是合法的;如果不允许,则通常会退信,或将其标记为垃圾/仿冒邮件。

因为不怀好心的人虽然可以「声称」他的邮件来自example.com,但是他却无权操作example.com的 DNS 记录;同时他也无法伪造自己的 IP 地址。因此 SPF 是很有效的,当前基本上所有的邮件服务提供商(例如 Gmail、QQ 邮箱等)都会验证它。

SPF记录的语法 #

一条 SPF 记录定义了一个或者多个 mechanism,而 mechanism 则定义了哪些 IP 是允许的,哪些 IP 是拒绝的。

这些 mechanism 包括以下几类:

all | ip4 | ip6 | a | mx | ptr | exists | include

每个 mechanism 可以有四种前缀:

"+"  Pass(通过)
"-"  Fail(拒绝)
"~"  Soft Fail(软拒绝)
"?"  Neutral(中立)

测试时,将从前往后依次测试每个 mechanism。如果一个 mechanism 包含了要查询的 IP 地址(称为命中),则测试结果由相应 mechanism 的前缀决定。默认的前缀为 + 。如果测试完所有的 mechanisms 也没有命中,则结果为 Neutral。

除了以上四种情况,还有 None(无结果)、PermError(永久错误)和 TempError(临时错误)三种其他情况。对于这些情况的解释和服务器通常的处理办法如下:

结果 含义 服务器处理办法
Pass 发件 IP 是合法的 接受来信
Fail 发件 IP 是非法的 退信
Soft Fail 发件 IP 非法,但是不采取强硬措施 接受来信,但是做标记
Neutral SPF 记录中没有关于发件 IP 是否合法的信息 接受来信
None 服务器没有设定 SPF 记录 接受来信
PermError 发生了严重错误(例如 SPF 记录语法错误) 没有规定
TempError 发生了临时错误(例如 DNS 查询失败) 接受或拒绝

注意,上面所说的「服务器处理办法」仅仅是 SPF 标准做出的建议,并非所有的邮件服务器都严格遵循这套规定。

示例 SPF 记录:
v=spf1 include:spf.profdecor.net ~all

v:这表示正在使用的 SPF 版本。
include:include 语句要求接收服务器包含指定域的 SPF 记录。SPF 记录包含用于发送电子邮件的 IP 地址集。
~all:当 SPF 失败时,“all”将决定接收服务器应如何处理电子邮件。我们通常使用“软失败”方法。当 SPF 失败时,电子邮件将被接受但标记为“软失败”。

如何用SPF保护我的域名 #

如果你拥有自己的域名,并且用它发送邮件,那么你应该为它添加 SPF。通过域名服务商提供的「域名解析」、「DNS Editor」或者「DNS Zone Editor」等功能添加,并填写正确的 SPF 数据就可以了。

严格来说,SPF 数据应该创建为 SPF 记录。但是鉴于很多 DNS 服务商不支持 SPF 记录,甚至有的邮件服务器也不支持 SPF 记录,因此也可以创建为一条 TXT 记录。目前,你应该至少创建一条 TXT 记录。

因为本质上 SPF 的作用是为一个域名指定合法的发件 IP,所以你需要知道自己使用的邮件服务器的发件 IP 是什么。如果你使用第三方的域名邮箱服务(比如腾讯的域名邮箱),那么他们应该有相应的文档告诉你该怎么填写。如果你用虚拟主机,则主机提供商也应该会告诉你。

生效时间

SPF 记录本质上是一个 DNS 记录,所以并不是修改之后立即生效的——通常需要几个小时的时间。

一些工具

这里有一些非常好用的工具可以帮助你,点击它们在新窗口打开:

  • Open SPF :官方网站,有很多资料,值得一看。
  • RFC 4408 :SPFv1 的规范全文。
  • SPF Recored Testing Tools :帮助你验证域名是否存在 SPF 记录、记录的语法是否正确,以及输入 IP 和 host 来测试是不是真正管用。
  • SPF: Why? :为什么我发的邮件被拒绝了?