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') を返さずに何もしません。
ラベルを削除する適切な方法は何ですか?
数年後、Google からここにたどり着いた人にとっては、OP と同様 (または同一) の問題に遭遇しました。
TL;DRX-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)
消印は必要ありません。
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 に関してこのフォルダーからメッセージを削除するだけです。