使用imap-tools仅标记已下载附件的未读邮件为已读的问题
解决imap-tools仅标记已下载附件的邮件为已读问题
原代码的问题在于调用mailbox.fetch时设置了mark_seen=True,这会让所有被抓取到的未读邮件直接被标记为已读,完全跳过了后续的附件检查逻辑。要实现只标记有目标附件且下载完成的邮件为已读,需要调整为手动标记的方式:
修改后的代码
import ssl from imap_tools import MailBox, AND from datetime import date context = ssl.create_default_context() today = date.today() with MailBox('imap.gmail.com', ssl_context=context).login('email', 'password', 'INBOX') as mailbox: # 抓取未读邮件,但不自动标记已读 for msg in mailbox.fetch(AND(seen=False), mark_seen=False): has_downloaded = False # 遍历邮件附件 for att in msg.attachments: print(att.filename, today) if att.filename.lower().endswith('.xlsx'): # 记录日志 with open('D:/pp/nf/mail/1.txt', 'a') as f: print(att.filename, today, file=f) # 保存附件 with open(f'D:/pp/nf/mail/{att.filename}', 'wb') as f: f.write(att.payload) has_downloaded = True # 只有当邮件有符合条件的附件且完成下载时,才标记为已读 if has_downloaded: mailbox.seen([msg.uid])
关键改动说明
- 取消
fetch方法的mark_seen=True,改为mark_seen=False,避免自动标记所有未读邮件 - 新增
has_downloaded变量,用来记录当前邮件是否成功下载了目标附件 - 在附件下载完成后,通过
mailbox.seen([msg.uid])手动标记该邮件为已读,确保只有符合条件的邮件才会被更改状态
内容的提问来源于stack exchange,提问作者xiii
相关产品推荐
相关产品推荐

