邮件格式与编码
邮件格式与编码相关问题共 12 问,点击问题展开答案。每条对应一个具体错误码或场景,看完即可操作。
每封邮件携带完整的传输元数据——类似快递包裹上的逐站扫描记录。从发信到收信,每一跳 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: 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-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
微软对所有发往 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 修复指南
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)
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
554 5.7.1 Relay access denied 表示 SMTP 服务器拒绝中继。Open Relay 是垃圾邮件主要来源,Postfix 默认禁止 relay。
Step 1:确认发信人来源
来自外部客户端(Thunderbird/Outlook)需启用 SMTP AUTH:/etc/postfix/main.cf 设 smtpd_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
收件方检查 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
Google 2025 年关闭低安全性应用方式。
1. 开启两步验证
2. Google 账号-安全-应用密码,生成 16 位密码
3. 客户端替换原密码
4. SMTP: smtp.gmail.com 端口 587(TLS)
用于程序发信,需 Google Cloud Console 创建 OAuth 客户端 ID。免费 Gmail 日限额约 500 封,批量发信用 Google Workspace 或 SendGrid。
参考:Google Account 安全设置 · Google Workspace OAuth 2.0 文档
退信: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
邮件正文行尾格式不符合 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.cf 加 smtp_fix_bare_newlines = yes 自动修复。
5. 确认邮件库(PHPMailer、nodemailer 等)为最新版本。
参考:RFC 5321 §2.3.7 / §4.1.1.4(CRLF 行尾要求)· Microsoft Learn NDR 5.6.11
收件方服务器对发信 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 发件人指南
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)
两类错误: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 收发限制
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 · 邮件系统帮助文档
