无法使用 imaplib 删除邮件

Can't delete messege with imaplib

我使用此代码从我的电子邮件中删除一条消息:

mail.store(id, '+FLAGS', '\Deleted')
mail.expunge()

而这个代码是 return 'Ok'.

('OK', [None])

我还将我的 gmail 帐户中的设置更改为:

但是我还是删除不了消息。为什么会这样?

我解决了我的问题,但遇到了另一个问题,如果有人用另一个答案回答这个问题,我会很高兴 :) 当我搜索要删除的消息的 id 时,我使用函数 'uid' 进行搜索并获得了真实的 uid(例如,如果我有 500 条消息并将其全部删除,那么我得到的下一个消息将是 501,即使我的收件箱中只有一封邮件。)。 所以不要使用:

email.uids('search', 'ALL')

我用过:

email.search(None, 'ALL')

当我删除消息时,我需要使用非真实ID。因此,例如,501 消息将是其中的 1 "fake id"(或真实的..以您想要的方式查看它。)下一个将是 2,等等...

所以,我没有删除 501 消息 ID,而是删除了 1 消息 ID。

但是,问题来了: 为什么获取消息(然后我将必须使用 'real id')和删除它们(然后我将必须使用 'not real id'。)

之间存在差异

您正在混合使用 'message sequence numbers'(MSN,您所谓的 'fake ids')和 'unique ids'(UID,您所称的 'real ids')。

到处使用UID更方便。 MSN 和 UID 版本中都有一些命令:FETCH 与 UID FETCH、SEARCH 与 UID SEARCH、STORE 与 UID STORE。您必须保持一致,但它们在其他方面的工作方式相同。

因此,如果您使用 UID SEARCH,则应使用 UID STORE:

email.uid('STORE', id, '+FLAGS', '(\Deleted)')
email.expunge()

关于 Gmail 上的删除,特别是:尽管用户设置了删除,但我发现它总是只是删除了 'Inbox' 标签(或您恰好位于其中的任何文件夹),这将保留它存档于您的“所有邮件”文件夹或同等文件夹。要真正删除它,您可能需要:

  • 将其移至用户的回收站文件夹(使用 (UID) MOVE,或 (UID) COPY 和删除的组合。
  • 然后将其从用户的回收站文件夹中删除。大多数用户会发现将它留在垃圾箱中直到它在 30 天内自动删除是可以接受的。