使用imaplib删除Gmail中的邮件时遇到问题

7 投票
4 回答
10340 浏览
提问于 2025-04-16 05:52

我尝试从收件箱中删除消息,一切都很顺利,但当我切换到“所有邮件”文件夹时,删除就不管用了。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 个回答

6

通过Gmail的高级IMAP控制,你可以设置在使用IMAP删除邮件时,邮件会发生什么情况。

只需在Gmail实验室中启用“高级IMAP控制”。设置页面看起来是这样的:

settings

然后,当你将一封邮件标记为删除并按照这个回答中的方法进行清除时,邮件会根据你选择的设置被移动到垃圾箱、永久删除或归档到“所有邮件”中。

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 界面,因为它会有缓存。

9

Gmail博客上提到,谷歌的IMAP实现方式有点不同。当你按照说明去获取更常见的操作方式时,这样做有帮助吗?

对于那些希望让Gmail的IMAP更像传统IMAP服务的用户,还有一些不太常见的选项:你可以关闭自动删除功能,或者在IMAP中看不到的邮件被标记为垃圾邮件时将其删除。

IMAP协议允许将邮件标记为删除,这就像是邮件处于一种“待删除”的状态,邮件仍然在文件夹里,但下次清理文件夹时会被删除。在我们标准的IMAP实现中,当你将邮件标记为删除时,Gmail不会让它停留在这个状态——它会立即从文件夹中删除(或自动清理)这封邮件。如果你想要这种两步删除的过程,在启用这个功能后,只需在设置中的“转发和POP/IMAP”选项卡下选择“不要自动删除邮件”。

同样,大多数IMAP系统也没有Gmail的归档概念(即将邮件发送到[Gmail]/所有邮件文件夹,而不是[Gmail]/垃圾箱)。如果你希望被删除的邮件不再出现在其他可见的IMAP文件夹中,而是直接发送到[Gmail]/垃圾箱,Advanced IMAP Controls可以让你这样设置。在“转发和POP/IMAP”选项卡的“IMAP访问”部分,找到“当邮件从最后一个可见的IMAP文件夹中删除时:”的选项。选择“将邮件移动到Gmail垃圾箱。”如果你想更进一步,可以选择“立即永久删除邮件。”

撰写回答