我的 Python 代码运行但没有从 Gmail 收件箱中删除选定的电子邮件

My Python code runs but doesn't delete selected email from Gmail Inbox

我的 Python 下面的代码运行但没有删除我希望从我的测试中删除的选定电子邮件 gamil\inbox。我不确定我在这里做错了什么。我将非常感谢任何帮助。

import imaplib
import datetime


m = imaplib.IMAP4_SSL("imap.gmail.com")  # server to connect to
print("{0} Connecting to mailbox via IMAP...".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S")))
m.login('bb_xxxxx@gmail.com', 'gmail_pass')
 
print("{0} Searching Inbox by sender...".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S")))
m.select('Inbox') #select folder to search
status, messages = m.search(None, 'FROM "location-history-noreply@google.com"') # search for specific mails by sender

print("{0} Flagging selected mail as deleted...".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S")))
for mail in messages[0].split():
    m.store(mail, "+FLAGS", "\Deleted")
    m.expunge()
        
print("{0} Done. Closing connection & logging out.".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S")))
m.close()
m.logout()

在退出 for 循环之前,不要 运行 删除。 expunge 重新编号 消息 ID,因此您从搜索中获得的号码不再对应。

所以:

for mail in messages[0].split():
    m.store(mail, "+FLAGS", "\Deleted")
m.expunge()

这就是为什么它是一个单独的操作的原因之一。或者到处使用 UID。

此外,在 gmail 上,删除并不会真正删除邮件。它仅将其标记为已从该标签(收件箱)中删除。如果你想真正删除它,你需要把它移到垃圾箱文件夹,然后从那里删除它。

非常感谢麦克斯!您的回答帮助我解决了问题。但是,如果我使用“\Deleted”,那么我会看到邮件已从收件箱中删除,但仍在“所有邮件”文件夹中可用。这是否意味着它们将被永久删除?所以我尝试如下使用移动到“垃圾箱”,现在邮件已从收件箱中删除但移动到“垃圾箱”。

for mail in messages[0].split():
    #m.store(mail, "+FLAGS", "\Deleted")
    m.store(mail, '+X-GM-LABELS', '\Trash')
m.expunge()