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")
解决方案
问题根源
- Python中识别windows-874编码的标准名称是
cp874,而非windows-874,直接用后者会触发LookupError。 - 原始代码只取
decode_header返回的第一个片段,忽略了主题可能由多编码部分组成的情况。 - 异常处理错误捕获了
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
相关产品推荐
相关产品推荐

