在 Gmail 添加标签工作得很好:
imap.store(item, '+X-GM-LABELS', label)
imap.expunge()
但:
imap.store(item, '-X-GM-LABELS', label)
imap.expunge()
...应该删除标签将什么都不做,而不会返回错误('OK')。
去除标签的正确方法是什么?
在 Gmail 添加标签工作得很好:
imap.store(item, '+X-GM-LABELS', label)
imap.expunge()
但:
imap.store(item, '-X-GM-LABELS', label)
imap.expunge()
...应该删除标签将什么都不做,而不会返回错误('OK')。
去除标签的正确方法是什么?
多年后,但对于从谷歌登陆这里的任何人,我遇到了与 OP 类似(或相同)的问题。
TL;DR : 搜索X-GM-LABELS
而不是使用imap.select(label)
删除标签的简洁方法(如 Changneng 所指出的)是:
imap.store(item, '-X-GM-LABELS', label)
但是,由于 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
在这种情况下,使用-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!
收件箱文件夹中的副本将附加所有自定义标签,从该 id ( item
) 中删除标签将删除标签,并一次性从标签文件夹中删除邮件。
另外,请注意,如果您的标签中有空格,上面的代码将失败,在这种情况下,它需要用引号括起来,例如替换label
为f'"{label}"'
.
经测试,Gmail 支持以下语法来删除标签
imap.store(item, '-X-GM-LABELS', label)
不需要删除声明。
当您通过 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 从该文件夹中删除消息。