IMAP: wie eine Nachricht von einem Ordner in einen anderen verschieben

StackOverflow https://stackoverflow.com/questions/122267

  •  02-07-2019
  •  | 
  •  

Frage

(unter Verwendung der IMAP-Befehle, nicht mit Hilfe eines anderen Mail-Paket)

War es hilfreich?

Lösung

Ich bin nicht sicher, wie gut versiert Sie sind in imap-sprechen, aber im Grunde nach dem Login „SELECT“ das Quellpostfach, „COPY“ die Nachrichten, und „EXPUNGE“ die Nachrichten (oder „DELETE“ die alten Mailbox, wenn es leer ist jetzt: -).

a login a s
b select source
c copy 1 othermbox
d store 1 +flags (\Deleted)
e expunge

wäre ein Beispiel für Nachrichten zu senden. ( Hinweis : IMAP-Nachrichten erfordern einen uniqe Präfix vor jedem Befehl, damit die "a b c" vor)

Siehe RFC 2060 .

Andere Tipps

Es gibt mehrere Möglichkeiten, das zu tun. Das beste ist der UID MOVE Befehl definiert in RFC 6851 von Anfang 2013:

C: a UID MOVE 42:69 foo
S: * OK [COPYUID 432432 42:69 1202:1229]
S: * 22 EXPUNGE
S: (more expunges)
S: a OK Done

Präsenz dieser Erweiterung wird durch die MOVE Fähigkeit angegeben.

Wenn es nicht verfügbar ist, aber UIDPLUS ( RFC 4315 ) ist die zweitbeste Option ist die verwenden Kombination von UID STORE, UID COPY und UID EXPUNGE:

C: a01 UID COPY 42:69 foo
S: a01 OK [COPYUID 432432 42:69 1202:1229] Copied
C: a02 UID STORE 42:69 +FLAGS.SILENT (\Deleted)
S: a02 OK Stored
C: a03 UID EXPUNGE 42:69
S: * 10 EXPUNGE
S: * 10 EXPUNGE
S: * 10 EXPUNGE
S: a03 Expunged

Wenn der UIDPLUS fehlt, gibt es nichts vernünftig, dass Sie tun können - der EXPUNGE Befehl löscht dauerhaft alle Nachrichten, die zum Löschen markiert sind, einschließlich diejenigen, die Sie nicht berührt haben. Das Beste ist dies nur den UID COPY zu verwenden und UID STORE in diesem Fall.

Wenn Sie die uid der E-Mail, die bewegt werden würde.

import imaplib

obj = imaplib.IMAP4_SSL('imap.gmail.com', 993)
obj.login('username', 'password')
obj.select(src_folder_name)
apply_lbl_msg = obj.uid('COPY', msg_uid, desti_folder_name)
if apply_lbl_msg[0] == 'OK':
    mov, data = obj.uid('STORE', msg_uid , '+FLAGS', '(\Deleted)')
    obj.expunge()

Wo msg_uid ist die Benutzer-ID des Mail.

Ich denke, Sie die Nachricht in die neuen Ordner kopieren und dann löschen (EXPUNGE) es in dem alten.

RFC3501

HINWEIS Es gibt keine DELETE-Befehl, das tut, was Sie meinen, Sie die Nachricht Flagge haben als gelöscht und dann die Mailbox EXPUNGE. Werfen Sie einen Blick auf die RFC. Seien Sie vorsichtig mit DELETE, da es ganze Postfächer löscht, nicht einzelne Mails.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top