← RFC Reference

RFC 2049:MIME 第 5 部分——符合性准则和示例

Standards Track MIME — Multipurpose Internet Mail Extensions Published March 2026
ELI5: RFC 2045–2047 定义了 MIME 的规则。RFC 2049 是考试:它精确说明了您的软件必须做什么才能通过"MIME 兼容",并提供了可检查实现的工作示例。如果 MIME 是建筑规范,这就是检查清单。

为什么存在

MIME 规范跨越四个技术 RFC(2045、2046、2047 和 2048)。实施者需要一个明确的答案:"我的软件必须处理什么才能符合 MIME?" RFC 2049 提供了这个答案,以及实施者可以用来验证其解析器的规范测试消息。

没有一份符合性文档,不同的实现将支持不同的 MIME 子集,导致互操作性失败。RFC 2049 设定了底线:每个 MIME 感知系统至少必须处理这些内容类型、编码和结构。

工作原理

RFC 2049 定义了两个符合性级别,每个级别都有具体要求。

发送代理要求

符合 MIME 的发送代理(MUA 或电子邮件库)必须:

  1. 在每条使用 MIME 功能的消息中始终包含 MIME-Version: 1.0。
  2. 在正文不是纯 US-ASCII 文本时包含 Content-Type 标头。
  3. 使用有效的 Content-Transfer-Encoding,以确保消息正文可以通过 7 位 SMTP 网关传输(非 ASCII 内容使用 base64 或 quoted-printable)。
  4. 正确编码标头字段,在主题或发件人显示名称等标头中出现非 ASCII 字符时使用 RFC 2047 编码字。
  5. 生成有效的多部分边界,不出现在任何包含的正文部分中。

接收代理要求

符合 MIME 的接收代理必须:

  1. 识别 MIME-Version: 1.0,并将消息视为 MIME 编码。
  2. 解析 Content-Type 和 Content-Transfer-Encoding 标头,包括所有参数。
  3. 解码 base64 和 quoted-printable 内容传输编码。
  4. 处理所有多部分类型 — 至少 multipart/mixed、multipart/alternative、multipart/digest 和 multipart/parallel。未知的多部分子类型必须视为 multipart/mixed。
  5. 处理 message/rfc822 — 显示封装的消息或至少提供保存选项。
  6. 妥善处理无法识别的内容类型 — 提供将正文部分保存为文件,而不是崩溃或无声丢弃。无法识别的类型应视为 application/octet-stream。
  7. 解码标头字段中的 RFC 2047 编码字。
  8. 处理文本类型上的 charset 参数,至少支持 US-ASCII 和 ISO-8859-1,理想情况下支持 UTF-8。

健壮性原则

RFC 2049 为 MIME 强化了 Postel 定律:发送时严格,接收时宽松。符合要求的接收器应尽力显示即使略微格式错误的 MIME 消息,而不是完全拒绝它们。

关键技术细节

规范示例

RFC 2049 包含了 MIME 消息的详细示例。以下是包含纯文本和 HTML 的格式正确的 multipart/alternative 消息的模式:

MIME-Version: 1.0
From: sender@example.com
To: recipient@example.com
Subject: MIME conformance test
Content-Type: multipart/alternative; boundary="boundary42"

--boundary42
Content-Type: text/plain; charset=us-ascii

This is the plain text version.

--boundary42
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<html><body><p>This is the <strong>HTML</strong> version.</p></body></html>

--boundary42--

处理未知类型

一个关键的符合性要求:当接收代理遇到它不理解的 Content-Type 时,它必须将其视为 application/octet-stream 并提供保存选项。此规则确保向前兼容性 — 可以定义新的媒体类型而不会破坏现有客户端。

; 客户端遇到的未知类型
Content-Type: application/vnd.custom-format
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="data.custom"

; 符合要求的客户端将其视为 application/octet-stream
; 并向用户提供"另存为"对话框

未知多部分子类型

同样,未知的多部分子类型必须视为 multipart/mixed。这意味着客户端按顺序显示每个部分。例如,multipart/report(在 RFC 3462 中定义)在将其视为混合类型的较早客户端中仍会正确显示。

最小字符集支持

符合要求的实现必须至少支持:

实际上,任何现代实现都必须支持 UTF-8。在 2024 年及以后不这样做,即使 1996 年的规范未强制要求,从精神上讲也是符合性失败。

MIME/非 MIME 边界

没有 MIME-Version: 1.0 标头的消息被视为前 MIME 纯 ASCII 文本,无论它们是否碰巧包含 Content-Type 标头。MIME-Version 标头是看门人:没有它,MIME 处理就不会激活。

常见错误

可递送性影响

Related RFCs