0

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

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

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

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

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

我想我可以尝试一个常见字符集的列表,然后try: except:为所有这些字符集做一个循环来尝试解码给定的文本,但老实说,我更喜欢更好的解决方案。

伪代码是这样的:

# 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 是字符“í”。

4

1 回答 1

2

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

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

于 2013-04-19T16:02:59.063 回答