Partage
  • Partager sur Facebook
  • Partager sur Twitter

Déplacer un mail de repertoire

Sujet résolu
    7 septembre 2022 à 19:24:59

    Bonjour, je fais face à un problème que je n'arrive pas à résoudre malgré de nombreuse recherche.

    Il s'agit du suivant : le but est de changer de répertoire un email (par exemple, un email est dans les spam et on veut le bouger dans la boite de réception).

    Pour la manipulation de la boite mail, j'utilise la bibliothèque imaplib (le module IMAP4_SSL en particulier). Je suis nouveau à l'utilisation de cette bibliothèque et c'est peut être pourquoi je n'arrive pas à trouver de solution. Je précise que je veux explicitement déplacer le message et non le copier à l'endroit voulu puis le supprimer.

    J'ai bien essayer de faire ça mais sans succès. 

    ok, uids = self.connexion.search(None, "ALL HEADER From 'test_bot'")
    mail_ids = uids[0].decode().split()
    resp_code, response = self.connexion.uid("MOVE", mail_ids[0], "[Gmail]/Spam")

    Les valeurs de resp_code et response sont respectivement OK, [None]

    Si jamais vous pouvez m'aider, je vous en serais reconnaissant, toute proposition est bonne à prendre même si il faut utiliser une autre bibliothèque. 

    Bonne journée à vous.

    • Partager sur Facebook
    • Partager sur Twitter
      8 septembre 2022 à 15:59:31

      ce n'est pas plus simple de créer une règle dans la boite mail ? 

      tu as vérifier tes valeurs de mail_ids?

      Sinon si j'en crois ce sujet SO https://stackoverflow.com/questions/3527933/move-an-email-in-gmail-with-python-and-imaplib 

      il n'y pas de commande MOVE, mais faire un COPY puis STORE avec \delete le tout suivi d'un expunge, fait le boulot

      Code de la réponse SO:

      import imaplib, getpass, re
      pattern_uid = re.compile(r'\d+ \(UID (?P<uid>\d+)\)')
      
      def connect(email):
          imap = imaplib.IMAP4_SSL("imap.gmail.com")
          password = getpass.getpass("Enter your password: ")
          imap.login(email, password)
          return imap
      
      def disconnect(imap):
          imap.logout()
      
      def parse_uid(data):
          match = pattern_uid.match(data)
          return match.group('uid')
      
      if __name__ == '__main__':
          imap = connect('<your mail id>')
          imap.select(mailbox = '<source folder>', readonly = False)
          resp, items = imap.search(None, 'All')
          email_ids  = items[0].split()
          latest_email_id = email_ids[-1] # Assuming that you are moving the latest email.
      
          resp, data = imap.fetch(latest_email_id, "(UID)")
          msg_uid = parse_uid(data[0])
             
          result = imap.uid('COPY', msg_uid, '<destination folder>')
      
          if result[0] == 'OK':
              mov, data = imap.uid('STORE', msg_uid , '+FLAGS', '(\Deleted)')
              imap.expunge()
      
          disconnect(imap)



      • Partager sur Facebook
      • Partager sur Twitter
        8 septembre 2022 à 16:43:57

        Bonjour, merci de ta réponse umfred mais j'ai réussit à trouver la solution. Pour ceux que sa intéresse, il faut simplement utiliser la bibliothèque imap_tools qui elle permet de directement déplacer des mails d'un répertoire à un autre.
        • Partager sur Facebook
        • Partager sur Twitter
          8 septembre 2022 à 18:40:40

          tu mets un bout de code ?
          • Partager sur Facebook
          • Partager sur Twitter
            9 septembre 2022 à 1:20:10

            from imap_tools import MailBox
            
            # On créer un objet Mailbox avec le quelle on se connecte
            with MailBox("imap.gmail.com").login(EMAIL_ADRESSE, PASSWORD) as mailbox:
                
                #Cette ligne est inutile car le repertoire sélectioné de base est INBOX mais
                #cela permet de savoir comment se mettre sur un autre repertoire si jamais
                mailbox.folder.set("INBOX")
            
                #On récupère les uid des mails en fonction de nos critère de recherche
                #Pour les critères de recherche, regardez les critères de recherche
                #de la fonction move de imaplib.IMAP4_SSL, je crois que ce sont les mêmes
                uids = mailbox.uids("UNSEEN")
            
                #Il n'y a plus que à bouger les mails que l'on a choisit (uids) dans le repertoire
                #[Gmail]/Spam
                #Cela aura donc pour effet dans ce cas là de déplacer tous les mails
                #qui on leur uid dans uids du repertoire INBOX au repertoire [Gmail]/Spam
                mailbox.move(uids, "[Gmail]/Spam")
            J'ai essayé de faire au plus clair possible mais si quelque chose n'est pas très compréhensible, demander moi ou regarder sur internet la bibliothèque imaplib, beaucoup de chose sont lier et vous devriez trouver des réponses.
            • Partager sur Facebook
            • Partager sur Twitter

            Déplacer un mail de repertoire

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown