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

Python邮件机器人因windows-874编码未知崩溃,求解决办法

解决LookupError: unknown encoding: windows-874邮件解码问题

开发的IMAP邮件机器人在解码邮件主题时崩溃,报错LookupError: unknown encoding: windows-874,触发于email.header.decode_header解析后的解码步骤。添加异常处理后仍未解决,需要能正确解码windows-874的简洁方案。

错误栈信息

29%|███████████████████████▋                                                          | 32/111 [00:47<01:56,  1.47s/it]
Traceback (most recent call last):
  File "RobotVP.py", line 5818, in <module>
    GestionBoitePDP.get_mail_deal_with_it(skipgetpasswords = None)
  File "RobotVP.py", line 5566, in get_mail_deal_with_it
    subject = subject.decode(encoding)
LookupError: unknown encoding: windows-874

相关原始处理代码

for response_part in x:
    if isinstance(response_part, tuple):
        msg = email.message_from_string(response_part[1].decode(encoding = "ISO-8859-1"))
        varSubject = msg['subject']
        varFrom = msg['from']
        datemsg = msg["Date"]

senderemail = varFrom
subject = varSubject
if subject is not None:
    subject = subject.replace("\r","").replace("\n","").strip()
    subject, encoding = email.header.decode_header(subject)[0]
    if (encoding == None):
        subject = subject
    else:
        subject = subject.decode(encoding)

添加异常处理后的无效代码

if (skipgetpasswords == None):
    for self.i in tqdm(range(latest_email_id, oldest_email_id - 1, -1)):
        resp, data = self.m.fetch(str(self.i), "(UID)")
        msg_uid = self.parse_uid(data[0].decode())
        typ, x = self.m.fetch(str(self.i), '(RFC822)')
        xdeleted = False
        status = ""

        for response_part in x:
            if isinstance(response_part, tuple):
                msg = email.message_from_string(response_part[1].decode(encoding = "ISO-8859-1"))
                varSubject = msg['subject']
                varFrom = msg['from']
                datemsg = msg["Date"]

        senderemail = varFrom
        subject = varSubject
        if subject is not None:
            subject = subject.replace("\r","").replace("\n","").strip()
            subject, encoding = email.header.decode_header(subject)[0]
            if (encoding == None):
                subject = subject
            else:
                try: 
                    subject = subject.decode(encoding)
                except NameError: 
                    subject = subject.decode("windows-874")
                except:
                    subject = subject.decode("windows-874")

解决方案

问题根源

  1. Python中识别windows-874编码的标准名称是cp874,而非windows-874,直接用后者会触发LookupError。
  2. 原始代码只取decode_header返回的第一个片段,忽略了主题可能由多编码部分组成的情况。
  3. 异常处理错误捕获了NameError,而非实际触发的LookupError。

修正后的解码代码

if subject is not None:
    subject = subject.replace("\r","").replace("\n","").strip()
    # 处理decode_header返回的所有主题片段(可能多编码组合)
    subject_parts = email.header.decode_header(subject)
    decoded_parts = []
    for part, encoding in subject_parts:
        if isinstance(part, str):
            decoded_parts.append(part)
            continue
        # 编码名称映射:将windows-874转为Python识别的cp874
        norm_encoding = encoding.lower().replace("windows-874", "cp874") if encoding else "utf-8"
        try:
            decoded_part = part.decode(norm_encoding)
        except (LookupError, UnicodeDecodeError):
            # 解码失败时用utf-8兼容处理,替换无法识别的字符
            decoded_part = part.decode("utf-8", errors="replace")
        decoded_parts.append(decoded_part)
    # 拼接所有解码后的片段得到完整主题
    subject = "".join(decoded_parts)

关键改进点

  • 遍历decode_header返回的所有部分,支持多编码组合的主题
  • 将windows-874映射为Python兼容的cp874编码名称
  • 正确捕获LookupError和UnicodeDecodeError,避免崩溃
  • 解码失败时使用utf-8并替换错误字符,保证程序继续运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:46:02