我正在尝试使用Python IMAP库将电子邮件设置为已读。就像在这个例子中一样: Python, IMAP and GMail. Mark messages as SEEN
我选择GMail帐户的“所有电子邮件”文件夹,然后通过搜索命令获取特定电子邮件的UID。然后我使用该UID尝试将其标记为已读,但失败。
result, data = mail.uid('fetch', email_uid, '(FLAGS)')
print "RESULT: ",result,data
mail.select(folder_name, readonly=False)
result, data = mail.store(email_uid, '+FLAGS', '\\Seen')
print "RESULT OF OPERATION FOR UID",email_uid,result,data
无论我运行这段代码多少次,我总是获得不包含\ Seen标志的标志。
示例执行(忽略Django打印):
FINAL QUERY: (SENTSINCE 07-Mar-2013 SENTBEFORE 11-Mar-2013 LARGER 7508 SMALLER 7510)
RESULT: OK ['31424 (UID 54264 FLAGS (NotJunk $NotJunk))']
RESULT OF OPERATION FOR UID 54264 OK [None]
[09/Mar/2013 17:30:37] "GET /api/mark_as_read/320/?token=8e3c057b841b75c864685786b2a9657aadf17e3bfb991b103b7c4b3ffdd2a753&refresh_mode=all&folder_mode=inbox HTTP/1.1" 200 144
FINAL QUERY: (SENTSINCE 07-Mar-2013 SENTBEFORE 11-Mar-2013 LARGER 7508 SMALLER 7510)
RESULT: OK ['31424 (UID 54264 FLAGS (NotJunk $NotJunk))']
RESULT OF OPERATION FOR UID 54264 OK [None]
[09/Mar/2013 17:30:44] "GET /api/mark_as_read/320/?token=8e3c057b841b75c864685786b2a9657aadf17e3bfb991b103b7c4b3ffdd2a753&refresh_mode=all&folder_mode=inbox HTTP/1.1" 200 144
FINAL QUERY: (SENTSINCE 07-Mar-2013 SENTBEFORE 11-Mar-2013 LARGER 7508 SMALLER 7510)
RESULT: OK ['31424 (UID 54264 FLAGS (NotJunk $NotJunk \\Seen))']
RESULT OF OPERATION FOR UID 54264 OK [None]
我尝试了多种变体。我尝试设置标志\ Seen,Seen,\ Seen,SEEN,带括号,没有括号,并且不知道我可以尝试除此之外。
我怀疑这里可能会有一些非常具体的细节 - 也许GMail“All email”文件夹不允许将电子邮件标记为已阅读?
我也不知道在mail.store命令中返回的(result,data)元组中,如果数据变量应该具有正常执行的“[None]”变量,或者它是否意味着出了问题。
如果我尝试设置错误的标志,如\\看到mail.store命令引发错误。因此,在设置\ Seen标志时,它是一个有效的IMAP标志。
我不知道下一步该尝试什么。
任何帮助都会非常有用。
答案 0 :(得分:0)
IMAP specification for the STORE command没有通过UID设置标志的选项。您只能通过message set
设置它们(就像您链接到的示例中一样)
有时的唯一原因是你的UID和消息集的序列相对接近(31424
vs 54264
)。
RESULT: OK ['31424 (UID 54264 FLAGS (NotJunk $NotJunk))']
您实际上永远不会按UID
设置标记,您是按message set
设置的...有时会对应UID
您可以按UID
设置标记(但不是STORE
命令)。您可以使用第一个参数store
发出UID Command来设置标志:
result, data = mail.uid('store', '542648', '+FLAGS', '(\\Seen)')
如果成功,服务器将使用与您使用的UID相对应的message set
响应-eg(使用您的示例):
OK ['31424 (FLAGS (\\Seen))']
答案 1 :(得分:0)
您可以使用imap_tools软件包: https://pypi.org/project/imap-tools/
with MailBox('imap.mail.com').login('test@mail.com', 'pwd', initial_folder='INBOX') as mailbox:
# SEEN: mark all messages sent at 05.03.2007 in current folder as unseen, *in bulk
mailbox.seen(mailbox.fetch("SENTON 05-Mar-2007"), False)