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

时间:2013-06-23 17:44:14

标签: gmail imap gmail-imap

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

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

可是:

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

...应该删除标签只会做什么,而不会返回错误('OK')。

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

3 个答案:

答案 0 :(得分:1)

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

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

搜索

删除标签的简洁方法(如常能指出的那样)是:

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}"'

答案 1 :(得分:0)

当您通过IMAP查看时,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中删除此文件夹中的邮件。

答案 2 :(得分:0)

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

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

不需要删除声明。

相关问题