4

我正在使用 IMAPClient (Python) 从我的电子邮件服务器中检索电子邮件,方法是检查标记为“\Recent”的电子邮件。电子邮件被阅读后,电子邮件服务器会自动将电子邮件标志设置为“\Seen”。

我想要做的是将电子邮件标志重置为“\Recent”,因此当我直接在服务器上检查电子邮件时仍然显示为未读。

我发现当我尝试使用 IMAPClient 的“set_flag”定义将“\Recent”标志添加到电子邮件时,IMAPClient 抛出异常。添加任何其他标志都可以正常工作。

IMAPClient 文档说“最近”标志是只读的,但我想知道是否还有办法将电子邮件标记为未读。

据我了解,像 Thunderbird 这样的电子邮件软件允许您将电子邮件设置为未读,所以我认为必须有办法做到这一点。

谢谢。

4

4 回答 4

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_flagsandremove_flags而不是set_flags因为后者将标志重置为指定的标志。设置已读/未读状态时,您通常希望保留任何其他消息标志不变。

还值得注意的是,可以fetch使用“BODY.PEEK”数据项调用来检索部分消息,而不会影响 \Seen 标志。这可以避免在下载消息后修复 \Seen 标志的需要。

有关详细信息,请参阅RFC 3501 的第 6.4.5 节。

于 2012-05-08T21:19:11.860 回答
2

IMAPClient 文档明确指出 '\Recent' 标志是只读的:

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

这可能是 IMAP 和 IMAP 服务器的一个特性(或限制)。(即:可能不是 IMAPClient 限制)。

使用 '\Seen' 标志来标记未读内容。

于 2014-01-30T14:02:15.580 回答
1

免责声明:我熟悉 IMAP,但不熟悉 Python-IMAPClient。

通常,“已看到”标志确定电子邮件摘要是正常显示还是粗体显示。您应该能够重置已看到的标志。但是,最近的标志可能不在您的直接控制之下。如果发现有新消息到达,imap 服务器将设置它。

于 2012-01-30T03:29:12.260 回答
0

@Menno Smits:

在解析邮件后,我在将“\Seen”标志添加到邮件时遇到问题。我只想在邮件包含特定文本时将其标记为已读。

我一直在尝试使用您在上面给出的“client.add_flags(msg_ids,[SEEN])”来使用 add_flags,但我不断收到store failed: Command received in invalid state究竟进入 [SEEN] 的内容(这只是占位符还是确切的语法?)

这是我的代码的一部分:

#login and authentication
context=ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
iobj=imapclient.IMAPClient('outlook.office365.com', ssl=True,ssl_context=context)
iobj.login(uname,pwd)
iobj.select_folder('INBOX', readonly=True)
unread=iobj.search('UNSEEN')
print('There are: ',len(unread),' UNREAD emails')
for i in unread:
  mail=iobj.fetch(i,['BODY[]'])
  mail_body=html2text.html2text(mcontent.html_part.get_payload().decode(mcontent.html_part.charset))
  ##Do some regex to parse the email to check if it contains text
  meter_no=(re.findall(r'\nACCOUNT NUMBER: (\d+)', mail_body))
  req_type=(re.findall(r'Complaint:..+?\n(.+)\n', mail_body))
  if 'Key Change' in req_type:
        if meter_no in kct['Account_no'].values:
            print 'Going to sendmail'# Call a function                                              
            sending_email(meter_no,subject,phone_no,req_type,)              
            mail[b'FLAGS']=r'b\Seen'+','+''+r'b\Answered'##Trying to manuaally alter the flag but didn't work##
            iobj.add_flags(i,br'\Seen')# Didn't work too  (but is 'i' my msg_id??)
            iobj.add_flags(i,[SEEN]) # Complains Name SEEN not defined

        else: print 'KCT is yet to be generated'
于 2017-10-20T09:24:11.953 回答