邮件格式与编码

邮件格式与编码相关问题共 12 问,点击问题展开答案。每条对应一个具体错误码或场景,看完即可操作。

66 怎么读一封邮件的「原始邮件头」(Email Headers)快速诊断投递问题?Received 链、Authentication-Results 里的 SPF/DKIM/DMARC 怎么看?
什么是邮件头

每封邮件携带完整的传输元数据——类似快递包裹上的逐站扫描记录。从发信到收信,每一跳 MTA 在邮件顶部添加一个 Received: 头,最终形成从下到上的完整路由链。此外还包括 SPF/DKIM/DMARC 验证结果、垃圾评分、发件人信息、时间戳等。邮件头是诊断投递问题的第一手证据

如何查看邮件头

Gmail(Web版):打开邮件 → 右上角三点 → 「显示原始邮件」
Outlook 桌面版:双击邮件 → File → Properties → Internet headers 文本框
Outlook.com Web版:打开邮件 → 三点 → 查看 → 查看邮件源
QQ/网易企业邮箱:打开邮件 → 更多 → 查看信头/显示原文

关键字段阅读顺序

1. Received 链(从下往上读)
底部第一条 Received: = 发信人邮件客户端 → 发信服务器(提交阶段)
中间每一条 Received: = 服务器到服务器的转跳
顶部最后一条 Received: = 最后一跳 MTA → 收件人邮箱
每行包含:服务器主机名、IP 地址、时间戳、with 协议(ESMTP/ESMTPS/LMTP)、TLS 加密版本(version=TLS1_2 或 version=TLS1_3)。找到时间跳变大的跳→ 该跳是瓶颈所在。

Authentication-Results(验证结果)

每个收件方服务器会在邮件头中加入一行:
Authentication-Results: mx.google.com; spf=pass smtp.mailfrom=yourdomain.com; dkim=pass header.d=yourdomain.com; dmarc=pass header.from=yourdomain.com
读法:
spf=pass/fail/neutral/softfail:SPF 验证结果——fail 说明发信 IP 不在你的 SPF 允许列表中
dkim=pass/fail/none:DKIM 签名验证结果——fail 说明签名被篡改或签名域名与 From 不匹配
dmarc=pass/fail:DMARC 对齐结果——即使 spf 和 dkim 都 pass,如果域名不对齐仍然 dmarc=fail

X-Spam 系列头(如果存在)

X-Spam-Status: Yes, score=7.8——score 是 SpamAssassin 等垃圾过滤器的评分,≥5 通常判定为垃圾。
X-Spam-Report:列出触发每条规则的得分明细——看哪条规则触发得分最高 → 针对性修改邮件内容。
注意:Gmail 和 Outlook 不对外暴露内部垃圾评分逻辑,仅有自建/开源 MTA 部分会带这些头。

在线分析工具

MXToolbox Email Header Analyzer:把整段原始邮件头粘贴进去 → 自动解析 Received 链、SPF/DKIM 状态、时间线可视化 → 比用手逐行看快很多。Google Admin Toolbox Messageheader 也提供类似功能。

参考:RFC 5322(Internet Message Format)· RFC 8601(Authentication-Results 头格式)· MXToolbox Email Header Analyzer · Google Admin Toolbox

63 发邮件到 Outlook/Hotmail/Microsoft 365 被拒收(550 blocked/access denied),怎么查询 IP 信誉和申诉解除封锁?
Outlook 为什么拒收了我?

微软对所有发往 Outlook.com/Hotmail/Microsoft 365 的邮件按发信 IP 的历史信誉评分——IP 信誉低于阈值→直接拒收(550 5.7.1 / 550 5.7.511 Access denied / blocked)。这和你的 SPF/DKIM 配没配好是两件不同的事——信誉看的是你的发信历史行为(投诉率、发送量、是否群发)。新 IP 或从共享主机发信的 IP 特别容易低信誉。

操作

