第七章 邮件格式标准详解
一封标准的互联网邮件由两部分组成:邮件头(Header)和邮件体(Body),中间用一个空行分隔。所有邮件都遵循RFC 5322定义的标准格式,本章将详细讲解邮件的格式规范和各种扩展。
4.1 邮件格式概述
4.1.1 基本结构
[邮件头]
<空行>
[邮件体]
4.1.2 格式特点
- 所有内容都是7位ASCII文本(二进制内容通过MIME编码)
- 每行不超过998个字符,推荐不超过78个字符
- 行结束符是
<CRLF>(\r\n) - 邮件头每行由字段名、冒号、空格和字段值组成
- 长字段可以折叠到下一行,前面加空格或制表符
4.2 邮件头详解
邮件头包含邮件的所有元数据:发件人、收件人、主题、日期、传输路径、签名信息等。邮件头是在传输过程中逐步添加的,每个经过的MTA服务器都会添加Received头。
4.2.1 必选头字段
From:发件人
指定邮件的发件人地址和姓名。
From: 张三 <[email protected]>
From: [email protected]
To:主收件人
指定邮件的主要收件人,可以有多个。
To: 李四 <[email protected]>, 王五 <[email protected]>
Date:发送日期
邮件的发送时间,遵循RFC 5322日期格式。
Date: Tue, 12 Mar 2024 10:30:00 +0800
格式说明:星期, 日 月 年 时:分:秒 时区
Subject:邮件主题
邮件的标题,可以包含中文和特殊字符(需要编码)。
Subject: 2024年第一季度工作计划
非ASCII主题需要使用编码格式:
Subject: =?UTF-8?B?MjAyNOWbveWcsOS4i+iDveWKoOWvhueggQ==?=
编码格式:=?charset?encoding?encoded-text?=
- encoding:B表示Base64,Q表示Quoted-Printable
Message-ID:邮件唯一标识符
每封邮件的全局唯一ID,通常由发件服务器生成。
Message-ID: <[email protected]>
格式:<唯一字符串@域名>
4.2.2 常用可选头字段
Cc:抄送收件人
Carbon Copy,抄送人会收到邮件,其他收件人可以看到抄送列表。
Cc: [email protected]
Bcc:密送收件人
Blind Carbon Copy,密送人会收到邮件,但其他收件人看不到密送列表。
Reply-To:回复地址
指定回复邮件时默认发送到的地址,可以和发件人不同。
Reply-To: [email protected]
In-Reply-To:回复的邮件ID
用于邮件线程,指定这封邮件是回复哪封邮件的。
In-Reply-To: <[email protected]>
References:相关邮件ID列表
用于邮件线程,列出所有相关的邮件ID。
References: <[email protected]> <[email protected]>
MIME-Version:MIME版本
表明邮件使用MIME格式。
MIME-Version: 1.0
Content-Type:内容类型
指定邮件体的类型和格式,详细说明见第3章MIME协议部分。
Content-Type: text/plain; charset=utf-8
Content-Type: multipart/mixed; boundary="----=_Boundary_123"
Content-Transfer-Encoding:内容传输编码
指定邮件体的编码方式。
Content-Transfer-Encoding: base64
Content-Transfer-Encoding: quoted-printable
Received:接收记录
每个经过的MTA服务器都会添加一个Received头,记录邮件的传输路径,是排查邮件问题的重要依据。
Received: from mail.example.com (mail.example.com [192.168.1.100])
by mx.google.com with ESMTPS id abc123
for <[email protected]>; Tue, 12 Mar 2024 10:30:01 -0700 (PDT)
包含信息:发送服务器、接收服务器、时间、协议、ID等。
Return-Path:退信地址
指定邮件发送失败时退信发送到的地址。
Return-Path: <[email protected]>
X-Priority:邮件优先级
指定邮件的优先级:1(最高)到5(最低),3是普通。
X-Priority: 1 (Highest)
X-Mailer:发送邮件客户端
发送邮件使用的客户端软件。
X-Mailer: Microsoft Outlook 16.0
X-Mailer: Apple Mail (3696.120.41.1.1)
4.2.3 自定义头字段
所有以X-开头的头字段都是自定义字段,可以用来添加额外信息:
- X-Spam-Status:是否是垃圾邮件
- X-Spam-Score:垃圾邮件评分
- X-Auth-User:认证的用户名
- 企业自定义字段用于业务处理
4.2.4 国际化邮件头
RFC 6532定义了国际化邮件头格式,允许直接使用UTF-8编码的非ASCII字符在邮件头中,不需要编码:
From: 张三 <[email protected]>
To: 李四 <lisi@例子.中国>
Subject: 你好,世界
需要服务器和客户端都支持SMTPUTF8扩展。
4.3 邮件体详解
邮件体是邮件的实际内容部分,根据Content-Type的不同,可以是纯文本、HTML、多部分内容等。
4.3.1 纯文本邮件
最简单的邮件格式,只有纯文本内容:
Content-Type: text/plain; charset=utf-8
这是一封纯文本邮件。
第二行内容。
4.3.2 HTML邮件
支持富文本格式的邮件:
Content-Type: text/html; charset=utf-8
<html>
<body>
<h1>这是HTML邮件</h1>
<p style="color: red;">红色文字</p>
<img src="logo.png" alt="Logo">
<a href="https://example.com">链接</a>
</body>
</html>
4.3.3 多部分邮件
包含多个部分的邮件,比如同时有纯文本和HTML版本,或者带附件。
示例1:同时包含纯文本和HTML版本
Content-Type: multipart/alternative; boundary="----=_Boundary_123"
------=_Boundary_123
Content-Type: text/plain; charset=utf-8
纯文本内容
------=_Boundary_123
Content-Type: text/html; charset=utf-8
<html>HTML内容</html>
------=_Boundary_123--
客户端会根据能力优先显示HTML版本,不支持HTML的客户端显示纯文本版本。
示例2:带附件的邮件
Content-Type: multipart/mixed; boundary="----=_Boundary_123"
------=_Boundary_123
Content-Type: text/plain; charset=utf-8
邮件正文内容
------=_Boundary_123
Content-Type: application/pdf; name="document.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="document.pdf"
JVBERi0xLjMKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVyIC9GbGF0ZURlY29kZT4+
... base64编码的内容 ...
------=_Boundary_123--
示例3:带内嵌图片的HTML邮件
Content-Type: multipart/related; boundary="----=_Boundary_123"
------=_Boundary_123
Content-Type: text/html; charset=utf-8
<html>
<body>
<img src="cid:[email protected]" alt="Logo">
</body>
</html>
------=_Boundary_123
Content-Type: image/png; name="logo.png"
Content-Transfer-Encoding: base64
Content-ID: <[email protected]>
Content-Disposition: inline; filename="logo.png"
iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
... base64编码的图片内容 ...
------=_Boundary_123--
使用cid:协议引用内嵌的资源。
4.3.4 邮件体编码
二进制内容需要编码为7位ASCII文本才能在邮件中传输,常用的编码方式有两种:
Base64编码
将二进制内容编码为64个可打印字符,适合二进制文件(图片、附件等):
Content-Transfer-Encoding: base64
SGVsbG8gV29ybGQh
特点:编码后体积增加33%,不可读,适合二进制数据。
Quoted-Printable编码
将非ASCII字符编码为=XX格式,适合文本内容:
Content-Transfer-Encoding: quoted-printable
=E4=BD=A0=E5=A5=BD=EF=BC=8C=E4=B8=96=E7=95=8C=EF=BC=81
特点:ASCII字符保持原样,可读性好,编码后体积增加不大,适合文本。
4.4 附件处理
4.4.1 附件命名编码
非ASCII的附件文件名需要编码,有两种方式:
- RFC 2047编码:
Content-Disposition: attachment; filename*=UTF-8''%E6%96%87%E4%BB%B6.pdf
- 传统编码方式:
Content-Disposition: attachment; filename="=?UTF-8?B?5paH5Lu2LnBkZg==?="
4.4.2 附件大小限制
不同邮件服务商对附件大小有不同限制:
- 个人邮箱通常限制10-50MB
- 企业邮箱通常限制50-100MB
- 超过限制的大文件建议使用文件外链的方式发送
4.4.3 常见的附件MIME类型
| 文件类型 | MIME类型 |
|---|---|
| 纯文本 | text/plain |
| HTML | text/html |
| application/pdf | |
| Word文档 | application/msword |
| Excel文档 | application/vnd.ms-excel |
| PowerPoint文档 | application/vnd.ms-powerpoint |
| ZIP压缩包 | application/zip |
| RAR压缩包 | application/x-rar-compressed |
| JPG图片 | image/jpeg |
| PNG图片 | image/png |
| GIF图片 | image/gif |
| MP3音频 | audio/mpeg |
| MP4视频 | video/mp4 |
4.5 邮件归档格式
4.5.1 mbox格式
最传统的邮件存储格式,将所有邮件存储在一个单一的文件中:
- 格式:每个邮件以
From开头的行分隔 - 优点:格式简单,便于备份
- 缺点:大文件操作慢,容易损坏,不支持并发写入
- 常用软件:Sendmail、Thunderbird等
示例:
From [email protected] Tue Mar 12 10:30:00 2024
From: 张三 <[email protected]>
To: 李四 <[email protected]>
Subject: 测试邮件
邮件内容
From [email protected] Tue Mar 12 11:00:00 2024
From: 王五 <[email protected]>
...
4.5.2 Maildir格式
现代邮件存储格式,每个邮件存储为一个单独的文件:
- 目录结构:
Maildir/ cur/ # 已读邮件 new/ # 新邮件 tmp/ # 临时文件 - 每个邮件是一个单独的文件,文件名是唯一的
- 优点:性能好,支持并发写入,不容易损坏,便于增量备份
- 缺点:小文件多,占用inode多
- 常用软件:Postfix、Dovecot等,是目前的主流格式
4.5.3 其他归档格式
- eml格式:单个邮件的标准格式,可以直接用邮件客户端打开
- pst格式:微软Outlook的个人存储格式,包含邮件、联系人、日历等
- olm格式:苹果Mac Outlook的归档格式
- mboxo/mboxrd:mbox的变种,解决了内容中包含
From行的问题
4.6 邮件格式最佳实践
4.6.1 发送端最佳实践
- 总是同时提供纯文本和HTML版本的邮件,使用multipart/alternative
- HTML邮件要简洁,避免过多的CSS和JavaScript,兼容性优先
- 附件文件名使用英文或正确编码,避免乱码
- 控制邮件大小,尽量不要超过10MB
- 正确设置Message-ID、Date、From等必选头字段
- 中文内容使用UTF-8编码,避免使用GBK等其他编码
4.6.2 HTML邮件开发最佳实践
- 使用table布局,不要使用div+CSS布局,兼容性更好
- 所有样式使用内联style,不要使用外部CSS或
<style>标签 - 图片使用绝对路径,或者内嵌为cid资源
- 宽度控制在600-800px之间,适应移动端显示
- 避免使用背景图片、浮动、定位等高级CSS特性
- 测试在不同邮件客户端(Outlook、Gmail、iOS Mail等)的显示效果
4.6.3 垃圾邮件规避
- 不要在主题和内容中包含过多的敏感词:免费、中奖、发票、赌场等
- 图片和文字的比例不要过高,避免只有图片没有文字
- 正确配置SPF、DKIM、DMARC记录
- 不要使用被列入黑名单的IP发送邮件
- 退订链接要清晰可见,符合反垃圾邮件法规
MIME协议:多用途互联网邮件扩展
早期的SMTP协议只能传输7位ASCII文本,MIME协议扩展了邮件的能力,使其可以支持各种格式的内容。
基本信息
- 标准文档:RFC 2045-2049
- 作用:扩展邮件格式,支持非ASCII文本、二进制附件、HTML内容、图片等
MIME的核心组成
- MIME版本:
MIME-Version: 1.0 - 内容类型(Content-Type):指定内容的类型和子类型
Content-Type: text/plain; charset=utf-8 Content-Type: text/html; charset=utf-8 Content-Type: image/png; name="logo.png" Content-Type: application/pdf; name="document.pdf" Content-Type: multipart/mixed; boundary="----=_NextPart_000_001" - 内容传输编码(Content-Transfer-Encoding):指定二进制内容的编码方式
- 7bit:默认,7位ASCII文本
- 8bit:8位文本
- base64:二进制内容编码为文本
- quoted-printable:文本内容编码,保留可读性
- binary:二进制数据,不编码
- 内容描述(Content-Description):内容的可读描述
- 内容 disposition(Content-Disposition):指定内容是内联显示还是作为附件
Content-Disposition: inline (内联显示) Content-Disposition: attachment; filename="document.pdf" (附件)
多部分邮件格式
当邮件包含多个部分(例如文本+HTML+附件)时,使用multipart类型:
Content-Type: multipart/mixed; boundary="----=_Boundary_123"
------=_Boundary_123
Content-Type: multipart/alternative; boundary="----=_Boundary_456"
------=_Boundary_456
Content-Type: text/plain; charset=utf-8
纯文本内容
------=_Boundary_456
Content-Type: text/html; charset=utf-8
<html>HTML内容</html>
------=_Boundary_456--
------=_Boundary_123
Content-Type: application/pdf; name="document.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="document.pdf"
JVBERi0xLjMKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVyIC9GbGF0ZURlY29kZT4+
c3RyZWFtCnicK0nNK0nNydVLzE0tKs3MVcjJL0lM90ksSk0tVkhJLEnVUDJV0LVTSMsvSszSgQq5QIA
... base64编码的内容 ...
------=_Boundary_123--
常见的multipart子类型:
multipart/mixed:包含独立的多个部分,通常用于带附件的邮件multipart/alternative:同一内容的不同格式,通常用于同时包含纯文本和HTML版本的邮件multipart/related:相互关联的部分,例如HTML邮件中引用的内嵌图片multipart/signed:带数字签名的邮件multipart/encrypted:加密的邮件
本章小结
本章详细讲解了邮件的格式标准,包括邮件头的各个字段、邮件体的各种格式、附件处理、归档格式以及MIME扩展协议。理解邮件的格式规范对于开发邮件相关应用、排查邮件问题、制作HTML邮件等工作都非常重要。
三大核心协议和邮件格式已经讲解完毕,这些是邮件系统最基础的技术基石。下一章我们将进入安全与防护部分,讲解邮件安全与隐私保护技术。