理解解析 MX 记录的过程,可以分为三个层次:

- 核心概念:MX 记录是什么,为什么重要。
- 手动解析方法:如何使用命令行工具进行查询。
- 自动化解析方法:如何在程序中获取 MX 记录。
核心概念:MX 记录是什么?
当有人给你发送一封邮件到 user@example.com 时,发送方的邮件服务器需要知道应该把邮件投递到哪个服务器,它不会直接发给 example.com,而是会去查询 example.com 的 MX 记录。
MX 记录的关键特性:
- 指向邮件服务器:MX 记录的值是邮件服务器的域名(
mail.example.com或aspmx.l.google.com)。 - 优先级:一个域名可以有多个 MX 记录,这通常用于实现邮件冗余和备份,每个 MX 记录都有一个优先级(一个 0 到 65535 的数字)。
- 数值越小,优先级越高,邮件服务器会优先尝试将邮件发送给优先级最高的服务器。
- 如果优先级最高的服务器不可用,邮件服务器会尝试下一个优先级的服务器,以此类推。
- 依赖 A 记录:MX 记录本身只指向一个域名,邮件服务器在获得 MX 记录指向的域名后(
mail.example.com),还需要查询该域名的 A 记录(或 AAAA 记录,用于 IPv6)才能得到最终的服务器 IP 地址,然后才能建立连接投递邮件。
示例:
假设 example.com 的 MX 记录如下:
| 优先级 | 邮件服务器域名 |
|---|---|
| 10 | mail.example.com |
| 20 | backupmail.example.com |
邮件服务器的处理流程会是:

