SMTP 邮件路由与 DNS 解析

一、SMTP 如何确定投递目标

根据 RFC 5321 §5.1,发送方 MTA 通过 DNS 查询确定收件域的邮件服务器,流程如下:

  1. 查询收件域的 MX 记录,按优先级依次尝试连接。
  2. 如果没有 MX 记录,则回退到域名自身的 A/AAAA 记录,将其视为优先级为 0 的隐式 MX。
  3. 如果配置了 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,使用目标域名重新执行邮件路由查询:

  1. 查询 alias.example,发现其为 CNAME。
  2. 跟随别名查询 real.example。
  3. 找到 real.example 的 MX 记录。
  4. 解析 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 信封决定退信发往哪里。 这三个层次需要分开理解和配置。

如果你有魔法,你可以看到一个评论框~