如何使用 IMAP 协议从 Gmail 的电子邮件中删除标签?

sor*_*rin 6 gmail imap gmail-imap

在 Gmail 上添加标签效果很好:

imap.store(item, '+X-GM-LABELS', label)
imap.expunge()
Run Code Online (Sandbox Code Playgroud)

但:

imap.store(item, '-X-GM-LABELS', label)
imap.expunge()
Run Code Online (Sandbox Code Playgroud)

...应该删除标签不会执行任何操作,不会返回错误(“确定”)。

去除标签的正确方法是什么?

小智 7

几年后,但对于从谷歌登陆这里的任何人来说,我遇到了与OP类似(或相同)的问题。

TL;DR:搜索而X-GM-LABELS不是使用imap.select(label)


删除标签的简洁方法(如 Changneng 指出的)是:

imap.store(item, '-X-GM-LABELS', label)
Run Code Online (Sandbox Code Playgroud)

但是,由于 Gmail 在某种程度上可互换地对待标签和文件夹,但不将标签包含在标签文件夹中的邮件副本上,因此如果您使用以下方式提取邮件,则上述内容将不起作用:

imap.select(label)
ok, data = imap.search(None, "ALL")

...

imap.fetch(item, "(RFC822)")
imap.store(item, '-X-GM-LABELS', label) # <-- Effectively a no-op
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使用-X-GM-LABELS删除标签将不起作用,因为标签实际上并未附加到放置在该文件夹中的副本。相反,您必须查找收件箱(或可能是任何其他文件夹)中的电子邮件副本,并将其从该 ID 中删除。对于大多数意图和目的,这种加载消息的方法应该作为选择标签文件夹的替代方法:

imap.select('inbox')
ok, data = imap.search(None, 'X-GM-LABELS', label)

...

imap.fetch(item, "RFC822")
imap.store(item, '-X-GM-LABELS', label) # <-- Will now remove the label!
Run Code Online (Sandbox Code Playgroud)

收件箱文件夹中的副本将附加所有自定义标签,从该 ID ( item) 中删除标签将删除该标签,并一次性从该标签的文件夹中删除该邮件。

另外,请注意,如果您的标签中有空格,上面的代码将失败,在这种情况下它需要用引号引起来,例如替换labelf'"{label}"'


Hub*_*tus 0

当您通过 IMAP 查看 Gmail 时,Gmail 会威胁其标签为 IMAP 文件夹: https: //support.google.com/mail/answer/77657?hl=en

当您谈论 Gmail IMAP 扩展时 - https://developers.google.com/gmail/imap_extensions#access_to_gmail_labels_x-gm-labels其文档说它可用于添加标签、存储和搜索。我想这只是通过标准 IMAP 协议使用它的便捷方法,而不是在所有文件夹中搜索字母。因此,如果您想删除某些标签,只需从 IMAP 文件夹中删除邮件即可。