如何使用IMAP协议在Gmail中将电子邮件消息的标签移除?

6

Gmail 添加标签非常方便:

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

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

如果要删除标签,通常使用的方法是无效的,它不会返回错误信息(“OK”)。

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

3个回答

7

多年以后,但对于从谷歌搜索进入这里的任何人,我遇到了与OP类似(或完全相同)的问题。

简而言之:使用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}"'

0

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

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

不需要清除语句。


0

Gmail将其标签视为IMAP文件夹,当您通过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的术语从该文件夹中删除消息即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接