RFC 7505:空MX记录 — 域名无服务
ELI5: 有些房子没有邮箱,因为他们不想收邮件。在Null MX出现之前,邮递员仍然会走到门口、敲门、等待、没人应答,然后走回去——浪费了每个人的时间。Null MX就像草坪上的一个标志,上面写着"这里没有邮箱。别费力了。"邮递员看到标志就立即离开。
为什么需要这个
并非每个域都接收电子邮件。仅用于网站、API、CDN 或品牌保护注册的域不需要入站邮件。但在 RFC 7505 之前,没有简洁的方式在 DNS 中声明"此域不接受电子邮件"。
没有明确的信号,发送服务器在遇到寄往不收邮件的域的邮件时会:
- 回退到 A/AAAA 记录。根据 RFC 5321,如果不存在 MX 记录,发送者尝试投递到域的 A 或 AAAA 地址。此连接尝试失败(没有 SMTP 服务器监听),但仅在超时后才失败——通常是 30 多秒。
- 生成反向散射。如果垃圾邮件发送者伪造不收邮件的域上的返回地址,退回的垃圾邮件通知 (DSN) 会发送到伪造的地址。域的 A 记录接受 TCP 连接(这是一个网络服务器),但 SMTP 对话失败。发送服务器会排队重试数小时或数天。
- 浪费资源。每个失败的投递尝试都会消耗 DNS 查询、TCP 连接和发送服务器上的队列插槽。
RFC 7505 引入了空 MX 记录:单个 MX 条目,优先级为 0,目标为 .(根域)。这告诉任何发送服务器:"此域没有邮件服务。不要尝试。"
工作原理
空 MX 记录
; 空 MX — 声明 no-mail.example.com 不接受电子邮件
no-mail.example.com. IN MX 0 .
该记录有两个定义特征:
- 优先级 0:最低可能的优先级,确保此记录最先处理(并且,由于它是唯一的 MX,最后处理)。
-
目标
.(点):DNS 根标签。这不是有效的主机名,无法解析为 IP 地址。这是 DNS 中/dev/null的等价物。
发送者行为
当发送服务器查找收件人域的 MX 记录并找到空 MX 时:
- 它识别
.目标为空 MX。 - 它立即生成永久性故障 (5.1.0 — "其他地址状态"),不尝试任何 SMTP 连接。
- 发送者向原始发送者返回退回(或如果它本身是退回消息,则丢弃该消息)。
# 发送服务器在遇到空 MX 时的做法:
# 1. DNS 查询
dig MX no-mail.example.com
no-mail.example.com. IN MX 0 .
# 2. 立即拒绝 — 未尝试 SMTP 连接
# 生成状态代码为 5.1.0 的 DSN:
550 5.1.0 <user@no-mail.example.com>: Domain does not accept mail
对比:没有空 MX
没有空 MX,当邮件发送到没有 MX 记录的域时会发生的情况:
# DNS 查询 — 未找到 MX 记录
dig MX web-only.example.com
(无应答)
# RFC 5321 回退:尝试 A 记录
dig A web-only.example.com
web-only.example.com. IN A 93.184.216.34
# 尝试连接到网络服务器的 SMTP
telnet 93.184.216.34 25
(连接被拒绝或在 30 多秒后超时)
# 排队等待重试,15 分钟后重试,1 小时,4 小时……
# 最终在 1-5 天后放弃并退回
关键技术细节
空 MX 的规则
- 空 MX 必须是该域的唯一 MX 记录。不能将空 MX 与真实 MX 记录混合。
- 优先级值必须是 0。
- 目标必须恰好是
.(单个点,DNS 根)。 - 如果发送者遇到空 MX,它不能回退到 A/AAAA 记录。空 MX 是最终的。
结合 SPF 和 DMARC
对于不发送或不接收电子邮件的域,空 MX 应该是完整的无邮件 DNS 配置的一部分:
; 域的完整"无邮件"DNS 配置
; 1. 空 MX — 立即拒绝入站邮件
no-mail.example.com. IN MX 0 .
; 2. SPF — 没有服务器被授权发送
no-mail.example.com. IN TXT "v=spf1 -all"
; 3. DMARC — 拒绝任何声称来自此域的内容
_dmarc.no-mail.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; rua=mailto:dmarc@example.com"
; 4. 空 DKIM 密钥(可选,表示不签名)
*._domainkey.no-mail.example.com. IN TXT "v=DKIM1; p="
这个组合提供了全面的保护:空 MX 停止入站投递尝试,SPF -all 告诉接收者拒绝伪造的出站邮件,DMARC p=reject 强制执行该策略并提供报告。
SMTP 响应代码
| 状态 | 代码 | 含义 |
|---|---|---|
5.1.0 |
550 | 其他地址状态 — 域不接受邮件(空 MX) |
5.1.2 |
550 | 坏目标系统地址 — 某些实现使用的替代代码 |
5.1.10 |
550 | 收件人地址有空 MX(在 RFC 7505 中专门定义) |
对 SMTP VRFY 和 EXPN 的影响
如果服务器被要求验证或扩展空 MX 域处的地址,它应该返回永久性故障。不接受邮件的域处没有有效的收件人地址。
常见错误
-
将空 MX 与真实 MX 记录混合。空 MX 必须是唯一的 MX 记录。在
MX 10 mail.example.com旁边添加MX 0 .会创建无效配置。某些解析器可能会忽略空 MX;其他可能会拒绝所有邮件。 - 在发送电子邮件的域上使用空 MX。空 MX 仅影响入站邮件。但许多服务为发送和接收使用同一域。如果在发送域上设置空 MX,您将不会收到退回、投递状态通知或对邮件的回复。
-
忘记 SPF 和 DMARC。空 MX 阻止入站投递,但它不会阻止某人伪造该域作为发送者。始终将空 MX 与
v=spf1 -all和v=DMARC1; p=reject配对。 -
使用
MX 0 localhost而不是空 MX。某些管理员使用虚假主机名而不是.。这不作为空 MX 工作。发送者将尝试解析"localhost"并可能连接到他们自己的回环接口,创建邮件循环。 -
不应用于子域。如果
example.com有适当的 MX 记录但unused.example.com没有,请在子域上明确设置空 MX。子域不从父域继承 MX 记录。 - 假设所有发送者都支持空 MX。RFC 7505 被主要 MTA(Postfix、Exim、sendmail、Exchange)很好地支持,但某些较旧或小众系统可能不会识别它,而是会回退到 A/AAAA 查询。
可投递性影响
- 更快的退回处理。当发送者遇到空 MX 时,它立即退回,而不是排队等待数小时或数天重试。这减少了发送基础设施上的队列压力,并为原始发送者提供更快的反馈。
- 消除反向散射。在空 MX 域处伪造返回路径地址的垃圾邮件发送者不会触发投递尝试。这保护域不被定向到错误地址的退回所淹没,并保护发送服务器不浪费资源在不可投递的反向散射上。
- 未使用域的品牌保护。注册多个域以进行品牌保护的组织可以在每个未使用的域上设置空 MX + SPF + DMARC,防止它们被用于网络钓鱼。
- 减少 DNS 和网络负载。没有空 MX,发送服务器可能在放弃前数小时内进行多次连接尝试。空 MX 用单个 DNS 查询消除了所有这些尝试。
- 清晰的发送基础设施。对于电子邮件服务提供商,空 MX 减少了出站队列中不可投递邮件的数量,为合法投递释放资源,并改进整体吞吐量。