Python邮件编码和解码问题
基本上,我想从邮箱中读取所有新邮件,并把它们放到数据库里。我选择用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-8
和utf-7
的编码有关。这到底是什么意思呢?
我在网上搜索过,发现有很多类似的问题,但他们得到的答案对我并没有帮助(我试过大部分答案)。
1 个回答
1
其实这件事很简单。虽然所有的文档都在讲以前的辉煌时刻,那时候unicode函数还真的存在,但现在用'str'也能做到同样的效果。
简单来说,你需要在使用'getPayload'的时候加上'decode=True',然后把它包裹在str(...,'utf-8')里面。