← RFC Reference

RFC 2231:MIME 参数值扩展

Current Standard MIME — Multipurpose Internet Mail Extensions Published March 2026
ELI5: 电子邮件附件有文件名,文件名可能包含非英文字符或非常长。原始MIME只能在标头中处理纯ASCII值。RFC 2231添加了三个功能:支持非ASCII字符(如日文或阿拉伯文文件名)、语言标记和将长值分割到多行。

为什么存在这个标准

MIME 参数出现在 Content-Type 和 Content-Disposition 等标头中。最常见的用例是附件的 filename 参数:

Content-Disposition: attachment; filename="report.pdf"

这对 ASCII 文件名效果很好。但对于名为 報告書.pdf(日语"报告")或包含 200 个字符的文件名呢?原始 MIME 规范(RFC 2045)没有这样的机制。RFC 2231 解决了三个问题:

工作原理

字符集和语言编码

要包含非 ASCII 字符,请在参数名后附加星号并使用格式 charset'language'encoded-value:

Content-Disposition: attachment;
    filename*=UTF-8''%E5%A0%B1%E5%91%8A%E6%9B%B8.pdf
             ^^^^^^^  ^^  ^^^^^^^^^^^^^^^^^^^^^^^^
             字符集  语言  百分比编码的值
                     (空 = 无语言标签)

值 %E5%A0%B1%E5%91%8A%E6%9B%B8 是"報告書"的 UTF-8 字节百分比编码。单引号之间的语言标签是可选的(通常留空)。

长值的延续

当参数值过长而不适合单个标头行时,使用编号延续进行拆分:

Content-Type: application/pdf;
    filename*0="very-long-document-name-that-exceeds-the";
    filename*1="-reasonable-line-length-limit-for-headers.pdf"

各部分按数字顺序重新组合:*0、*1、*2 等。

组合:具有字符集的延续

对于长的非 ASCII 值,请组合两个功能。只有第一个段包括字符集和语言;后续段只是编码值:

Content-Disposition: attachment;
    filename*0*=UTF-8''%E3%81%93%E3%82%8C%E3%81%AF%E9%95%B7;
    filename*1*=%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB;
    filename*2*=%E5%90%8D.pdf
          ^^^^
          数字 + 星号 = 编码延续

关键技术细节

参数名称语法

形式 含义 示例
filename 纯 ASCII 值 filename="report.pdf"
filename* 编码值 (charset'lang'value) filename*=UTF-8''%E5%A0%B1.pdf
filename*0 延续部分 0,纯 ASCII filename*0="very-long-"
filename*0* 延续部分 0,编码 filename*0*=UTF-8''%E5%A0%B1

编码规则

与 RFC 2047 的交互

RFC 2047 为标头中的非 ASCII 文本提供编码字(=?UTF-8?B?...?=)。但是,RFC 2047 明确指出编码字不得出现在带引号的字符串或参数值内。RFC 2231 是 MIME 参数的正确机制。尽管有此规则,许多邮件客户端在 filename 参数中使用 RFC 2047,所以健壮的解析器必须处理两者。

常见错误

可交付性影响

Related RFCs