-type 编码实际上与=22
字符集无关(无论是 utf-8 小写还是 UTF-8 大写或任何其他字符集)。
它是Content-Transfer-Encoding: quoted-printable
编码。
带引号的可打印编码只是对八位字节进行十六进制编码的一种方式,通常仅限于可打印 ascii 范围之外的八位字节。以这种方式编码 DQUOTE 字符似乎很奇怪,但这样做是完全合法的。
如果要在邮件正文中搜索字符串,则需要先对邮件正文进行解码。否则你不会成功。
我建议至少阅读rfc2045。
如果您最终想要在某些时候搜索标头,您可能还需要最终阅读rfc2047 ,但这会变得......由于发送客户端存在的各种错误而变得棘手。
既然我已经被“触发”到对 MIME 的咆哮,让我解释一下为什么解码标头如此难以正确。我敢肯定,几乎每个曾经在电子邮件客户端上工作过的开发人员都会告诉你这一点,但我想我会成为这样做的人。
以下是每个开发人员在为已根据 rfc2047 规范(理论上)编码的标头实现解码器时面临的问题的简短列表:
首先,从技术上讲,rfc2047 指定了两种标头编码格式 - 一种用于短语,一种用于非结构化文本字段。它们非常相似,但您不能使用相同的规则来标记它们。我提到这一点是因为似乎大多数 MIME 解析器都忽略了这个非常微妙的区别,因此,正如您可能想象的那样,大多数 MIME 生成器也是如此。见鬼,大多数 MIME 生成器可能从未听说过它的规范。
这使我们:
根据 rfc2822 和 rfc2047 的规则,MIME 标头无法标记化的方式有很多种。您会遇到有趣的事情,例如:
一个。编码字标记非法嵌入到其他字标记中
湾。包含非法字符(例如空格、换行符等)的编码字标记有效地使标记器无法再标记它们(至少不容易)
C。多字节字符序列在多个编码字标记之间拆分,这意味着不可能单独解码所述编码字标记
d。编码字令牌的有效负载被分成多个编码字令牌,通常分裂在一个位置,这使得无法单独解码有效负载
您可以在此处查看一些示例。
许多开发人员似乎忽略了一个事实,即每个编码字标记都允许采用不同的字符编码(您可能在 UTF-8 中有一个标记,在 ISO-8859-1 中有另一个,在 koi8-r 中有另一个) . 通常,这没什么大不了的,因为您只需解码每个有效负载,然后通过 iconv() 或其他方式将指定的字符集转换为 UTF-8。然而,由于我在上面(2c)和(2d)中提到的乐趣破碎,这变得更加复杂。
如果这还不足以让你想举起双手并喃喃几句脏话,还有更多......
标题中未声明的 8 位文本。是的。一些邮寄者只是没有收到他们应该对非 ASCII 文本进行编码的备忘录。所以现在你得到了混合和匹配未声明的 8 位文本的有趣体验,只有上帝知道什么字符集以及(可能损坏的)编码词的内容。
如果你想看看如何处理这些问题,你可以看看我是如何在我的GMime库中使用 C 来完成的,这里:https ://github.com/jstedfast/gmime/blob/master/gmime/gmime -utils.c#L1894(如果将来行偏移量发生变化,请查找_g_mime_utils_header_decode_text()
它在该源文件中使用的各种内部方法 - 我已经写了注释来解释它如何处理上述问题)。
或者你可以在我的MimeKit库中查看我是如何使用 C#完成的,这里: https ://github.com/jstedfast/MimeKit/blob/master/MimeKit/Utils/Rfc2047.cs
有关为什么以及如何处理电子邮件如此困难的更多信息,请查看 Joshua Cramner 的博客系列:http: //quetzalcoatal.blogspot.com/search/label/email-hard