IMAP: como mover uma mensagem de uma pasta para outra
-
02-07-2019 - |
Pergunta
(usando os comandos IMAP, não com a ajuda de qualquer outro pacote mail)
Solução
Eu não sei o quão bem versado você está em imap-falar, mas basicamente após o login, "SELECT" a caixa de correio de origem, "COPY" as mensagens, e "EXPUNGE" as mensagens (ou "DELETE" o velho caixa de correio se ele está vazio agora: -).
a login a s
b select source
c copy 1 othermbox
d store 1 +flags (\Deleted)
e expunge
seria um exemplo de mensagens a serem enviadas. ( Nota ??strong>: mensagens IMAP exigem um prefixo uniqe antes de cada comando, assim, a "a b c" na frente)
RFC 2060 para mais detalhes.
Outras dicas
Existem várias maneiras de fazer isso. O melhor é o comando UID MOVE
definido na RFC 6851 desde o início de 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
Presença desta extensão é indicada pela capacidade MOVE
.
Se não está disponível, mas UIDPLUS
( RFC 4315 ) é, a segunda melhor opção é usar o combinação de 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 o UIDPLUS
está faltando, não há nada razoável que você pode fazer - o comando EXPUNGE
remove permanentemente todas as mensagens que são marcados para exclusão, incluindo aquelas que você não tenha tocado. O melhor é usar apenas o UID COPY
e UID STORE
nesse caso.
Se você tem o uid do e-mail que vai ser movido.
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()
Onde msg_uid é o uid do correio.
Eu acho que você copiar a mensagem para a nova pasta e exclua (EXPUNGE)-lo no antigo.
Dica Não há nenhum comando DELETE que faz o que você quer dizer, você tem que sinalizar a mensagem como excluída e, em seguida, eliminar a caixa de correio. Ter um olhar para o RFC. Tenha cuidado com DELETE, como ele exclui caixas de correio inteiras, e-mails não individuais.