使用Python imap_tools按UTF-8带重音主题筛选Gmail邮件时ASCII编码错误的解决咨询
解决imap_tools筛选带重音UTF-8主题的编码问题
嘿,这个问题本质是IMAP协议的SEARCH命令对主题参数的默认编码限制在搞鬼!imap_tools的AND(subject=...)底层是给Gmail的IMAP服务器发SEARCH指令,而Gmail的IMAP SEARCH默认只处理ASCII编码的主题字符串,你带重音的UTF-8主题直接传就触发了编码错误——不过msg.subject能正常显示是因为imap_tools已经帮你解码了邮件头的RFC2047编码(比如quoted-printable或base64格式)。
给你两种靠谱的解决方案,按需选择:
方案一:服务器端筛选(适合邮件量大的场景)
手动把带重音的主题编码成IMAP SEARCH支持的格式,然后用imap_tools的raw参数传入自定义的SEARCH条件:
import email.header from imap_tools import MailBox, AND from datetime import date # 你的带重音目标主题 target_subject = "Élément important" # 将主题编码为IMAP SEARCH兼容的格式 encoded_subject = email.header.encode_header(target_subject, charset='utf-8').replace('\n', '') # 构造IMAP SEARCH命令:匹配主题 + 今天的日期 today_date = date.today().strftime('%d-%b-%Y') # IMAP日期格式是DD-Mon-YYYY,比如05-Oct-2024 search_condition = AND(raw=f'SUBJECT "{encoded_subject}" ON {today_date}') with MailBox('imap.gmail.com').login('myadress@gmail.com', 'password', 'INBOX') as mailbox: for msg in mailbox.fetch(search_condition): print(msg.subject) for att in msg.attachments: # 注意路径修正:原路径少了斜杠,会导致保存失败 with open(f'C:/Downloads/{att.filename}', 'wb') as f: f.write(att.payload)
方案二:本地筛选(简单可靠,适合邮件量不大的场景)
先按日期在服务器端筛选出今天的邮件,然后在Python本地用UTF-8字符串匹配主题——完全绕开IMAP的编码限制,代码更简洁:
from imap_tools import MailBox, AND from datetime import date target_subject = "Élément important" with MailBox('imap.gmail.com').login('myadress@gmail.com', 'password', 'INBOX') as mailbox: # 先拉取所有今天的邮件 for msg in mailbox.fetch(AND(date=date.today())): # 本地精确匹配主题(也可以用`target_subject in msg.subject`做包含匹配) if msg.subject == target_subject: print(msg.subject) for att in msg.attachments: with open(f'C:/Downloads/{att.filename}', 'wb') as f: f.write(att.payload)
额外提醒
你原代码里的路径'C:Downloads{}'有问题,Windows路径需要用C:/Downloads/或者C:\\Downloads\\,否则会把Downloads当成盘符的一部分,导致文件保存失败。
内容的提问来源于stack exchange,提问作者Sooplis
相关产品推荐
相关产品推荐

