在这里和互联网上搜索,有很多关于如何将消息标记为SEEN的示例,即使这是使用imap自动进行的。
但如何将电子邮件标记为UNSEEN
或UNREAD
。
我在python中有一个接收UNSEEN
消息的脚本,它运行良好。但是在阅读它们之后,imap会自动将它们标记为SEEN
,但只有在脚本没有错误时才能正常工作,因为如果它引发异常,我希望将电子邮件再次标记为UNSEEN
,这样下次脚本将再次读取该消息。
我怎样才能实现这个目标?
我也使用了mail.select(mail_label,readonly=True)
,但它无济于事,因为我无法将消息标记为SEEN
我也需要。我也希望这可以与Gmail一起使用。
答案 0 :(得分:9)
您可以使用此命令轻松清除\Seen
标志:
tag UID STORE -FLAGS (\Seen)
但如果您在成功处理邮件后首先仅设置\Seen
标志,那么您的软件可能会更加强大。这样,如果在处理消息时出现任何问题(即使与IMAP服务器的连接中断),该标志仍然未设置,您可以在下次运行脚本时重试该消息。您可以通过使用\Seen
而不是BODY.PEEK
来避免IMAP服务器自动设置BODY
标记来执行此操作。
在Python中,我认为应该像这样发出STORE
命令,但我还没有尝试过。
connection.uid('STORE', '-FLAGS', '(\Seen)')
答案 1 :(得分:5)
在Python中,imaplib模块将STORE描述为:
(typ, [data]) = <instance>.store(message_set, command, flags)
因此,以下行将允许您根据需要将消息设置为READ('+ FLAGS')或UNREAD('-FLAGS')。
connection.uid('STORE', MESSAGE_ID, '+FLAGS', '\SEEN')
如您所见,秘密在FLAGS命令上;)
答案 2 :(得分:0)
您可以使用imap_tools软件包: https://pypi.org/project/imap-tools/
with MailBox('imap.mail.com').login('test@mail.com', 'pwd', initial_folder='INBOX') as mailbox:
# FLAG unseen messages in current folder as Answered and Flagged, *in bulk.
flags = (imap_tools.StandardMessageFlags.ANSWERED, imap_tools.StandardMessageFlags.FLAGGED)
mailbox.flag(mailbox.fetch('(UNSEEN)'), flags, True)
# SEEN: mark all messages sent at 05.03.2007 in current folder as unseen, *in bulk
mailbox.seen(mailbox.fetch("SENTON 05-Mar-2007"), False)
答案 3 :(得分:0)
`imap = imaplib.IMAP4_SSL(server)
imap.login(username, password)
imap.select("inbox", readonly=False)`
如果 readonly="True" 你不能改变任何标志。 但是,如果它是假的,你可以做如下,
imap.store(id, '-FLAGS', '\Seen')
然后电子邮件将标记为未读
(-) 表示 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).