Python 3中如何恢复邮件对象中的变音符号及特殊字符?
解决Gmail邮件读取中的变音符号编码问题
你遇到的f=C3=BCr这种格式是Quoted-Printable编码——这是邮件系统里用来兼容非ASCII字符的常见编码方式,把特殊字符转换成ASCII范围内的字符组合,方便传输。好在Python的email模块已经帮我们准备好了解码工具,不用自己手动拆解这些编码串。
给你两种可行的解决方案:
方案1:直接用get_payload的解码参数
这是最推荐的方式,get_payload()方法支持decode=True参数,它会自动读取邮件部分的Content-Transfer-Encoding头,自动处理Quoted-Printable或者Base64编码:
import email # ... 你的其他代码 s = self.message.get_payload() # 加上decode=True获取解码后的字节串,再转成Unicode字符串 message = s[0].get_payload(decode=True).decode('utf-8')
这里最后用.decode('utf-8')是因为decode=True返回的是字节对象,Python3需要把它转换成str类型才能正常显示。
方案2:手动用quopri模块解码
如果因为某些原因你需要手动处理编码(比如邮件头信息不规范),可以直接用Python标准库的quopri模块来解码Quoted-Printable格式:
import quopri # ... 你的其他代码 s = self.message.get_payload() encoded_str = s[0].get_payload() # 先解码成字节,再转成字符串 decoded_bytes = quopri.decodestring(encoded_str) message = decoded_bytes.decode('utf-8')
进阶优化:适配不同字符集
有些邮件可能用的不是UTF-8编码,你可以先读取邮件部分的Content-Type头里的字符集,再针对性解码,避免乱码:
s = self.message.get_payload() part = s[0] # 获取字符集,默认用utf-8兜底 charset = part.get_content_charset() or 'utf-8' message = part.get_payload(decode=True).decode(charset)
这样处理后,你就能看到正常的"Weiterer Tests für Email-Empfang"了。
内容的提问来源于stack exchange,提问作者Kev1n91
相关产品推荐
相关产品推荐

