2

我有几个客户使用我自己编写的邮件客户端。他们最近偶然发现附件文件名到达的电子邮件是乱码。

当我检查这些电子邮件时,我发现显然有一个本地网络邮件服务发送附件名称如下:

Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document;
    name*="UTF-8''%D7%A2%D7%A8%D7%9B%D7%AA%20%D7%94%D7%A8%D7%A9%D7%9E%D7%94%20TCMP.docx"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
    filename*=UTF-8''%D7%A2%D7%A8%D7%9B%D7%AA%20%D7%94%D7%A8%D7%A9%D7%9E%D7%94%20TCMP.docx

根据 RFC 2047,这是一个完全无效的 mime 标头。它没有带引号的可打印标识符 (?Q?),不同的字节用 % 而不是 = 编码,整个编码字应该以 =? 并以 ?= 结尾,但事实并非如此。

当我将其修复为正确的格式时,如下所示:

Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document;
    name="=?UTF-8?Q?=D7=A2=D7=A8=D7=9B=D7=AA=20=D7=94=D7=A8=D7=A9=D7=9E=D7=94=20TCMP.docx?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
    filename=?UTF-8?Q?=D7=A2=D7=A8=D7=9B=D7=AA=20=D7=94=D7=A8=D7=A9=D7=9E=D7=94=20TCMP.docx?=

然后标题被正确解码。

谁能告诉我我是否在这里遗漏了什么?RFC2047 是否有允许这些标头的新扩展,或者它们完全错误?

4

1 回答 1

0

正如@alex-k 所提到的,name*=语法是在 RFC2231 中定义的,它是在 RFC2047 之后编写的。

但是要回答所的问题,不。这两组标头都不符合 RFC2047。

*=编写 RFC2047 时该语法不存在,因此原始语法不符合。

第二组,使用 MIME 编码的词,是无效的,因为它们违反了根据 RFC2047 的第 5 节允许 MIME 编码的词的规则,特别是这两个规则:

   + An 'encoded-word' MUST NOT appear within a 'quoted-string'.

   + An 'encoded-word' MUST NOT be used in parameter of a MIME
     Content-Type or Content-Disposition field, or in any structured
     field body except within a 'comment' or 'phrase'.

(这些规则在 RFC 中不是连续的。)

于 2018-10-25T23:38:38.547 回答