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

时间:2010-10-21 14:34:08

标签: python gmail imap imaplib gmail-imap

我尝试从收件箱文件夹中删除邮件,一切正常,但当我切换到All Mail文件夹时删除不起作用。 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 个答案:

答案 0 :(得分:12)

它将给定gmail标签中的所有邮件移动到gmail Trash

#!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

请记住刷新g​​mail界面,因为它有缓存

答案 1 :(得分:8)

正如gmail blog site所述,Google对IMAP的实施略有不同。当您按照说明获取更常用的语义时,它有帮助吗?

  

还有一些更加模糊不清   那些想要的人的选择   使Gmail的IMAP工作更像   传统的IMAP提供商:你可以   关闭自动清除或垃圾   他们不再是的消息   通过IMAP可见。

     

IMAP协议允许消息发送   被标记为删除,一种   消息仍然存在的情况   存在于文件夹中,但预定为   下次该文件夹时删除   抹去。在我们的标准IMAP中   实施,当你标记一个   邮件已删除,Gmail不允许   它在那个状态中徘徊 - 它会删除   (或自动清除)它从文件夹   马上。如果你想要两个阶段   启用后删除进程   这个实验室,只需选择'不要   自动删除邮件   中的“转发和POP / IMAP”标签   设置。

     

同样,大多数IMAP系统都没有   分享Gmail的归档概念   消息(发送消息到   [Gmail] /所有邮件文件夹而不是   [Gmail] /垃圾桶)。如果你愿意的话   已删除的邮件未保留   发送其他可见的IMAP文件夹   [Gmail] /已删除垃圾邮件,高级IMAP   控件可让您设置首选项   这条路。在“IMAP访问:”中   “转发和转发”部分   POP / IMAP'选项卡,找到'当a   消息从最后删除   可见的IMAP文件夹:'选项。选择   '将邮件移至Gmail垃圾箱。'   如果你想迈出一步   此外,您可以选择'立即   永远删除邮件。'

答案 2 :(得分:6)

使用Gmail advanced IMAP controls,您可以设置在通过IMAP删除邮件时会发生什么。

只需在Gmail实验室中启用“高级IMAP控件”即可。设置页面如下所示:

settings

然后,当您根据this answer将邮件标记为已删除并清除时,它将被移至邮箱,永久删除或存档为“所有邮件”,具体取决于您选择的设置。

答案 3 :(得分: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('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."