使用imaplib删除gmail中的电子邮件出现问题

7

我尝试从收件箱中删除邮件,一切都很顺利,但当我切换到所有邮件文件夹时,删除操作就无法正常进行了。调用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])
4个回答

17

它将给定 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 界面,因为它有缓存


好的建议。m.store() 的使用文档在哪里? - jml
@jml:引用自IMAP规范,RFC 3501*代表正在使用的最大数字 - ckhan

9
正如Gmail博客网站上所说的那样,谷歌实现的IMAP有些不同。当您按照获取更常见语义的说明操作时,是否有帮助?
对于那些想要使Gmail的IMAP更像传统IMAP提供程序的用户,还有一些更为晦涩的选项:您可以关闭自动删除或在消息通过IMAP不再可见时将其放入垃圾箱。
IMAP协议允许将邮件标记为删除状态,即一种类似于中间状态,在此状态下邮件仍然存在于文件夹中,但在下次清除文件夹时将被删除。在我们的标准IMAP实现中,当您将邮件标记为已删除时,Gmail不会让它保持在该状态中,而是立即从文件夹中删除(或自动清除)。如果您想要使用两阶段删除过程,请在启用此实验室后,在“设置”中的“转发和POP / IMAP”选项卡下选择“不自动清除邮件”。
同样,大多数IMAP系统不共享Gmail的归档邮件概念(将邮件发送到[Gmail] / All Mail文件夹而不是[Gmail] / Trash)。如果您希望已删除的邮件不保留在任何其他可见的IMAP文件夹中,而是发送到[Gmail] / Trash,请使用高级IMAP控件将您的首选项设置为此方式。在“转发和POP / IMAP”选项卡的“IMAP访问:”部分中,找到“当从最后一个可见的IMAP文件夹中删除邮件时:”选项。选择“将邮件移动到Gmail垃圾箱”。如果您想要更进一步,请选择“立即永久删除该消息”。

6
使用Gmail高级IMAP控件,您可以设置在通过IMAP删除邮件时发生的情况。
只需在Gmail实验室中启用“高级IMAP控件”。设置页面将如下所示:

settings

然后,当您将邮件标记为已删除并根据此答案清除时,该邮件将根据您选择的设置被移动到垃圾箱、永久删除或存档到“所有邮件”中。

1
我尝试了你的方法,但是当我删除一条消息时,该消息将具有收件箱标签,而如果我们从Gmail本身删除该消息,则该消息将不会有任何标签。 - Rahul Vyas
2
我知道这是一个非常老的帖子,但为了帮助任何遇到Rahul上面问题的人,您只需要先删除“收件箱标签”,然后再添加垃圾邮件标签。即 imap.store(num, '-X-GM-LABELS', '\\Inbox') - Shogan

1
这是一个可以快速与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."

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接