2008-09-23 19 views
13

(utilizando los comandos IMAP, no con la ayuda de cualquier otro paquete de correo)IMAP: cómo mover un mensaje de una carpeta a otra

+0

Si bien no hay un comando IMAP "mover" en la especificación actual, hay una propuesta para una extensión: http://tools.ietf.org/html/draft-gulbrandsen-imap-move-01 (Arnt Gulbrandsen, Marzo de 2012). Lamentablemente, es probable que el enlace esté muerto en el momento en que desee hacer clic en él, debido a la política de caducidad borrador bastante agresiva del IETF. – tripleee

+1

RFC6851 Extensión MOVE: http://tools.ietf.org/html/rfc6851. Por supuesto, si su servidor no lo admite COPY, 'STORE \ DELETED flag' y EXPUNGE es la única opción (como en las respuestas a continuación) –

+1

@triplee: tools.ietf.org los enlaces no caducan. Los borradores caducan, pero tools.ietf.org sigue dando una respuesta razonable. – arnt

Respuesta

15

No estoy seguro de qué tan versado eres en términos de palabras, pero básicamente después de iniciar sesión, "SELECCIONA" el buzón de origen, "COPIA" los mensajes, y "EXPUNGE" los mensajes (o "ELIMINA" el buzón viejo si está vacío ahora :-).

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

sería un ejemplo de mensajes para enviar. (Nota : mensajes IMAP requieren un prefijo UNIQE antes de cada comando, así el "abc" delante)

Ver RFC 2060 para más detalles.

+5

Por favor, vea [RFC 3501] (http://tools.ietf.org/html/rfc3501) en su lugar. – dkarp

+3

Tenga en cuenta que 'expunge' eliminará _todos_ mensajes marcados' \ Deleted', que pueden no ser los que usted desea. –

3

supongo que copiar el mensaje a la carpeta nueva y luego borrar (EXPUNGE) en el anterior.

RFC351

INDIRECTA No hay comando DELETE que hace lo que quiere decir, que tiene que marcar el mensaje como eliminado y luego EXPUNGE el buzón. Eche un vistazo al RFC. Tenga cuidado con DELETE, ya que borra los buzones enteros, no solo los correos.

8

Si tiene el uid del correo electrónico que se va a mover.

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

Dónde msg_uid es el identificador de usuario del correo.

+3

-1: "utilizando los comandos IMAP, no con la ayuda de ningún otro paquete de correo" – dkarp

+1

+1 Este fue de lejos el mejor vínculo que encontré al usar python para esta tarea. –

20

Existen varias formas de hacerlo. El mejor es el comando UID MOVE definido en RFC 6851 desde principios 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 

La presencia de esta extensión está indicada por la capacidad MOVE.

Si no está disponible, pero UIDPLUS (RFC 4315) es decir, la segunda mejor opción es utilizar la combinación de UID STORE, UID COPY y 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 

Si el UIDPLUS no se encuentra, no hay nada Es razonable que lo pueda hacer: el comando EXPUNGE elimina permanentemente todos los mensajes marcados para eliminación, incluidos los que no ha tocado. Lo mejor es simplemente usar UID COPY y UID STORE en ese caso.

+0

Mi servidor no tiene soporte para 'UID MOVE':/ –

+0

Su segunda mejor oportunidad está en el segundo listado de código, entonces. –

Cuestiones relacionadas