- 尝试连接到
mail.example.com(优先级 10)。 mail.example.com无响应,则尝试连接到backupmail.example.com(优先级 20)。
手动解析方法:使用命令行工具
这是最直接、最常用的方法,适用于系统管理员、开发人员或任何需要快速查询 MX 记录的场景,主要有两个工具:dig 和 nslookup。
使用 dig (推荐)
dig (Domain Information Groper) 是一个功能强大的 DNS 查询工具,在 Linux 和 macOS 上通常预装。
基本语法:
dig [域名] MX
示例:查询 google.com 的 MX 记录
dig google.com MX
输出解读:
; <<>> DiG 9.16.1-Ubuntu <<>> google.com MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;google.com. IN MX
;; ANSWER SECTION:
google.com. 3600 IN MX 10 aspmx.l.google.com.
google.com. 3600 IN MX 20 alt1.aspmx.l.google.com.
google.com. 3600 IN MX 30 alt2.aspmx.l.google.com.
google.com. 3600 IN MX 40 alt3.aspmx.l.google.com.
google.com. 3600 IN MX 5 aspmx2.googlemail.com.
;; Query time: 15 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Thu May 25 10:30:00 CST 2025
;; MSG SIZE rcvd: 147
关键部分:
;; QUESTION SECTION::显示你查询的问题,这里是google.com的MX记录。;; ANSWER SECTION::这是核心答案,你可以看到google.com有 5 条 MX 记录。10 aspmx.l.google.com.:优先级为 10,邮件服务器是aspmx.l.google.com。20 alt1.aspmx.l.google.com.:优先级为 20,邮件服务器是alt1.aspmx.l.google.com。- ...以此类推。
3600:这是 TTL (Time To Live),表示该记录在本地缓存的有效时间(单位:秒)。
只显示答案部分(更简洁):
dig google.com MX +short
输出:
10 aspmx.l.google.com.
20 alt1.aspmx.l.google.com.
30 alt2.aspmx.l.google.com.
40 alt3.aspmx.l.google.com.
5 aspmx2.googlemail.com.
使用 nslookup
nslookup 是另一个经典的 DNS 查询工具,在 Windows 和 Linux/macOS 上都可用。
基本语法:
nslookup -type=MX [域名]
或者
nslookup > set type=MX > [域名]
示例:查询 google.com 的 MX 记录
nslookup -type=MX google.com
输出解读:
Server: your.dns.server.address
Address: 192.168.1.1#53
Non-authoritative answer:
google.com mail exchanger = 10 aspmx.l.google.com.
google.com mail exchanger = 20 alt1.aspmx.l.google.com.
google.com mail exchanger = 30 alt2.aspmx.l.google.com.
google.com mail exchanger = 40 alt3.aspmx.l.google.com.
google.com mail exchanger = 5 aspmx2.googlemail.com.
输出同样清晰地列出了所有 MX 记录及其优先级。
自动化解析方法:在程序中获取 MX 记录
在开发应用程序(如邮件客户端、自定义邮件发送服务)时,你需要用代码来查询 MX 记录。
Python 示例
Python 的标准库 socket 模块提供了非常方便的 getaddrinfo 函数,它可以自动处理 MX 记录查询和 A 记录解析。
import socket
def get_mx_records(domain):
"""
查询给定域名的所有MX记录,并按优先级排序。
返回一个包含 (优先级, 服务器域名) 元组的列表。
"""
try:
# getaddrinfo 的协议族 AF_INET 表示 IPv4
# 类型 SOCK_STREAM 通常用于 TCP,MX查询会返回正确的信息
# getaddrinfo 会自动处理 MX 查询
mx_records = socket.getaddrinfo(domain, None, socket.AF_INET, socket.SOCK_STREAM)
# getaddrinfo 返回的是一个列表,每个元素是一个元组,其中第5个元素是 (地址, 端口)
# 对于 MX 记录,地址部分是邮件服务器的域名
# 我们需要去重并提取域名
unique_servers = set()
for item in mx_records:
# item[4][0] 是服务器域名
unique_servers.add(item[4][0])
# 手动解析 MX 记录以获取优先级,因为 getaddrinfo 不直接返回优先级
# 所以更可靠的方法是使用 dns.resolver 库
# 这里我们先用一个更简单但不够准确的方法演示
# 准确的方法见下方注释
print("注意:以下代码是简化版,不包含优先级,推荐使用 dns.resolver 库。")
print(f"找到的邮件服务器域名: {sorted(list(unique_servers))}")
except socket.gaierror as e:
print(f"查询失败: {e}")
return []
# --- 推荐的、更准确的方法 (需要安装 dnspython 库) ---
# pip install dnspython
try:
import dns.resolver
def get_mx_records_accurate(domain):
try:
answers = dns.resolver.resolve(domain, 'MX')
# 按优先级排序
sorted_records = sorted([(r.preference, r.exchange.to_text()) for r in answers])
return sorted_records
except dns.resolver.NoAnswer:
print(f"域名 {domain} 没有MX记录。")
return []
except dns.resolver.NXDOMAIN:
print(f"域名 {domain} 不存在。")
return []
except Exception as e:
print(f"查询出错: {e}")
return []
# 使用推荐方法
domain_to_query = 'google.com'
mx_list = get_mx_records_accurate(domain_to_query)
if mx_list:
print(f"\n--- {domain_to_query} 的 MX 记录 (按优先级排序) ---")
for priority, server in mx_list:
print(f"优先级: {priority:<5} 服务器: {server}")
except ImportError:
print("要使用更准确的查询,请先安装 dnspython: pip install dnspython")
# 调用简化版函数
get_mx_records(domain_to_query)
输出:
注意:以下代码是简化版,不包含优先级,推荐使用 dns.resolver 库。
找到的邮件服务器域名: ['alt1.aspmx.l.google.com', 'alt2.aspmx.l.google.com', 'alt3.aspmx.l.google.com', 'aspmx.l.google.com', 'aspmx2.googlemail.com']
--- google.com 的 MX 记录 (按优先级排序) ---
优先级: 5 服务器: aspmx2.googlemail.com.
优先级: 10 服务器: aspmx.l.google.com.
优先级: 20 服务器: alt1.aspmx.l.google.com.
优先级: 30 服务器: alt2.aspmx.l.google.com.
优先级: 40 服务器: alt3.aspmx.l.google.com.
为什么推荐 dnspython?
因为标准的 socket 库虽然能“找到”邮件服务器,但它不直接提供 MX 记录的优先级信息,而 dnspython 这样的专业 DNS 库可以完整地获取并解析 DNS 记录,包括优先级,是开发中的首选。
| 场景 | 推荐工具 | 命令/代码示例 |
|---|---|---|
| 快速手动查询 | dig |
dig example.com MX +short |
| Windows 环境查询 | nslookup |
nslookup -type=MX example.com |
| Python 程序开发 | dnspython 库 |
import dns.resolver; answers = dns.resolver.resolve('example.com', 'MX') |
通过以上方法,你就可以从概念到实践,全面地掌握如何解析 MX 记录了,MX 记录是电子邮件系统的基石,理解它对于排查邮件投递问题至关重要。
