在这里和互联网上搜索,有很多关于如何将消息标记为“已读”的示例,尽管这是使用 imap 自动实现的。
但是我如何将电子邮件标记为
UNSEEN
或 UNREAD
。
我有一个 python 脚本,它接收
UNSEEN
消息,并且效果很好。但是读完它们后,imap 会自动将它们标记为 SEEN
,这可以正常工作,但前提是脚本没有错误,因为如果它引发异常,我希望电子邮件再次标记为 UNSEEN
,所以下次脚本将再次阅读该消息。
我怎样才能实现这个目标?
我也使用了
mail.select(mail_label,readonly=True)
,但它没有帮助,因为我无法将消息标记为我也需要的SEEN
。我也希望它能与 Gmail 一起使用。
您可以使用此命令轻松清除
\Seen
标志:
tag UID STORE -FLAGS (\Seen)
但是,如果您在成功处理消息后首先设置
\Seen
标志,您的软件可能会更加鲁棒。这样,如果在处理消息时出现任何问题(即使与 IMAP 服务器的连接中断),该标志仍保持未设置状态,并且您可以在下次脚本运行时重试该消息。您可以通过使用 \Seen
而不是 BODY.PEEK
来避免 IMAP 服务器自动设置 BODY
标志来实现此目的。
在Python中,我认为应该像这样发出
STORE
命令,但我还没有尝试过。
connection.uid('STORE', '-FLAGS', '(\Seen)')
在 Python 中,imaplib 模块将 STORE 描述为:
(typ, [data]) = <instance>.store(message_set, command, flags)
因此,下面的行将让您根据需要将消息设置为 READ ('+FLAGS') 或 UNREAD ('-FLAGS')。
connection.uid('STORE', MESSAGE_ID, '+FLAGS', '\SEEN')
如您所见,秘密在于 FLAGS 命令;)
`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).
您可以使用 imap_tools 包: https://pypi.org/project/imap-tools/
from imap_tools import MailBox, MailMessageFlags, A
with MailBox('imap.mail.com').login('[email protected]', '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)
我是 lib 作者。
我创建了一个 IMAP 库,Red Box,在这种情况下使用它非常直观。
首先我们配置电子邮箱(了解更多有关配置的信息):
from redbox import EmailBox
# Create email box instance
box = EmailBox(
host="imap.example.com",
port=993,
username="[email protected]",
password="<PASSWORD>"
)
# Select an email folder
inbox = box["INBOX"]
然后我们搜索一封电子邮件(阅读有关查询的更多信息):
from redbox.query import SUBJECT
msgs = inbox.search(SUBJECT("Example email"))
msg = msgs[0]
然后我们设置标志:
# Set \Seen flag
msg.read()
# Remove \Seen flag
msg.unread()
您也可以使用
set
方法:
# Set \Seen flag
msg.set(seen=True)
# Remove \Seen flag
msg.set(seen=False)
相关链接:
我将留下有效的内容,它是其他线程中留下的几个答案的组合。看来APPEND中的flags不太好理解。
import imaplib
mail.select("Inbox", readonly=False)
status, messages = mail.uid('SEARCH', None, '(UNSEEN)')
message_ids = messages[0].split()
for message_id in message_ids:
status, message_data = mail.uid('FETCH', message_id, '(RFC822)')
email_from = message.get("From")
email_subject = message.get("Subject")
mail.uid('STORE', message_id, '-FLAGS', '\\SEEN')