我正在使用IMAPClient(Python)从我的电子邮件服务器检索电子邮件,检查标有“\ Recent”的电子邮件。在阅读完电子邮件后,电子邮件服务器会自动将电子邮件标志设置为“\ Seen”。
我想要做的是将电子邮件标记重置为“\ Recent”,这样当我直接在服务器上检查电子邮件时仍然显示为未读。
我发现当我尝试使用IMAPClient的“set_flag”定义将“\ Recent”标志添加到电子邮件时,IMAPClient会抛出异常。添加任何其他标志都可以。
IMAPClient文档说最近的标志是只读的,但我想知道是否还有一种方法可以将电子邮件标记为未读取。
根据我的理解,像Thunderbird这样的电子邮件软件允许您将电子邮件设置为未读取,因此我认为必须有一种方法可以执行此操作。
感谢。
答案 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_flags
和remove_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'