使用 imaplib 获取电子邮件,但不要将其标记为 SEEN

Posted

技术标签:

【中文标题】使用 imaplib 获取电子邮件,但不要将其标记为 SEEN【英文标题】:Fetch an email with imaplib but do not mark it as SEEN 【发布时间】:2011-03-18 01:00:54 【问题描述】:

我想解析来自用户收件箱的一些电子邮件,但是当我这样做时:

typ, msg_data = imap_conn.fetch(uid, '(RFC822)')

它将电子邮件标记为已读或已读。这不是所需的功能。你知道我怎样才能让电子邮件保持以前的凝视状态,要么看到要么没看到?

【问题讨论】:

【参考方案1】:

您还可以在选择文件夹时将 read_only 设置为 true:

imap_conn.select('Inbox', readonly=True)

【讨论】:

如果您出于其他原因想要修改文件夹(例如,删除您偷看的一些邮件,因为它们是垃圾邮件,或其他原因),这不合适。 您可以在修改文件夹之前调用imap_conn.select('Inbox'),然后再次调用imap_conn.select('Inbox', readonly=True)。当然,使用 PEEK 更简单、更可靠。【参考方案2】:

以下应该有效:

typ, msg_data = imap_conn.fetch(uid, '(BODY.PEEK[HEADER])')

BODY.PEEK[TEXT]

【讨论】:

只需BODY.PEEK[] 获取整个消息而不修改\Sent BODY.PEEK[] 不适用于 gmail 的 IMAP 实现。【参考方案3】:

根据RFC 1730,您可以使用(RFC822.PEEK) 作为“消息部分”参数(我尚未验证哪些服务器实际上正确实现了该功能,但它们似乎并不难)。

【讨论】:

不幸的是,它不适用于 Gmail,但之前的答案可以。还是谢谢你! RFC1730 早已过时。 RFC3501 等价于 BODY.PEEK[]【参考方案4】:

你可以使用 imap_tools 包: https://pypi.org/project/imap-tools/

from imap_tools import MailBox, Q

# get list of email subjects from INBOX folder
with MailBox('imap.mail.com').login('test@mail.com', 'password') as mailbox:
    # mark_seen=False - not mark emails as seen on fetch
    subjects = [msg.subject for msg in mailbox.fetch(mark_seen=False)]

【讨论】:

以上是关于使用 imaplib 获取电子邮件,但不要将其标记为 SEEN的主要内容,如果未能解决你的问题,请参考以下文章

具有多个条件的python imaplib搜索

如何在 python 中使用 imaplib 获取电子邮件正文?

Python 和 imaplib:无需下载完整电子邮件即可获取附件名称或正文

获取 HTML、imaplib 和 Django 格式的文本

Python/imaplib - 如何获取消息的标签?

只获取新的电子邮件 imaplib 和 python