2010-10-21 57 views
5

我尝试从收件箱文件夹中移除邮件并且一切正常,但是当我切换到所有邮件文件夹时,删除不起作用。 expunge()方法返回('OK', [None]),并没有删除消息:使用imaplib删除Gmail中的电子邮件时出现问题

>>>import imaplib 
>>>server = imaplib.IMAP4_SSL('imap.gmail.com','993') 
>>>server.login('[email protected]','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]) 

回答

7

,因为它说的gmail blog site,谷歌的执行IMAP的是一个有点不同。当您按照说明获取更多通常的语义时,它有帮助吗?

还有那些你们谁想要 使Gmail的IMAP工作更像 传统IMAP提供一些比较模糊的 选项:您可以 关闭自动清除或垃圾 的消息时,他们没有通过IMAP可以看到更长的 。

IMAP协议允许消息 被标记为删除,排序的 无人过问状态下的消息仍然是 存在的文件夹中,但提名是 删除的下一次该文件夹 清除。在我们的标准IMAP 实施中,当您将 消息标记为已删除时,Gmail不会让 在该状态中徘徊 - 它会立即从文件夹 中删除 (或自动删除)它。如果您想要两阶段 删除过程,在启用 本实验室后,只需在 设置中选择'转发和POP/IMAP'选项卡下的 下的'不要 自动删除消息'。

同样,大多数IMAP系统做归档 消息不 份额Gmail的概念(将消息发送到 [Gmail] /所有邮件文件夹,而不是 [Gmail] /垃圾桶)。如果你喜欢在任何 其他可见的IMAP文件夹没有剩余 删除的邮件被发送到 [Gmail] /垃圾桶代替,高级IMAP 控件可以让您设置首选项 这种方式。在'转发和 POP/IMAP'选项卡的'IMAP访问:' 部分中,找到'当从最后一个 可见IMAP文件夹:'选项中删除一个 消息。选择 '将邮件移至Gmail垃圾箱。' 如果您想进一步采取一步 ,您可以选择'立即 永远删除该邮件。'

6

使用Gmail advanced IMAP controls您可以设置通过IMAP删除它们时发生的消息。

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

settings

然后,当您将邮件标记为删除,并抹去按this answer将被移动到垃圾桶,永久删除或归档到“所有邮件”,这取决于你选择了什么设置。

+1

我曾尝试您的方法,但是当我删除一条消息时,该消息将具有一个INBOX标签,而如果我们从Gmail本身删除该消息则不会有任何标签。 – 2011-06-17 05:41:23

+2

我知道这是一个非常古老的线程,但为了帮助其他任何与Rahul的问题上面,你只需要删除“收件箱标签”,然后再添加垃圾标签。即'imap.store(num,'-X-GM-LABELS','\\ Inbox')' – Shogan 2014-01-19 19:00:47

12

它移动的所有邮件在给定的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界面导致它有缓存

+0

好的建议。 m.store()的这种用法的文档在哪里? – jml 2013-06-17 21:24:31

+0

@jml:引用来自[IMAP规范,RFC 3501](https://tools.ietf.org/html/rfc3501):'*表示使用中的最大数量' – ckhan 2014-12-11 06:43:00

0

这里是一个与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('[email protected]_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."