如何使用IMAPClient将电子邮件标志更改为Recent

时间:2012-01-30 03:00:38

标签: python imaplib

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

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

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

IMAPClient文档说最近的标志是只读的,但我想知道是否还有一种方法可以将电子邮件标记为未读取。

根据我的理解,像Thunderbird这样的电子邮件软件允许您将电子邮件设置为未读取,因此我认为必须有一种方法可以执行此操作。

感谢。

4 个答案:

答案 0 :(得分:3)

为了完整性,这是使用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,因为后者会将标志重置为指定的标志。设置读取/未读取状态时,通常希望保留任何其他消息标记。

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

有关详细信息,请参阅section 6.4.5 of RFC 3501

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

IMAPClient文档明确指出'\ Recent'标志是ReadOnly:

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

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

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

答案 3 :(得分:0)

@Menno Smits:

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

我一直在尝试使用你上面提到的“client.add_flags(msg_ids,[SEEN])”的add_flags,但我一直在存储失败:命令收到无效状态究竟是什么进入[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'