You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python保存含西里尔字符邮件到TXT文件编码问题求助

解决西里尔字符邮件保存为TXT的乱码问题

你的核心问题是没有正确处理邮件内容的传输编码与字符编码匹配,直接提取的part.get_payload()是经过传输编码(比如Base64、Quoted-Printable)后的原始数据,而非解码后的真实文本。下面是具体的修复思路和代码调整方案:

关键问题拆解

  1. 传输编码未解码:邮件文本部分通常会用Content-Transfer-Encoding(比如base64)压缩编码,直接调用part.get_payload()得到的是编码后的字符串,写入文件自然乱码。
  2. 文件写入模式错误:你用了codecs.open(..., 'wb', encoding='utf-8')wb是二进制写入模式,但codecs.open配合编码参数时应该用文本模式w,否则会导致编码逻辑混乱。

修复后的代码片段

把你保存文本的那段代码替换成以下版本:

if part.get_content_maintype() == 'text':
    filepath = self.folder/"test_save.txt"
    # 1. 自动解码传输编码(处理base64/quoted-printable等)
    decoded_raw = part.get_payload(decode=True)
    # 2. 获取邮件正文的字符编码,缺失时默认用utf-8兜底
    content_charset = part.get_content_charset() or 'utf-8'
    try:
        # 3. 用邮件指定的编码转成字符串
        body = decoded_raw.decode(content_charset)
    except UnicodeDecodeError:
        # 若编码识别错误,尝试西里尔字符常用的windows-1251兜底
        body = decoded_raw.decode('windows-1251', errors='replace')
    # 4. 用文本模式写入,统一以utf-8编码保存
    with codecs.open(filepath, 'w', encoding='utf-8') as file:
        file.write(body)

额外优化建议

  • 如果邮件有多段文本内容(比如同时有plain和html格式),可以遍历所有text类型的part,把内容拼接后再写入文件。
  • 发送邮件时你已经用MIMEText(body, 'plain', 'utf-8')指定了utf-8编码,所以发送环节的编码是没问题的,问题完全出在归档提取时的解码逻辑。
  • 保存文件时统一用utf-8编码,后续打开文件时只要选择utf-8编码,就能稳定显示西里尔字符。

内容的提问来源于stack exchange,提问作者Nicko

火山引擎 最新活动