邮件认证原理
你用 noreply@example.com 给客户发邮件,结果进了垃圾箱。大多数情况下,原因是 SPF、DKIM、DMARC 三个 DNS 记录没配置好。
为什么需要邮件认证
电子邮件协议(SMTP)设计于 1982 年,没有内置的身份验证机制。任何人都可以声称自己是 noreply@google.com 发邮件。
邮件认证的三个标准(SPF / DKIM / DMARC)解决的就是这个问题:证明这封邮件确实来自你的域名,而不是被伪造的。
三个标准各自解决什么问题
graph TD
A[SPF] -->|"这台服务器有资格
代表我的域名发邮件吗?"| B[验证发送方 IP] C[DKIM] -->|"这封邮件在传输过程中
有没有被篡改?"| D[邮件内容签名验证] E[DMARC] -->|"SPF 或 DKIM 验证失败了,
邮件应该怎么处理?"| F[策略 + 报告机制]
代表我的域名发邮件吗?"| B[验证发送方 IP] C[DKIM] -->|"这封邮件在传输过程中
有没有被篡改?"| D[邮件内容签名验证] E[DMARC] -->|"SPF 或 DKIM 验证失败了,
邮件应该怎么处理?"| F[策略 + 报告机制]
| 标准 | 验证方式 | 存储位置 | 作用 |
|---|---|---|---|
| SPF | 检查发件服务器 IP | DNS TXT 记录 | 声明哪些 IP/服务允许代表你发邮件 |
| DKIM | 检查邮件数字签名 | DNS TXT 记录(公钥)+ 邮件头(签名) | 防止邮件内容被篡改 |
| DMARC | 组合 SPF + DKIM 结果 | DNS TXT 记录 | 定义验证失败时的处理策略 |
SPF(Sender Policy Framework)
原理:
- 你在 DNS 中声明:
example.com允许哪些服务器发邮件 - 收件服务器收到邮件,查
example.com的 SPF 记录 - 检查发件服务器 IP 是否在允许列表中
- 通过 → 加分;失败 → 扣分或拒绝
SPF 记录格式:
v=spf1 [机制] [修饰符]
| 机制 | 说明 | 示例 |
|---|---|---|
ip4: | 允许指定 IP 发送 | ip4:203.0.113.0/24 |
include: | 包含另一个域名的 SPF | include:_spf.google.com |
a | 允许域名 A 记录对应的 IP | a |
mx | 允许 MX 记录对应的服务器 | mx |
~all | 其他来源软拒绝(标记为可疑) | 结尾用 |
-all | 其他来源硬拒绝 | 结尾用(严格) |
?all | 中性,不影响判断 | 测试时用 |
常见 SPF 记录示例:
# 使用 Google Workspace 发邮件
"v=spf1 include:_spf.google.com ~all"
# 使用 Google + SendGrid
"v=spf1 include:_spf.google.com include:sendgrid.net ~all"
# 使用 Mailgun
"v=spf1 include:mailgun.org ~all"
DKIM(DomainKeys Identified Mail)
原理:
- 发件服务器用私钥对邮件签名,签名附在邮件头中
- 你在 DNS 中发布对应的公钥
- 收件服务器用 DNS 中的公钥验证签名
- 签名有效 → 邮件内容未被篡改,来自授权服务器
DKIM 记录格式:
# DNS 中的 DKIM 记录
类型: TXT
名称: selector._domainkey.example.com
值: "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBA..."(公钥)
其中 selector 是选择器(通常是 google、mail、default 等,由邮件服务提供商指定)。
不同邮件服务的 DKIM 配置: - Google Workspace:后台生成 DKIM 密钥 → 复制 TXT 值到 DNS - SendGrid:账户设置 → Sender Authentication → 按步骤添加 DNS 记录 - Mailgun:Domains → 按提示添加 DNS 记录
DMARC(Domain-based Message Authentication, Reporting & Conformance)
原理:
DMARC 不直接验证,而是定义策略:当 SPF 和 DKIM 验证失败时,收件方应该怎么处理这封邮件?
DMARC 记录格式:
类型: TXT
名称: _dmarc.example.com
值: "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
| 参数 | 说明 |
|---|---|
p=none | 仅报告,不处理(测试阶段使用) |
p=quarantine | 验证失败的邮件放入垃圾箱 |
p=reject | 验证失败的邮件直接拒绝 |
rua= | 汇总报告发送到哪个邮箱 |
pct=50 | 只对 50% 的邮件应用策略(渐进推进时用) |
推荐部署顺序:
p=none(观察期)→ p=quarantine(过渡期)→ p=reject(严格模式)
下一节:邮件记录配置实战——一步步在 DNS 中配置 SPF、DKIM、DMARC 完整示例。