我正在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 是字符“í”。