Python邮件编码和解码问题

4 投票
1 回答
1248 浏览
提问于 2025-04-18 07:42

基本上,我想从邮箱中读取所有新邮件,并把它们放到数据库里。我选择用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的编码有关。这到底是什么意思呢?

我在网上搜索过,发现有很多类似的问题,但他们得到的答案对我并没有帮助(我试过大部分答案)。

1 个回答

1

其实这件事很简单。虽然所有的文档都在讲以前的辉煌时刻,那时候unicode函数还真的存在,但现在用'str'也能做到同样的效果。

简单来说,你需要在使用'getPayload'的时候加上'decode=True',然后把它包裹在str(...,'utf-8')里面。

撰写回答