使用Python加载邮件时出现异常消息体问题求助
解决Python加载长邮件时出现Base64编码内容的问题
嘿,这个问题我太熟悉了!你看到的那些类似PGRpdj48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmO2NvbG9yOiMwMDAwMDA7...的字符,其实是Base64编码的邮件正文,并不是什么错误乱码。
为什么短邮件正常,长邮件出问题?
短邮件通常会采用7-bit纯文本或者quoted-printable编码,这种编码的内容直接转UTF-8就能正常显示。但长邮件(尤其是包含特殊字符、HTML格式的邮件)为了避免传输过程中出现字符损坏,会自动切换成Base64编码格式——这种编码把二进制数据转换成ASCII字符,兼容性更强,但直接转UTF-8就会显示成你看到的那种“乱码”。你看到的结尾==是Base64的标准填充字符,用来补全编码后的字节长度。
正确的解决方案:用Python内置的email库解析邮件
不要手动去解码原始字节,Python的email模块已经帮我们处理了所有编码和多部分邮件的逻辑。修改你的代码如下:
import imaplib from email import policy from email.parser import BytesParser session = imaplib.IMAP4_SSL(host_in, port_in) session.login(login, password) session.select('Inbox') _response_status, response_body = session.search(None, '(UNSEEN)') msg_id_list = response_body[0].split() result = [] for msg_id in msg_id_list: _response_status, response_body = session.fetch(msg_id, '(RFC822)') # 用BytesParser解析完整的原始邮件数据 msg = BytesParser(policy=policy.default).parsebytes(response_body[0][1]) # 处理多部分邮件(大部分现代邮件都是多部分的,比如同时包含纯文本和HTML) if msg.is_multipart(): for part in msg.walk(): # 获取纯文本正文 if part.get_content_type() == 'text/plain': plain_body = part.get_content() print("纯文本正文:") print(plain_body) # 如果需要HTML格式的正文,可以添加这个分支 elif part.get_content_type() == 'text/html': html_body = part.get_content() print("HTML正文:") print(html_body) else: # 非多部分邮件直接获取内容 body = msg.get_content() print("邮件正文:") print(body)
代码关键点说明
BytesParser(policy=policy.default):使用现代的解析策略,能更好地处理各种邮件格式和编码,避免旧策略的兼容性问题。get_content():这个方法会自动识别邮件的编码格式(Base64、quoted-printable等),并帮你解码成可读的文本,不用手动处理Base64解码。msg.walk():遍历邮件的所有部分,处理包含多个内容块的多部分邮件(比如带附件、同时有纯文本和HTML的邮件)。
这样修改后,不管是短邮件还是长邮件,都能正确显示可读的正文内容啦!
内容的提问来源于stack exchange,提问作者user2626972
相关产品推荐
相关产品推荐

