Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第七章 邮件格式标准详解

一封标准的互联网邮件由两部分组成:邮件头(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的附件文件名需要编码,有两种方式:

  1. RFC 2047编码:
Content-Disposition: attachment; filename*=UTF-8''%E6%96%87%E4%BB%B6.pdf
  1. 传统编码方式:
Content-Disposition: attachment; filename="=?UTF-8?B?5paH5Lu2LnBkZg==?="

4.4.2 附件大小限制

不同邮件服务商对附件大小有不同限制:

  • 个人邮箱通常限制10-50MB
  • 企业邮箱通常限制50-100MB
  • 超过限制的大文件建议使用文件外链的方式发送

4.4.3 常见的附件MIME类型

文件类型MIME类型
纯文本text/plain
HTMLtext/html
PDFapplication/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 发送端最佳实践

  1. 总是同时提供纯文本和HTML版本的邮件,使用multipart/alternative
  2. HTML邮件要简洁,避免过多的CSS和JavaScript,兼容性优先
  3. 附件文件名使用英文或正确编码,避免乱码
  4. 控制邮件大小,尽量不要超过10MB
  5. 正确设置Message-ID、Date、From等必选头字段
  6. 中文内容使用UTF-8编码,避免使用GBK等其他编码

4.6.2 HTML邮件开发最佳实践

  1. 使用table布局,不要使用div+CSS布局,兼容性更好
  2. 所有样式使用内联style,不要使用外部CSS或<style>标签
  3. 图片使用绝对路径,或者内嵌为cid资源
  4. 宽度控制在600-800px之间,适应移动端显示
  5. 避免使用背景图片、浮动、定位等高级CSS特性
  6. 测试在不同邮件客户端(Outlook、Gmail、iOS Mail等)的显示效果

4.6.3 垃圾邮件规避

  1. 不要在主题和内容中包含过多的敏感词:免费、中奖、发票、赌场等
  2. 图片和文字的比例不要过高,避免只有图片没有文字
  3. 正确配置SPF、DKIM、DMARC记录
  4. 不要使用被列入黑名单的IP发送邮件
  5. 退订链接要清晰可见,符合反垃圾邮件法规

MIME协议:多用途互联网邮件扩展

早期的SMTP协议只能传输7位ASCII文本,MIME协议扩展了邮件的能力,使其可以支持各种格式的内容。

基本信息

  • 标准文档:RFC 2045-2049
  • 作用:扩展邮件格式,支持非ASCII文本、二进制附件、HTML内容、图片等

MIME的核心组成

  1. MIME版本MIME-Version: 1.0
  2. 内容类型(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"
    
  3. 内容传输编码(Content-Transfer-Encoding):指定二进制内容的编码方式
    • 7bit:默认,7位ASCII文本
    • 8bit:8位文本
    • base64:二进制内容编码为文本
    • quoted-printable:文本内容编码,保留可读性
    • binary:二进制数据,不编码
  4. 内容描述(Content-Description):内容的可读描述
  5. 内容 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邮件等工作都非常重要。

三大核心协议和邮件格式已经讲解完毕,这些是邮件系统最基础的技术基石。下一章我们将进入安全与防护部分,讲解邮件安全与隐私保护技术。