1. 注册 SNDS(Smart Network Data Services):访问 postmaster.live.com/snds → 用微软账号(Outlook.com/Microsoft 365 账号)登录 → 申请你的 IP 范围的数据访问权限 → 获批后可以看到你 IP 的发信量、投诉率、垃圾邮件陷阱命中数
2. 检查 JMRP(Junk Email Reporting Program):SNDS 里的投诉率来自 JMRP——Outlook 用户的「标记为垃圾邮件」操作次数。投诉率超过 0.1%(每 1000 封邮件超过 1 个投诉)→触发封锁概率大幅上升。
3. 提交解封申请:确认没有发垃圾邮件且修正了问题(如已配置 SPF/DKIM、已预热新 IP、已确认用户是主动订阅不是滥发)→ 通过 postmaster.live.com 的「Delist/Unblock」表单提交 IP 白名单申请→填写:IP 地址、用途描述(如「企业邮件服务器,仅发送事务性通知」)、已修正的问题。
4. 等待处理 3-5 个工作日:解封申请不是立刻生效的 耐心等待。处理期间继续发信只会降低你信誉。
前置条件:解封申请前必须先配置好 SPF 和 DKIM——没配置直接提交申请会被拒绝。
预防:新 IP 先预热再发 Outlook 用户(见 Q9 服务器预热)。

参考:Microsoft SNDS 文档 · Outlook Postmaster · Microsoft Learn NDR 5.7.1 修复指南

65 想在自己邮箱旁边显示公司 Logo(Gmail 头像/BIMI 品牌标识),怎么配置?要不要 VMC 证书?
什么是 BIMI

BIMI(Brand Indicators for Message Identification)让支持该标准的邮箱在收件箱列表里显示发件人的品牌 Logo——你的公司 Logo 出现在用户收件箱中邮件的旁边。当前支持:Gmail(免费/付费版均支持)、Yahoo Mail、Apple Mail、Fastmail 等。
BIMI 不是一个独立认证协议——它必须建立在 DMARC 之上:DMARC 验证通过后,收件方才去查询并显示 Logo。BIMI 不提升投递率也不提升安全性——它纯粹是品牌视觉效果。

前置条件(必须满足)

