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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:35:26