如何使用IMAPClient将邮件标记为最近

4 投票
4 回答
6781 浏览
提问于 2025-04-17 11:55

我正在使用IMAPClient(Python)从我的邮件服务器获取邮件,方法是检查那些被标记为"\Recent"的邮件。当我阅读了邮件后,邮件服务器会自动把邮件的标记改为"\Seen"。

我想做的是把邮件的标记重置为"\Recent",这样当我直接在服务器上查看邮件时,它仍然会显示为未读。

我发现,当我尝试用IMAPClient的"set_flag"功能给邮件添加"\Recent"标记时,IMAPClient会抛出一个异常。添加其他标记是没问题的。

IMAPClient的文档说,Recent标记是只读的,但我在想是否还有其他方法可以把邮件标记为未读。

根据我的理解,像Thunderbird这样的邮件软件允许你把邮件设置为未读,所以我想应该有办法做到这一点。

谢谢。

4 个回答

2

IMAPClient的文档特别说明了'\Recent'这个标记是只读的:

http://imapclient.readthedocs.org/en/latest/#message-flags

这可能是IMAP和IMAP服务器的一个特性(或者说是限制)。(也就是说,这可能不是IMAPClient本身的限制)。

要标记某个邮件为未读,可以使用'\Seen'这个标记。

5

为了完整性,这里有一个使用IMAPClient的实际例子。我们更新了\Seen标志,以控制邮件是标记为已读还是未读。

from imapclient import IMAPClient, SEEN

client = IMAPClient(...)
client.select_folder('INBOX')
msg_ids = client.search(...)

# Mark messages as read
client.add_flags(msg_ids, [SEEN])

# Mark messages as unread
client.remove_flags(msg_ids, [SEEN])

需要注意的是,使用add_flagsremove_flags,而不是set_flags,因为后者会把标志重置为仅指定的那些。当你设置邮件的已读/未读状态时,通常希望保留其他邮件标志不变。

还值得一提的是,可以使用fetch和“BODY.PEEK”这个数据项来获取邮件的部分内容,而不会影响\Seen标志。这样可以避免在下载邮件后需要修复\Seen标志的问题。

有关更多细节,请参见RFC 3501的第6.4.5节

1

免责声明:我对IMAP很熟悉,但对Python-IMAPClient不太了解。

通常,'seen'这个标记决定了邮件摘要是以正常字体显示还是加粗显示。你应该能够重置这个'见过'的标记。不过,'recent'这个标记可能不在你的直接控制之下。如果有新邮件到达,IMAP服务器会自动设置这个标记。

撰写回答