1. DMARC 策略必须是 p=quarantine 或 p=reject 且 pct=100——p=none 不能用 BIMI
2. SPF 和 DKIM 必须通过
3. Logo 文件必须是 SVG Tiny 1.2 格式(不是专业版 SVG)——用 BIMI SVG 转换工具压缩到 32KB 以下,方形、居中、纯色或渐变
4. Logo 文件托管在 HTTPS 可访问的 URL(如 https://yourdomain.com/logo.svg

VMC 证书:要不要?

Gmail 不需要 VMC 就能显示——如果只需要在 Gmail 中显示 Logo,你甚至不需要 VMC。
Yahoo/Apple Mail 需要 VMC(Verified Mark Certificate)——这是由证书颁发机构(DigiCert/Entrust)签发的品牌认证证书,证明你的 Logo 是合法注册商标。VMC 证书需要付费(约 $1000-1500/年)。
简单版(仅 Gmail):default._bimi.yourdomain.com TXT "v=BIMI1; l=https://yourdomain.com/logo.svg; a=self"→ a=self 表示你自行认证,不依赖 VMC。
完整版(Gmail+Yahoo+Apple):default._bimi.yourdomain.com TXT "v=BIMI1; l=https://yourdomain.com/logo.svg; a=cert"→ a=cert 表示需要 VMC 验证。
a= 字段的可选值在 BIMI 规范中定义。

测试

dig txt default._bimi.yourdomain.com 验证 DNS 记录→ MXToolbox BIMI Checker 检查完整配置→ 发一封测试邮件到 Gmail 检查是否显示 Logo(通常几小时内生效)。注意:Logo 首次出现可能需要 Gmail 缓存刷新——不同收件人看到的速度不同。

参考:BIMI Group 规范(bimigroup.org)· Adobe BIMI 实施文档 · Amazon SES BIMI 文档 · MXToolbox BIMI Checker

67 自建 Postfix 发邮件报错 554 5.7.1 Relay access denied,怎么修复?
这是什么问题

554 5.7.1 Relay access denied 表示 SMTP 服务器拒绝中继。Open Relay 是垃圾邮件主要来源,Postfix 默认禁止 relay。

修复

Step 1:确认发信人来源
来自外部客户端(Thunderbird/Outlook)需启用 SMTP AUTH:/etc/postfix/main.cfsmtpd_sasl_auth_enable=yes
来自同机 Web 应用(PHP/Python)加到 mynetworks:mynetworks = 127.0.0.0/8, 192.168.1.0/24, ::1

Step 2:确认收件域
自己的域名加到 mydestination:mydestination = yourdomain.com
代收域名加到 relay_domains

重启:service postfix restart。测试:telnet localhost 25 验证。
Exchange:管理中心-邮件流-接收连接器-匿名用户权限。

参考:Postfix 文档 · RFC 5321 3.8.2 · Red Hat KB 1282193

68 退信 550/553 HELO/EHLO hostname does not match,怎么修复?
问题

收件方检查 HELO 主机名合法性。退信:553 5.7.1 HELO hostname does not match。

修复

1. myhostname 必须是全限定域名(FQDN)在 DNS 有 A 记录
2. NAT 后面用 smtp_helo_name = mail.yourdomain.com 强制 HELO 名称
3. PTR 反向 DNS 与正向 A 一致
4. 检查防火墙是否改写 HELO 名称

参考:RFC 5321 4.1.1.1 · Postfix main.cf · PTR 反向 DNS

69 邮件系统 SMTP 报错 535 5.7.8 / 低安全性应用已禁用,怎么办?
背景

Google 2025 年关闭低安全性应用方式。

方案 A:应用专用密码

1. 开启两步验证
2. Google 账号-安全-应用密码,生成 16 位密码
3. 客户端替换原密码
4. SMTP: smtp.gmail.com 端口 587(TLS)

方案 B:OAuth 2.0 / XOAUTH2

用于程序发信,需 Google Cloud Console 创建 OAuth 客户端 ID。免费 Gmail 日限额约 500 封,批量发信用 Google Workspace 或 SendGrid。

参考:Google Account 安全设置 · Google Workspace OAuth 2.0 文档

71 TLS 握手失败(STARTTLS required / certificate verify failed),怎么排查?
症状

退信:530 5.7.0 Must issue STARTTLS / 554 5.7.5 TLS required / Server certificate SAN mismatch。

修复

1. Postfix 设 smtpd_tls_security_level = may 启用 TLS
2. Let's Encrypt 免费证书:sudo certbot certonly --standalone -d mail.domain.com
3. 配置 smtpd_tls_cert_file = fullchain.pem(含中间证书,不能用 cert.pem)
4. 证书 SAN 必须匹配域名,避免自签名证书
5. openssl s_client -connect host:25 -starttls smtp 检查链

参考:RFC 3207 SMTP STARTTLS · RFC 8461 MTA-STS · Let's Encrypt Certbot

37 退信提示"550 5.6.11 BareLinefeedsAreIllegal"或"message contains bare linefeeds",邮件被 Exchange/Outlook 拒收,怎么修?
原因

邮件正文行尾格式不符合 SMTP 规范。SMTP 要求每行以 CR+LF( ,回车+换行)结尾,但你的邮件用了纯 LF( )——俗称"裸换行"。常见于 Linux/Unix 系统或程序直接用 而非 拼接邮件内容。Exchange Online 和部分严格 MTA 会直接拒收。

操作

1. 代码中确保邮件正文每行以 结尾。
2. PHP:$body = preg_replace('/(?<!\r)\n/', "\r\n", $body);
3. Python:body = body.replace('\n', '\r\n') — 注意不要在已含 的数据上再运行。
4. Postfix 自建服务器:在 main.cfsmtp_fix_bare_newlines = yes 自动修复。
5. 确认邮件库(PHPMailer、nodemailer 等)为最新版本。

参考:RFC 5321 §2.3.7 / §4.1.1.4(CRLF 行尾要求)· Microsoft Learn NDR 5.6.11

38 退信提示"450 4.7.1 Client host rejected: cannot find your hostname"或"PTR record setup",怎么解决?
原因

收件方服务器对发信 IP 做了反向 DNS 查询(PTR 查询),但没有找到 PTR 记录,或 PTR 记录指向的域名无法正向解析回同一 IP。PTR 是 IP→域名的映射,由 IP 归属方(ISP/IDC/VPS 商)设置,你不能自己在 DNS 控制台设。Gmail、Outlook、QQ 邮箱等大型服务常要求有 PTR 作为基本反垃圾手段。

操作

1. 联系你的 VPS 或服务器提供商(如阿里云/腾讯云/AWS),要求为发信 IP 添加 PTR 记录。
2. PTR 指向的域名应与你的邮件服务器 HELO/EHLO 主机名一致(如 mail.yourdomain.com)。
3. 该域名必须有 A 记录能正向解析回同一 IP(正向+反向一致)。
4. 验证:nslookup <IP> 返回域名 → nslookup <域名> 返回同一 IP。
5. 如用家庭宽带/动态 IP → PTR 通常无法设置,改用邮件中继服务(如 SendGrid/Mailgun)。

参考:RFC 1912 §2.1(PTR 记录)· RFC 5321 §4.1.1.1(HELO 验证)· Gmail 发件人指南

39 发邮件退信"550 5.7.25 The IP address sending this message does not have a PTR record",如何修复?
原因

Gmail 从 2023 年底起对批量发件人强制要求发信 IP 有有效的 PTR 记录,这是"Gmail 发件人指南"中"IP 实践"的一部分。错误码 5.7.25 专指 PTR 缺失或不一致。

操作

1. 联系 IP 提供商为发信 IP 设置 PTR 记录(参见上一条 FAQ 38 的操作步骤)。
2. PTR 指向的域名必须能正向解析回同一 IP。
3. 发信 HELO/EHLO 主机名必须与 PTR 域名一致。
4. 用 MXToolbox Reverse Lookup 验证 PTR 是否生效。
5. 连带检查:SPF、DKIM、DMARC 是否全部配好 — Gmail 5.7.26 会在缺少 DKIM/DMARC 时拒收。
6. 注册 Google Postmaster Tools 监控域名信誉和投递率。
7. 如果是新 IP 新域名,需要预热后再大量发送(参见 FAQ 1)。

参考:Gmail 发件人指南 · RFC 1912 · RFC 7489 (DMARC)

40 退信"552 5.2.2 Over quota"或"552 5.3.4 Message size exceeds fixed maximum message size",邮件发不出去怎么办?
原因

两类错误:5.2.2 Over quota = 收件人邮箱存储空间已用完;5.3.4 = 邮件大小(含附件)超过收件方服务器的接收上限。常见接收限制:Gmail 25MB、Outlook/Hotmail 25MB、常见免费邮箱 50MB、大部分企业邮箱 10-50MB。

操作

1. 检查附件总大小 — 注意 Base64 编码会使实际传输体积增大约 33%。
2. 大附件改用云盘链接:上传到 Google Drive、OneDrive、阿里云盘或奶牛快传,邮件中只放分享链接。
3. 如果提示 Over quota:通知收件人清空邮箱或升级容量。
4. 需要发送数百 MB 文件:用专业大文件传输服务(如 WeTransfer)。
5. 自建服务器:在 Postfix 中用 message_size_limit 控制发出邮件大小。

参考:RFC 5321 §4.5.3.1(SIZE 扩展)· Gmail 附件限制 · Outlook 收发限制

41 SMTP 发信报错"535 5.7.8 Authentication failed"或"535 5.7.139 Authentication unsuccessful",认证总是失败怎么排查?
原因

SMTP 用户名或密码未通过服务器验证。最常见 6 种原因:(1) 使用了网页登录密码而非 SMTP 授权码/客户端专用密码;(2) 用户名格式错误;(3) 邮箱开启了二次验证但没生成应用专用密码;(4) 服务器地址或端口/加密方式配错;(5) 账户因异常活动被临时锁定;(6) IP/客户端被服务商标记为不安全。

操作

1. Gmail:需开启二次验证 → 在 Google 账户 → 安全性 → App passwords 生成应用专用密码。
2. QQ 邮箱:设置 → 账户 → POP3/SMTP 服务 → 生成授权码。
3. 常见免费邮箱:设置 → POP3/SMTP/IMAP → 客户端授权密码。
4. 企业邮箱:部分服务 SMTP 密码与网页登录密码独立设置。
5. 确认用户名:大多数服务需要完整邮箱地址(如 user@gmail.com),少数只要 @ 前部分。
6. 确认端口和加密:SMTP SSL 用 465、STARTTLS 用 587、无加密用 25。
7. 如多次失败账户被锁:检查邮箱是否有安全提醒邮件,按提示解锁。
8. 测试连接:openssl s_client -connect smtp.xxx.com:465 -crlf 然后 EHLO test AUTH LOGIN 手工测试。

参考:RFC 4954 (SMTP AUTH) §4 · Gmail App Passwords · 邮件系统帮助文档