Python 使用imaplib获取电子邮件,但不要将其标记为已看到

Python 使用imaplib获取电子邮件,但不要将其标记为已看到,python,gmail,imaplib,Python,Gmail,Imaplib,我想解析用户收件箱中的一些电子邮件,但当我解析时: typ, msg_data = imap_conn.fetch(uid, '(RFC822)') 它将电子邮件标记为已看到或已阅读。这不是期望的功能。你知道我怎样才能让邮件保持以前的状态,不管是看到还是不看到?你可以使用(RFC822.PEEK)作为“消息部分”参数,根据(我还没有验证哪些服务器实际正确实现了这一点,但对它们来说似乎并不难)。以下应该可以工作: typ, msg_data = imap_conn.fetch(uid, '(BO

我想解析用户收件箱中的一些电子邮件,但当我解析时:

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

它将电子邮件标记为已看到或已阅读。这不是期望的功能。你知道我怎样才能让邮件保持以前的状态,不管是看到还是不看到?

你可以使用
(RFC822.PEEK)
作为“消息部分”参数,根据(我还没有验证哪些服务器实际正确实现了这一点,但对它们来说似乎并不难)。

以下应该可以工作:

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

BODY.PEEK[TEXT]
等。

您也可以在选择文件夹时将
只读设置为true:

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

您可以使用imap_工具包:


不幸的是,它不适用于Gmail,但之前的答案确实适用。无论如何谢谢你!RFC1730早已过时。等效的方法是
BODY.PEEK[]
如果您出于其他原因(例如,删除您偷看过的一些邮件,因为它们是垃圾邮件或其他原因),则不适合修改文件夹。您可以调用
imap\u conn。在修改文件夹之前选择('Inbox')
,然后选择
imap\u conn.select('Inbox',readonly=True)
请再说一遍。当然,使用PEEK更简单、更可靠。只需
BODY.PEEK[]
即可获取整个消息,而无需修改
\Sent
。BODY.PEEK[]不适用于gmail的IMAP实现。
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)]