一、SMTP 如何确定投递目标
根据 RFC 5321 §5.1,发送方 MTA 通过 DNS 查询确定收件域的邮件服务器,流程如下:
- 查询收件域的 MX 记录,按优先级依次尝试连接。
- 如果没有 MX 记录,则回退到域名自身的 A/AAAA 记录,将其视为优先级为 0 的隐式 MX。
- 如果配置了 Null MX(
MX 0 .),表示该域不接收邮件,发送方必须返回永久错误,不再尝试 A/AAAA。
注意:只要存在 MX 记录,即使所有 MX 服务器都无法连接,也不能回退到域名自身的 A/AAAA。 应按照 MX 优先级重试或排队。
二、没有 MX,但配置了 CNAME
假设 DNS 配置如下:
alias.example. CNAME real.example.
real.example. MX 10 mx.real.example.
mx.real.example. A 192.0.2.10
当发送邮件到 user@alias.example 时,MTA 会跟随 CNAME,使用目标域名重新执行邮件路由查询:
- 查询
alias.example,发现其为 CNAME。 - 跟随别名查询
real.example。 - 找到
real.example的 MX 记录。 - 解析 MX 主机的 A/AAAA,连接目标服务器的 25 端口。
因此,邮件最终投递到 real.example 的 MX 服务器,而不是 alias.example 自身的 IP。
这里有两个限制:
- CNAME 具有独占性,不能与 MX 等其他普通记录共存。
- MX 指向的邮件服务器主机名必须解析到 A/AAAA,不能再通过 CNAME 间接指向其他主机(RFC 2181 §10.3)。
三、回复地址由什么决定?
DNS 决定邮件投递目标,但不决定用户回复时使用哪个地址。
| 邮件头 | 作用 |
|---|---|
From |
发件人地址,也是默认回复地址 |
Reply-To |
指定回复地址,优先于 From |
Return-Path |
记录原始信封发件地址,用于退信处理 |
例如:
From: sender@alias.example
Reply-To: support@real.example
Return-Path: bounce@bounce.example
用户点击回复,邮件发往 support@real.example;投递失败产生 DSN(投递状态通知)时,则发送到原始 SMTP 信封的反向路径(MAIL FROM)。
因此,域名没有 MX 不会改变回复地址,只会影响邮件能否成功投递。
四、实际运维建议
根据业务场景选择 DNS 配置:
1. CNAME 别名
alias.example. CNAME real.example.
适合域名迁移、别名等场景,但不建议关键收信业务完全依赖 CNAME 间接路由。
2. 显式配置 MX(推荐)
alias.example. MX 10 mx.real.example.
mx.real.example. A 192.0.2.10
路由明确,兼容性更好,也便于排查问题。
3. 明确不接收邮件
alias.example. MX 0 .
使用 Null MX 明确声明不接收邮件,避免 A/AAAA 被当作隐式 MX。
另外,纯发信子域(如 bounce.example.com)也建议配置可用 MX,确保退信能够正常接收和处理。
五、总结
SMTP 邮件路由遵循 MX 优先、A/AAAA 兜底的原则;没有 MX 但存在 CNAME 时,会跟随别名继续查询目标域的邮件路由。
DNS 决定邮件投递到哪里,邮件头决定用户回复给谁,SMTP 信封决定退信发往哪里。 这三个层次需要分开理解和配置。