UTF-8编码在电子邮件中,解析正文



所以我真的不希望这个问题是特定于语言的,但我怀疑Go(我的语言选择)在这里发挥了作用。我正试图在一封原始电子邮件的正文中找到一个字符串。为此,我正在获取编码,并且大多数情况是quoted-printable。好的,这很好,我正在编码我的搜索查询引用可打印,然后进行搜索。这很有效。然而在一个特定的情况下,我在gmail中看到的原始电子邮件看起来很好,但是当我从gmail API检索原始电子邮件时,尽管编码和所有内容都是相同的,但它将"编码为=22研究表明,这是因为字符集是utf-8。我还不太清楚这是编码的utf-8,然后引用可打印的还是其他方式,但这也不是一个完全的问题。。。。如果我查看"=22的电子邮件,我会看到字符集为utf-8,而当我查看另一封未编码的电子邮件时,字符集为UTF-8(注意这种情况)。我不敢相信这里的情况是导致这种情况发生的原因,但它似乎不是一种足够稳健的方法来确定=22是否真的是=22或是"编码的utf-8。

我最初的想法是在搜索之前总是对引用的可打印内容进行解码,然后重新编码,但我认为这不会是一种稳健的方法,我认为其他人可能会有更好的建议?

最后,我试图在原始电子邮件中找到一个字符串,但编码导致我在获取与正文编码匹配的搜索字符串时出现问题

=22类型的编码实际上与字符集无关(无论是utf-8小写、utf-8大写还是任何其他字符集)。

它是Content-Transfer-Encoding: quoted-printable编码。

引用的可打印编码只是十六进制编码八位字节的一种方式,通常仅限于可打印ascii范围之外的八位字节。DQUOTE字符以这种方式编码似乎很奇怪,但这样做是完全合法的

如果要在消息正文中搜索字符串,则需要首先对消息正文进行解码。否则你就不会成功。

我建议至少阅读rfc2045。

如果你想在某个时候搜索标题,你可能还需要阅读rfc2047,但这会。。。由于发送客户端存在各种错误,因此非常棘手。

既然我已经被"触发"了对MIME的咆哮,让我解释一下为什么解码头很难正确。我相信几乎每一个在电子邮件客户端上工作过的开发人员都会告诉你这一点,但我想我会成为做这件事的人

以下是每个开发人员在为根据rfc2047规范(理论上)编码的标头实现解码器时所面临的问题的简短列表:

  1. 首先,从技术上讲,rfc2047指定的标头编码格式有两种变体——一种用于短语,另一种用于非结构化文本字段。它们非常相似,但不能使用相同的规则来标记它们。我之所以提到这一点,是因为大多数MIME解析器似乎都忽略了这一非常微妙的区别,正如你所想象的,大多数MIME生成器也是如此。见鬼,大多数MIME生成器可能从一开始就从未听说过规范。

    这就引出了:

  2. 根据rfc2822和rfc2047的规则,MIME标头的标记化方式有很多变化。你会遇到有趣的东西,比如:

    a。非法嵌入其他单词标记中的编码单词标记

    b。编码的单词令牌中包含非法字符(如空格、换行符等),有效地使其成为令牌化器无法再对其进行令牌化(至少不容易)

    c。多字节字符序列在多个编码字令牌之间被分割,这意味着不可能单独地对所述编码字令牌进行解码

    d。编码单词令牌的有效载荷被拆分为多个编码单词令牌,通常在一个位置拆分,这使得不可能在隔离中解码有效载荷

    你可以在这里看到一些例子。

  3. 许多开发人员似乎忽略了这样一个事实,即每个编码的单词标记都可以使用不同的字符编码(您可能有一个UTF-8标记,另一个ISO-8859-1标记,还有一个koi8-r标记)。通常情况下,这没什么大不了的,因为您只需解码每个有效负载,然后通过iconv()或其他方式将指定的字符集转换为UTF-8。然而,由于我在上面(2c)和(2d)中提到的有趣的破碎,这变得更加复杂。

    如果这还不足以让你想把手举到空中,嘴里咕哝着脏话,还有更多。。。

  4. 标题中未声明的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

有关为什么&如何处理电子邮件是困难的,看看约书亚·克拉姆纳的博客系列:http://quetzalcoatal.blogspot.com/search/label/email-hard

最新更新