IMAP: come spostare un messaggio da una cartella all'altra
-
02-07-2019 - |
Domanda
(utilizzando i comandi IMAP, non con l'aiuto di altri pacchetti di posta)
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.
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.