什么是SPF?
SPF(发件人政策框架)是一种电子邮件身份验证方法,允许域所有者指定哪些邮件服务器被授权代表他们发送电子邮件。接收邮件服务器检查SPF记录以验证来自域的传入电子邮件来自授权来源。
为什么SPF很重要
没有SPF,任何人都可以发送看起来来自你的域的电子邮件(欺骗)。SPF帮助:
- 防止钓鱼:攻击者不能轻易冒充你的域
- 改进可递送性:电子邮件提供商信任经过身份验证的消息
- 保护声誉:欺骗垃圾邮件不会损害你的域声誉
- 启用DMARC:SPF是DMARC政策的构建块
SPF的工作原理
1. 域所有者发布 DNS中的SPF记录(TXT)
2. 发件人的邮件服务器发送声称来自@example.com的电子邮件
3. 接收者的邮件服务器查询example.com的SPF记录
4. 服务器检查发送IP是否授权
5. 应用结果:通过、失败、软失败或中立
SPF记录语法
SPF记录是具有特定格式的TXT记录:
v=spf1 [mechanisms] [qualifier]all
SPF记录示例
基本(单个邮件服务器):v=spf1 ip4:203.0.113.50 -all
Google Workspace:
v=spf1 include:_spf.google.com ~all
多个服务:
v=spf1 include:_spf.google.com include:sendgrid.net ip4:203.0.113.50 -all
SPF机制
| 机制 | 描述 | 示例 |
|---|---|---|
| ip4 | IPv4地址或范围 | ip4:203.0.113.0/24 |
| ip6 | IPv6地址或范围 | ip6:2001:db8::/32 |
| include | 包括另一个域的SPF | include:_spf.google.com |
| a | 域的A记录IP | a:mail.example.com |
| mx | 域的MX服务器IP | mx |
| all | 匹配所有(通常最后) | -all, ~all, ?all |
限定符
| 限定符 | 结果 | 含义 |
|---|---|---|
| +(默认) | 通过 | 授权发件人 |
| - | 失败 | 未授权,拒绝 |
| ~ | 软失败 | 可能未授权,接受但标记 |
| ? | 中立 | 无政策声明 |
SPF实现最佳实践
从软失败开始
首次实施SPF时,使用~all以避免拒绝合法电子邮件:
v=spf1 include:_spf.google.com ~all
过渡到失败
一旦确认工作,切换到-all以获得严格执行:
v=spf1 include:_spf.google.com -all
DNS查询保持在10以下
SPF允许最多10个DNS查询(包括、a、mx、重定向、存在)。超过此限制会导致SPF失败。
# 计入DNS查询:
include:_spf.google.com # 1(加上嵌套包含)
a:mail.example.com # 1
mx # 1
# 不计入:
ip4:203.0.113.50 # 0
ip6:2001:db8::1 # 0
仅一个SPF记录
多个SPF记录会导致验证失败。将所有机制合并为一个记录:
# 错误 - 两个SPF记录
v=spf1 include:_spf.google.com ~all
v=spf1 include:sendgrid.net ~all
# 正确 - 合并
v=spf1 include:_spf.google.com include:sendgrid.net ~all
检查SPF记录
使用dig:dig example.com TXT | grep spf
使用DomScan:
curl "https://domscan.net/v1/health?domain=example.com"
# 返回hasSPF状态
在线验证程序:MXToolbox、mail-tester.com
常见SPF问题
DNS查询过多
症状:SPF permerror
解决方案:展平包含或使用更少的外部服务
缺失第三方服务
症状:合法电子邮件未通过SPF
解决方案:为所有发送服务添加包含/ip4(营销工具、CRM等)
过度宽松的SPF
症状:欺骗电子邮件通过SPF
问题:使用+all或包含太多服务
解决方案:审计并限制授权发件人
SPF对电子邮件身份验证至关重要,但与DKIM和DMARC结合使用时效果最佳,以获得全面保护。