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

如何使用IMAP协议从Gmail的电子邮件中删除标签?,gmail,imap,gmail-imap,Gmail,Imap,Gmail Imap,在Gmail上添加标签效果很好: imap.store(item, '+X-GM-LABELS', label) imap.expunge() 但是: …它应该删除标签,但不会执行任何操作,不会返回错误(“确定”) 删除标签的正确方法是什么?当您通过IMAP查看标签时,Gmail会将其作为IMAP文件夹: 当你谈到Gmail IMAP扩展时,它的文档说它可以用于添加标签、存储和搜索。我想通过标准IMAP协议使用它是一种方便的方式,这样就不会在所有可能的文件夹中搜索信件。 因此,如果您想删除一些

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

imap.store(item, '+X-GM-LABELS', label)
imap.expunge()
但是:

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


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

当您通过IMAP查看标签时,Gmail会将其作为IMAP文件夹:

当你谈到Gmail IMAP扩展时,它的文档说它可以用于添加标签、存储和搜索。我想通过标准IMAP协议使用它是一种方便的方式,这样就不会在所有可能的文件夹中搜索信件。
因此,如果您想删除一些标签,只需使用IMAP从该文件夹中删除邮件。

经过测试,Gmail支持以下语法来删除标签

imap.store(item, '-X-GM-LABELS', label)

不需要删除声明。

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

TL;DR:按
X-GM-LABELS
搜索,而不是使用
imap。选择(标签)


去除标签的简明方法(如长能所指出的)是:

但是,由于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
收件箱文件夹中的副本将附加所有自定义标签,从该id(
)中删除标签将删除标签,并一次性从标签文件夹中删除邮件

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

imap.store(item, '-X-GM-LABELS', label)
imap.select(label)
ok, data = imap.search(None, "ALL")

...

imap.fetch(item, "(RFC822)")
imap.store(item, '-X-GM-LABELS', label) # <-- Effectively a no-op
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!