Python用imaplib、email读取Gmail邮件主题波兰字符乱码如何解决
乱码问题修复方案
问题原因
直接通过message['subject']获取的邮件头为未解码的Header类型,波兰语等非ASCII字符没有完成转码就会出现乱码。不需要手动配置编码页,Python内置的email工具可以自动识别邮件头携带的编码信息完成解码。
修复步骤
- 导入
email.header模块的decode_header方法 - 封装通用邮件头解码函数,兼容所有带非ASCII字符的邮件头字段
- 替换原代码中直接读取subject的逻辑,用解码函数处理
完整修复代码
import imaplib, email from email.header import decode_header # 封装通用解码函数 def decode_mail_header(header_value): decoded_fragments = decode_header(header_value) result = [] for fragment, encoding in decoded_fragments: if isinstance(fragment, bytes): # 没有指定编码时默认用utf-8兜底 result.append(fragment.decode(encoding or 'utf-8')) else: result.append(fragment) return ''.join(result) mail = imaplib.IMAP4_SSL('imap.gmail.com') mail.login('user', 'pwd') mail.select('inbox') data = mail.search(None, 'ALL') _, data = mail.fetch(str(7), '(RFC822)') message = email.message_from_bytes(data[0][1]) out = { 'from': message['from'], 'subject': decode_mail_header(message['subject']), 'to': message['Delivered-To'], 'datetime': message['Date'], 'cc': message['Cc'] }
补充说明
如果后续发现from、cc等其他字段也存在非ASCII字符乱码的情况,直接用同一个decode_mail_header函数处理对应字段即可。
内容的提问来源于stack exchange,提问作者Jakub Zbudniewek
相关产品推荐
相关产品推荐

