如何使用IMAPClient将邮件标记为最近
我正在使用IMAPClient(Python)从我的邮件服务器获取邮件,方法是检查那些被标记为"\Recent"的邮件。当我阅读了邮件后,邮件服务器会自动把邮件的标记改为"\Seen"。
我想做的是把邮件的标记重置为"\Recent",这样当我直接在服务器上查看邮件时,它仍然会显示为未读。
我发现,当我尝试用IMAPClient的"set_flag"功能给邮件添加"\Recent"标记时,IMAPClient会抛出一个异常。添加其他标记是没问题的。
IMAPClient的文档说,Recent标记是只读的,但我在想是否还有其他方法可以把邮件标记为未读。
根据我的理解,像Thunderbird这样的邮件软件允许你把邮件设置为未读,所以我想应该有办法做到这一点。
谢谢。
4 个回答
IMAPClient的文档特别说明了'\Recent'这个标记是只读的:
http://imapclient.readthedocs.org/en/latest/#message-flags
这可能是IMAP和IMAP服务器的一个特性(或者说是限制)。(也就是说,这可能不是IMAPClient本身的限制)。
要标记某个邮件为未读,可以使用'\Seen'这个标记。
为了完整性,这里有一个使用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_flags
和remove_flags
,而不是set_flags
,因为后者会把标志重置为仅指定的那些。当你设置邮件的已读/未读状态时,通常希望保留其他邮件标志不变。
还值得一提的是,可以使用fetch
和“BODY.PEEK”这个数据项来获取邮件的部分内容,而不会影响\Seen标志。这样可以避免在下载邮件后需要修复\Seen标志的问题。
有关更多细节,请参见RFC 3501的第6.4.5节。
免责声明:我对IMAP很熟悉,但对Python-IMAPClient不太了解。
通常,'seen'这个标记决定了邮件摘要是以正常字体显示还是加粗显示。你应该能够重置这个'见过'的标记。不过,'recent'这个标记可能不在你的直接控制之下。如果有新邮件到达,IMAP服务器会自动设置这个标记。