我尝试从收件箱文件夹中删除消息,一切都很好,但是当我切换到所有邮件文件夹时,删除不起作用。 expunge() 方法返回 ('OK', [None]) 并未删除消息:

>>>import imaplib
>>>server = imaplib.IMAP4_SSL('imap.gmail.com','993')
>>>server.login('likvidator89@gmail.com','Password')
>>>server.select('inbox')
>>>for i in server.search(None,'all')[1][0].split():
...    print i+"\n"+server.fetch(i,'(BODY[HEADER.FIELDS (Subject)])')[1][0][1]
...
#  that how i know what UID hame my message? I select by subject
#....
#28
#Subject: 1 Question Has 1 Answer - Stack Overflow
#
#
#29
#Subject: 2222222222
#...
>>>server.store(29,'+FLAGS','\\Deleted')
#('OK', ['29 (FLAGS (\\Seen \\Deleted))'])
>>>server.expunge()
#('OK', ['29'])
>>> server.select('[Gmail]/All Mail')
('OK', ['47'])
>>> for i in server.search(None,'all')[1][0].split():
...  print i+"\n"+server.fetch(i,'(BODY[HEADER.FIELDS (Subject)])')[1][0][1]
... 
#....
#
#46
#Subject: 2222222222
#
#
#47
#Subject: 3333333333333333
#
#....
>>> server.store(47,'+FLAGS','\\Deleted')
('OK', ['47 (FLAGS (\\Seen \\Deleted))'])
>>> server.expunge()
('OK', [None])
有帮助吗?

解决方案

正如它在 Gmail博客网站, ,Google的IMAP实现有些不同。当您遵循获取更多常规语义的说明时,它会有所帮助吗?

对于那些想要使Gmail的IMAP更像传统IMAP提供商的人来说,还有一些晦涩难懂的选择:当他们不再通过IMAP可见时,您可以关闭自动充足或垃圾消息。

IMAP协议允许将消息标记为删除,这是一种困境状态,在该文件夹中仍然存在消息,但在下次删除文件夹时定义要删除。在我们的标准IMAP实现中,当您将消息标记为已删除时,Gmail不允许它在该状态下徘徊 - 它会立即从文件夹中删除(或自动expunges)。如果您想要两阶段的删除进程,则在启用了本实验室后,只需在设置中的“转发和pop/imap”选项卡下选择“不要自动删除消息”。

同样,大多数IMAP系统也不共享Gmail的归档消息的概念(将消息发送到[Gmail]/All Mail文件夹而不是[Gmail]/Drash)。如果您希望将已删除的消息不保留在任何其他可见IMAP文件夹中,则将其发送到[Gmail]/垃圾桶,而高级IMAP控件可以使您以这种方式设置首选项。在“ IMAP访问:”“转发和pop/imap”选项卡的“ IMAP访问”部分中,找到“从最后一个可见的IMAP文件夹”删除消息时:'选项。选择“将消息移至Gmail垃圾桶”。如果您想更进一步,可以选择“立即删除消息”。

其他提示

它将给定的Gmail标签中的所有邮件移至Gmail垃圾桶

#!usr/bin/python
import email, imaplib

user = 'xxx'
pwd = 'xxx'

m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user,pwd)

m.select("some_gmail_label")
m.store("1:*",'+X-GM-LABELS', '\\Trash')

m.expunge() # should be useless, but gmail server says it is ok

记住要刷新您的gmail界面,因为它具有缓存

Gmail Advanced IMAP控件 当您通过IMAP删除消息时,您可以设置会发生的事情。

只需在Gmail Labs中启用“高级IMAP控件”即可。设置页面看起来像这样:

settings

然后,当您将消息标记为已删除并根据 这个答案 它将被移至垃圾箱,永久删除或存档到“所有邮件”,具体取决于您选择的设置。

这是与Gmail一起使用的,并且很快就可以使用(无需存储在for循环中)。根据您的意愿来量身定制此功能,但是关于如何使用选择/搜索然后执行商店的想法,或者只需单独选择具有特定标签/文件夹的所有项目:

#!/bin/python

import datetime
import imaplib

m = imaplib.IMAP4_SSL("imap.gmail.com")  # server to connect to
print "Connecting to mailbox..."
m.login('gmail@your_gmail.com', 'your_password')

print m.select('[Gmail]/All Mail')  # required to perform search, m.list() for all lables, '[Gmail]/Sent Mail'
before_date = (datetime.date.today() - datetime.timedelta(365)).strftime("%d-%b-%Y")  # date string, 04-Jan-2013
typ, data = m.search(None, '(BEFORE {0})'.format(before_date))  # search pointer for msgs before before_date

if data != ['']:  # if not empty list means messages exist
    no_msgs = data[0].split()[-1]  # last msg id in the list
    print "To be removed:\t", no_msgs, "messages found with date before", before_date
    m.store("1:{0}".format(no_msgs), '+X-GM-LABELS', '\\Trash')  # move to trash
    print "Deleted {0} messages. Closing connection & logging out.".format(no_msgs)
else:
    print "Nothing to remove."

#This block empties trash, remove if you want to keep, Gmail auto purges trash after 30 days.
print("Emptying Trash & Expunge...")
m.select('[Gmail]/Trash')  # select all trash
m.store("1:*", '+FLAGS', '\\Deleted')  #Flag all Trash as Deleted
m.expunge()  # not need if auto-expunge enabled

print("Done. Closing connection & logging out.")
m.close()
m.logout()
print "All Done."
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top