25 votes

IMAP : comment déplacer un message d'un dossier à un autre

(en utilisant les commandes IMAP, sans l'aide d'aucun autre package de messagerie)

31voto

Jan Kundrát Points 1959

Il existe plusieurs façons de le faire. La meilleure est la commande UID MOVE définie dans RFC 6851 de début 2013 :

C: a UID MOVE 42:69 foo
S: * OK [COPYUID 432432 42:69 1202:1229]
S: * 22 EXPUNGE
S: (plus d'expurgations)
S: a OK Done

La présence de cette extension est indiquée par la capacité MOVE.

Si elle n'est pas disponible, mais que UIDPLUS (RFC 4315) l'est, la deuxième meilleure option consiste à utiliser la combinaison de UID STORE, UID COPY et UID EXPUNGE :

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

Si le UIDPLUS est manquant, il n'y a rien de raisonnable que vous puissiez faire -- la commande EXPUNGE supprime définitivement tous les messages marqués pour suppression, y compris ceux que vous n'avez pas touchés. Le mieux est d'utiliser simplement les commandes UID COPY et UID STORE dans ce cas.

19voto

Sec Points 2786

Je ne suis pas sûr que vous soyez bien au fait du langage imap, mais en gros après la connexion, "SÉLECTIONNEZ" la boîte aux lettres source, "COPIEZ" les messages et "EXPURGEZ" les messages (ou "SUPPRIMEZ" l'ancienne boîte aux lettres si elle est vide maintenant :-).

 a connexion a s
b sélectionnez source
c copiez 1 autreboîte
d stockez 1 +drapeaux (\Deleted)
e expurgez

serait un exemple de messages à envoyer. (Note : Les messages imap nécessitent un préfixe unique avant chaque commande, d'où le "a b c" devant)

Consultez RFC 2060 pour plus de détails.

15voto

Avadhesh Points 1819

Si vous avez l'UID de l'e-mail qui va être déplacé.

import imaplib

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

msg_uid est l'UID du message.

5voto

jkramer Points 7271

Je suppose que vous COPIEZ le message dans le nouveau dossier, puis le supprimez (PURGER) dans l'ancien.

RFC3501

ASTUCE Il n'y a pas de commande DELETE qui fait ce que vous voulez, vous devez marquer le message comme supprimé, puis PURGER la boîte aux lettres. Consultez le RFC. Faites attention avec DELETE, car il supprime des boîtes aux lettres entières, pas des courriers individuels.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X