You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python imaplib库解析邮件出现编码乱码、字符截断等异常问题

问题根因与修复方案

异常原因

三类异常均由编码解析流程缺失导致:

  • =E2=80=99、行尾=是未解码quoted-printable传输编码的特征,原始邮件传输时会用该编码对非ASCII字符、超长行做转义,直接读取未解码的payload就会出现这类符号
  • 顶部多余的||、---是因为邮件为multipart多部分结构,未筛选正文就直接提取整个payload,多余的结构内容、HTML表格/分隔线被html2text转成了markdown格式符号

修复后代码

import email
import html2text

# 原有邮件拉取逻辑不变
data = self.mail_conn.fetch(str(any_email_id), f'({fetch_protocol})')
raw_email = data[1][0][1]
mail_body = email.message_from_bytes(raw_email)

# 提取HTML正文,兼容多部件邮件
html_content = ""
if mail_body.is_multipart():
    for part in mail_body.walk():
        if part.get_content_type() == "text/html":
            # 自动解码传输编码
            payload = part.get_payload(decode=True)
            # 按邮件声明的编码转字符串,无声明则用utf-8兜底
            charset = part.get_content_charset() or "utf-8"
            html_content = payload.decode(charset, errors="ignore")
            break
else:
    # 单部件邮件直接解码
    payload = mail_body.get_payload(decode=True)
    charset = mail_body.get_content_charset() or "utf-8"
    html_content = payload.decode(charset, errors="ignore")

# 配置html2text过滤冗余格式
h = html2text.HTML2Text()
h.ignore_tables = True # 忽略表格转换,避免生成多余|、---符号
h.body_width = 0 # 取消自动换行,避免强行截断单词
x1 = h.handle(html_content)

核心修改说明

  • 调用get_payload(decode=True)自动处理传输编码,直接解决=开头的乱码、行尾截断问题
  • 增加多部件邮件遍历逻辑,仅提取text/html类型的正文内容,避免混入附件、邮件头其他冗余内容
  • 配置html2text参数,关闭自动换行、忽略表格转换,消除多余的markdown格式符号

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:36:03