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

问题描述 投票:0回答:6

在这里和互联网上搜索,有很多关于如何将消息标记为“已读”的示例,尽管这是使用 imap 自动实现的。

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

UNSEEN
UNREAD

我有一个 python 脚本,它接收

UNSEEN
消息,并且效果很好。但是读完它们后,imap 会自动将它们标记为
SEEN
,这可以正常工作,但前提是脚本没有错误,因为如果它引发异常,我希望电子邮件再次标记为
UNSEEN
,所以下次脚本将再次阅读该消息。

我怎样才能实现这个目标?

我也使用了

mail.select(mail_label,readonly=True)
,但它没有帮助,因为我无法将消息标记为我也需要的
SEEN
。我也希望它能与 Gmail 一起使用。

python imap
6个回答
12
投票

您可以使用此命令轻松清除

\Seen
标志:

tag UID STORE -FLAGS (\Seen)

但是,如果您在成功处理消息后首先设置

\Seen
标志,您的软件可能会更加鲁棒。这样,如果在处理消息时出现任何问题(即使与 IMAP 服务器的连接中断),该标志仍保持未设置状态,并且您可以在下次脚本运行时重试该消息。您可以通过使用
\Seen
而不是
BODY.PEEK
来避免 IMAP 服务器自动设置
BODY
标志来实现此目的。

在Python中,我认为应该像这样发出

STORE
命令,但我还没有尝试过。

connection.uid('STORE', '-FLAGS', '(\Seen)')

7
投票

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

(typ, [data]) = <instance>.store(message_set, command, flags)

因此,下面的行将让您根据需要将消息设置为 READ ('+FLAGS') 或 UNREAD ('-FLAGS')。

connection.uid('STORE', MESSAGE_ID, '+FLAGS', '\SEEN')

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


7
投票
`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).

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


6
投票

您可以使用 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 作者。


1
投票

我创建了一个 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)

在此处阅读有关消息的更多信息

相关链接


0
投票

我将留下有效的内容,它是其他线程中留下的几个答案的组合。看来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')

© www.soinside.com 2019 - 2024. All rights reserved.