python imaplib - 将电子邮件标记为未读或未读

eLR*_*uLL 7 python imap

在这里和互联网上搜索,有很多例子可以将消息标记为SEEN,即使这是使用imap自动进行的.

但是如何将电子邮件标记为UNSEENUNREAD.

我在python中有一个接收UNSEEN消息的脚本,它工作得很好.但是在阅读它们之后,imap会自动将它们标记为SEEN工作正常,但前提是脚本没有错误,因为如果它引发异常,我希望将电子邮件再次标记为UNSEEN,因此下次脚本将再次读取该消息.

我怎么能做到这一点?

我也曾经使用过mail.select(mail_label,readonly=True),但它并没有帮助,因为我无法标记SEEN我也需要的消息.我也希望这适用于Gmail.

Cel*_*ada 11

您可以\Seen使用此命令轻松清除标志:

tag UID STORE -FLAGS (\Seen)
Run Code Online (Sandbox Code Playgroud)

但是,如果您\Seen在成功处理完邮件后只在第一个位置设置了标记,那么您的软件可能会更加强大.这样,如果在处理消息时出现任何问题(即使与IMAP服务器的连接中断),该标志仍​​然未设置,您可以在下次运行脚本时重试该消息.您可以\Seen通过使用BODY.PEEK而不是使用IMAP服务器自动设置标志来实现此目的BODY.

在Python,我认为STORE命令应该发出这样的,但我还没有尝试过.

connection.uid('STORE', '-FLAGS', '(\Seen)')
Run Code Online (Sandbox Code Playgroud)


Vla*_*mir 6

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

from imap_tools import MailBox, MailMessageFlags, A

with MailBox('imap.mail.com').login('test@mail.com', 'pwd', 'INBOX') as mailbox:

    # FLAG unseen messages in current folder as Answered and Flagged, *in bulk.
    flags = (MailMessageFlags.ANSWERED, MailMessageFlags.FLAGGED)
    mailbox.flag(mailbox.uids(A(seen=False)), flags, True)

    # SEEN: mark all messages sent at 05.03.2007 in current folder as unseen, *in bulk
    mailbox.flag(mailbox.uids("SENTON 05-Mar-2007"), MailMessageFlags.SEEN, False)
Run Code Online (Sandbox Code Playgroud)

我是 lib 作者。


小智 6

`imap = imaplib.IMAP4_SSL(server)
 imap.login(username, password)
 imap.select("inbox", readonly=False)`
Run Code Online (Sandbox Code Playgroud)

如果 readonly="True" 您无法更改任何标志。但是,如果它是假的,你可以这样做,

imap.store(id, '-FLAGS', '\Seen')
Run Code Online (Sandbox Code Playgroud)

然后电子邮件将标记为未读

(-) 表示 REMOVE 标志,(+) 表示 ADD 标志。

例如:您imap.store(id, '+FLAGS', '\Deleted')也可以设置删除电子邮件。
像这样你可以设置下面的任何标志

    \Seen       Message has been read

    \Answered   Message has been answered

    \Flagged    Message is "flagged" for urgent/special attention

    \Deleted    Message is "deleted" for removal by later EXPUNGE

    \Draft      Message has not completed composition (marked as a
                draft).
Run Code Online (Sandbox Code Playgroud)

更多详细信息:https://www.rfc-editor.org/rfc/rfc2060.html#page-9


小智 5

在Python中,imaplib模块将STORE描述为:

(typ, [data]) = <instance>.store(message_set, command, flags)
Run Code Online (Sandbox Code Playgroud)

因此,以下行将允许您根据需要将消息设置为READ('+ FLAGS')或UNREAD('-FLAGS').

connection.uid('STORE', MESSAGE_ID, '+FLAGS', '\SEEN')
Run Code Online (Sandbox Code Playgroud)

如您所见,秘密在FLAGS命令上;)