IMAP消息中的未知编码

时间:2013-04-19 14:45:53

标签: unicode encoding utf-8 imap imaplib

我正在使用IMAP协议获取电子邮件的文本/ HTML BODY部分。

为此,我所做的是使用BODYSTRUCTURE调用来获取BODY索引和部件的字符集,然后使用BODY[INDEX]调用,获取原始文本,以及尝试使用Python解码函数对其进行解码。

现在我的问题是,即使在使用给定的字符集(从BODYSTRUCTURE调用与该部分一起获得的字符集)解码某些文本部分之后,它们仍然使用某种未知编码进行编码。

只有葡萄牙语/西班牙语/其他拉丁语文本会出现此问题,因此我认为这是某种葡萄牙语/西班牙语编码。

现在我的问题是,如何检测到这种情况并正确解码?首先,我假设使用给定的字符集解码文本应该不留下编码字符,但如果确实发生了,就像现在正在发生的那样,我如何找到解码这些字符的通用方法?

我假设我可以尝试一个常见字符集列表并为所有这些字符串执行try: except:周期尝试解码给定文本,但我真的希望找到更好的解决方案。< / p>

Pseudocode是这样的:

# Obtain BODYSTRUCTURE call
data, result = imap_instance.uid('fetch', email_uid, '(BODYSTRUCTURE)')
part_body_index, part_charset = parse_BODY_index_and_charset_from_response(data)

text_part, result = imap_instance.uid('fetch', email_uid, '(BODY['+str(part_body_index)+'])')

if len(part_charset) > 0:
    try:
        text_part = text_part.decode(part_charset, 'ignore')
    except:
        pass

# Content of "text_part" variable after this should be text with no encoded characters...
# But that's not the case

编码文本示例:

A 05/04/2013, =E0s 11:09, XYZ escreveu:>

这个文本是用iso-8859-1编码的,解码后仍然像这样。字符串中的符号= E0是字符“À”。

In=EDcio da mensagem reenviada:

这个文本是用windows-1252编码的,解码后仍然像这样。符号=字符串中的ED是字符“í”。

1 个答案:

答案 0 :(得分:2)

您需要查看Content-Transfer-Encoding信息(实际在BODYSTRUCTURE响应中返回)。您需要同时支持base64quoted-printable解码 - 这会将二进制数据(如UTF-8甚至是给定文本的ISO-8859-1编码)转换为7位形式,即安全的电子邮件传输。只有在您撤消内容传输编码后,才能继续将字符编码(如UTF-8,或Windows-1250或ISO-8859-x或...)中的文本解码为其Unicode表示形式你工作。

您的两个示例都使用quoted-printable进行编码。