【问题标题】:Unknown Encoding in IMAP MessageIMAP 消息中的未知编码
【发布时间】:2013-04-13 00:08:34
【问题描述】:

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

为此,我所做的是使用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 是字符“í”。

【问题讨论】:

    标签: python unicode encoding utf-8 imaplib


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的快速回答。如果是 Content-Transfer-Encoding 问题,我会立即尝试并标记为正确答案。
    • @VascoPatricio:它 Content-Transfer-Encoding 问题。
    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 2013-03-10
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多