← RFC Reference

RFC 2046:MIME 第2部分——媒体类型

Standards Track MIME — Multipurpose Internet Mail Extensions Published March 2026
ELI5: RFC 2045定义了电子邮件的信封。RFC 2046定义了你可以放在其中的事物类型:文本、图像、音频、视频、应用程序——以及关键的是,如何在一个信封中放入多个事物。这就是为什么一封电子邮件可以包含文本正文、HTML正文和三个附件。

存在的原因

RFC 2045 引入了 Content-Type 和传输编码,但它没有定义存在哪些内容类型或它们如何表现。RFC 2046 通过定义以下内容填补了这一空白:

这是使现代电子邮件成为可能的 RFC。没有它,每封电子邮件都将是一个单一的文本块。

工作原理

顶级媒体类型

类型 描述 常见子类型
text 人类可读的文本 text/plain、text/html、text/calendar
image 图像数据 image/png、image/jpeg、image/gif、image/svg+xml
audio 音频数据 audio/mpeg、audio/ogg
video 视频数据 video/mp4、video/webm
application 二进制数据或结构化格式 application/pdf、application/json、application/octet-stream
multipart 一条消息中的多个正文部分 multipart/mixed、multipart/alternative、multipart/related
message 封装的电子邮件消息 message/rfc822、message/delivery-status

多部分机制

多部分类型是 RFC 2046 的核心。多部分消息包含一个 boundary 参数,用于分隔每个部分:

Content-Type: multipart/mixed; boundary="----=_boundary_001"

------ 前言(MIME 客户端忽略)------

------=_boundary_001
Content-Type: text/plain; charset=utf-8

这是第一部分。

------=_boundary_001
Content-Type: text/plain; charset=utf-8

这是第二部分。

------=_boundary_001--
^^^ 注意尾部 -- 标记结束

边界的关键规则:

多部分子类型

子类型告诉邮件客户端如何显示这些部分。这是微妙之处所在。

multipart/mixed — 顺序部分

最常见的多部分类型。部分按顺序显示。用于"消息正文 + 附件":

Content-Type: multipart/mixed; boundary="----=_mixed"

------=_mixed
Content-Type: text/plain; charset=utf-8

以下是您请求的报告。

------=_mixed
Content-Type: application/pdf; name="report.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="report.pdf"

JVBERi0xLjQKJeLjz9MK...

------=_mixed--

multipart/alternative — 相同内容,不同格式

包含相同内容的多个版本。邮件客户端选择它能显示的最佳版本。部分从最简单到最丰富的顺序排列 — 最后一部分是首选:

Content-Type: multipart/alternative; boundary="----=_alt"

------=_alt
Content-Type: text/plain; charset=utf-8

欢迎使用我们的服务!

------=_alt
Content-Type: text/html; charset=utf-8

<h1>欢迎使用我们的服务!</h1>
<p>我们很高兴有您。</p>

------=_alt--

这是每个格式良好的 HTML 电子邮件的工作方式:text/plain 备选方案首先出现,text/html 版本最后出现。支持 HTML 的客户端显示 HTML;纯文本客户端显示文本。

multipart/related — 链接部分

用于部分相互引用的情况。最常见的用例是带有内联图像的 HTML 电子邮件。HTML 通过 Content-ID(cid: URL)引用图像:

Content-Type: multipart/related; boundary="----=_rel"

------=_rel
Content-Type: text/html; charset=utf-8

<p>看看我们的徽标:</p>
<img src="cid:logo@example.com" alt="徽标" />

------=_rel
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-ID: <logo@example.com>

iVBORw0KGgoAAAANSUhEU...

------=_rel--

multipart/digest — 消息集合

mixed 的一个变体,其中每个部分的默认内容类型是 message/rfc822 而不是 text/plain。由邮件列表摘要使用。在现代电子邮件中很少见。

关键技术细节

嵌套多部分类型

MIME 的真正功能来自嵌套。一个带有内联图像和附件的典型营销电子邮件看起来像这样:

; HTML 电子邮件标准结构(带内联图像 + 附件)

Content-Type: multipart/mixed           ← 外层:正文 + 附件
  |
  |-- multipart/alternative              ← 正文:文本或 HTML
  |     |-- text/plain                    ← 纯文本备选
  |     |-- multipart/related             ← HTML + 内联图像
  |           |-- text/html               ← HTML 正文
  |           |-- image/png (cid:logo)    ← 内联图像
  |
  |-- application/pdf (attachment)       ← 文件附件

这个三级嵌套是几乎所有电子邮件库和电子邮件服务提供商使用的标准模式。

message/rfc822 类型

将整个电子邮件消息封装为正文部分。用于转发消息作为附件和在退回通知中(RFC 3462 multipart/report)。封装的消息有自己的标头(From、To、Subject 等)和正文。

application/octet-stream 备选方案

当文件的内容类型未知时,使用 application/octet-stream。这告诉客户端将其视为通用二进制数据,通常会触发下载提示。这是 MIME 版本的"我不知道这是什么;保存它并自己弄清楚。"

边界要求

边界字符串有特定的规则:

常见错误

可传递性影响

Related RFCs