我正在使用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是字符“í”。
答案 0 :(得分:2)
您需要查看Content-Transfer-Encoding
信息(实际在BODYSTRUCTURE
响应中返回)。您需要同时支持base64
和quoted-printable
解码 - 这会将二进制数据(如UTF-8甚至是给定文本的ISO-8859-1编码)转换为7位形式,即安全的电子邮件传输。只有在您撤消内容传输编码后,才能继续将字符编码(如UTF-8,或Windows-1250或ISO-8859-x或...)中的文本解码为其Unicode表示形式你工作。
您的两个示例都使用quoted-printable进行编码。