很多人第一次自己发邮件,最先碰到的不是代码问题,而是信全进了垃圾箱。原因八成出在认证上:Gmail、Outlook、QQ 邮箱都会检查 SPF、DKIM、DMARC 这三项,缺了或者配错了,你的信在对方眼里就像一封来路不明的信。
这篇把三者各自管什么、记录怎么写、怎么验证一次讲完。
SPF:谁有资格替你发信
SPF 是一条 TXT 记录,列出允许代表这个域名发信的服务器。收件方收到信后,会拿发信服务器的 IP 去对照这份名单。
send.example.com. TXT "v=spf1 include:_spf.bulkmail.dev -all"
include:表示把另一个域名的 SPF 名单也算进来,邮件服务商一般都会给你一个。-all表示名单之外的一律不认;~all是“不认但别直接拒”,刚开始配置时可以先用它。
两个容易踩的坑:同一个名字下只能有一条 SPF 记录,多条会直接判失败;另外 SPF 查的是信封发件人(Return-Path)的域名,不是你在信里看到的发件人。所以很多服务会让你在 send. 这样的子域名上配 SPF。
DKIM:证明信没被改过
DKIM 用一对密钥给邮件签名。私钥在发信服务器上,公钥放在 DNS 里,收件方用公钥验签,签名对得上,说明这封信确实是你的服务器发的,而且路上没被改过。
bm1a2b._domainkey.example.com. TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqh..."
bm1a2b 叫 selector,用来区分同一个域名下的多把密钥。公钥很长,有的 DNS 服务商会自动拆成几段,这是正常的,不用手动处理。
在三项里,DKIM 最重要。SPF 在邮件被转发时容易失效,DKIM 签名却会跟着邮件一起走。
DMARC:告诉收件方认证失败了怎么办
DMARC 把前两项串起来:要求 SPF 或 DKIM 至少有一项通过,而且通过的那个域名要和信里显示的发件人域名对得上(叫“对齐”)。然后告诉收件方,不满足的话怎么处理。
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
| p 的值 | 意思 | 什么时候用 |
|---|---|---|
none | 只观察,不处理 | 刚开始配置,先看看报告 |
quarantine | 放进垃圾箱 | 确认自己的正常邮件都能通过之后 |
reject | 直接拒收 | 完全确定后,防冒充效果最好 |
从 2024 年开始,Gmail 和 Yahoo 要求批量发件人必须有 DMARC 记录,哪怕是 p=none。所以别省这一条。
怎么确认配好了
- 用命令行查记录:
dig +short TXT _dmarc.example.com,能看到你加的内容就说明 DNS 生效了。 - 给自己的 Gmail 发一封信,打开后点右上角「⋮ → 显示原始邮件」,最上面会列出 SPF、DKIM、DMARC 是 PASS 还是 FAIL。
- 如果用的是 BulkMail,控制台的域名页面会直接显示每条记录的检测状态。
几个常见问题
改了 DNS 多久生效?
一般几分钟,慢的话几个小时,取决于 TTL 和你的 DNS 服务商。Cloudflare 通常一两分钟就能查到。
公司已经在用企业邮箱了,再加一套会冲突吗?
DKIM 不会,因为 selector 不同。SPF 和 DMARC 是一个名字只能一条,所以更推荐用子域名发系统邮件,比如 mail.example.com,和办公邮箱完全分开,互不影响。