Domanda

(utilizzando i comandi IMAP, non con l'aiuto di altri pacchetti di posta)

È stato utile?

Soluzione

Non sono sicuro di quanto tu sia esperto in imap-speak, ma fondamentalmente dopo il login, " SELECT " la cassetta postale di origine, "quot" COPY " i messaggi e " EXPUNGE " i messaggi (o " DELETE " la vecchia casella di posta se ora è vuota :-).

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

sarebbe un esempio di messaggi da inviare. ( Nota : i messaggi imap richiedono un prefisso uniqe prima di ciascun comando, quindi la "quot a a c" nella parte anteriore)

Vedi RFC 2060 per dettagli.

Altri suggerimenti

Esistono diversi modi per farlo. Il migliore è il comando UID MOVE definito in RFC 6851 dall'inizio del 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

La presenza di questa estensione è indicata dalla funzionalità MOVE .

Se non è disponibile, ma UIDPLUS ( RFC 4315 ) è, il la seconda opzione migliore è usare la combinazione di UID STORE , UID COPY e 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

Se manca UIDPLUS , non c'è nulla di ragionevole da fare: il comando EXPUNGE rimuove permanentemente tutti i messaggi contrassegnati per l'eliminazione, inclusi quelli che non ho toccato. La cosa migliore è usare solo UID COPY e UID STORE in quel caso.

Se hai l'uid dell'email che verrà spostata.

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()

Dove msg_uid è l'uid della posta.

Immagino che COPI il messaggio nella nuova cartella e poi lo elimini (ESPUNGE) nel vecchio.

RFC3501

SUGGERIMENTO Non esiste alcun comando DELETE che fa ciò che vuoi dire, devi contrassegnare il messaggio come cancellato e quindi ESEGUIRE la casella di posta. Dai un'occhiata alla RFC. Fai attenzione con ELIMINA, in quanto elimina intere cassette postali, non singole.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top