在这里和互联网上搜索,有很多例子可以将消息标记为SEEN,即使这是使用imap自动进行的.
但是如何将电子邮件标记为UNSEEN或UNREAD.
我在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)
您可以使用 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命令上;)