Python 邮件编码与解码问题

4

基本上我想要读取收件箱中的所有新邮件并将它们存入数据库中。我使用Python的原因是因为它有 imaplib,但我对它一无所知。

目前,我有类似下面的代码:

def primitive_get_text_blocks(email_message_instance):
    maintype = email_message_instance.get_content_maintype()
    if maintype == 'multipart':
        return_parts = ""
        for part in email_message_instance.get_payload():
            if part.get_content_maintype() == 'text':
                return_parts+= " "+ part.get_payload()
        return return_parts
    elif maintype == 'text':
        return email_message_instance.get_payload()
    return ""

fromField=con.escape(email_message["From"])
contentField=con.escape(primitive_get_text_blocks(email_message))

原始的get_text_blocks函数是从某个地方复制并粘贴而来的。 结果是我得到了这样的数据库条目:
<META http-equiv=3D"Content-Type" content=3D"text/html; charset=3DUTF-8">

据我所知,这与使用utf-7编码有关。因此,我改用get_payload(decode=True),但这会给我一个字节数组。如果我附加另一个decode('utf-8'),有时会出现错误,如:

'codec error can't decode to ...'。

我不知道编码是如何工作的,我只想要一封电子邮件正文的Unicode字符串和地址。

为什么没有简单的convert(charset from, charset to)?我该如何获得可读的电子邮件正文(和地址)?我发现了IMAP Fetch Encoding,并使用decode_header,但没有进展。

--

我认为编码是字节表示字符的方式,因此,考虑到这一点,解码应该接收一个字节数组并输出一个字符串。在Stack Overflow上,我遇到了一个人声称它与utf-8utf-7编码有关。那究竟是什么意思呢?

我已经搜索过了,似乎有大量重复的答案,但它们得到的答案并没有真正帮助到我(我已经尝试了大部分)。


2
那不是UTF-7,那是引用打印。通常,你应该期望大多数单一部分的正文要么是QP编码,要么是base64编码。Content-Transfer-Encoding头告诉你使用哪种编码(或者没有编码,这是7bit8bitbinary之一)。 - tripleee
1
对于文本部分,您不应该假设UTF-8或尝试猜测;您应该检查“Content-Type”头的“charset”属性。 - tripleee
1个回答

1
原来这很容易。尽管所有文档都指向Unicode函数仍然是真实存在的辉煌过去,但“str”也可以做到同样的效果。
因此,简要概括一下,您必须在“getPayload”中传递“decode = True”,并将其包装在str(...,'utf-8')中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接