Partage
  • Partager sur Facebook
  • Partager sur Twitter

récupéré les mail sur un fichier json

importé des mails a json , import mails to json

Sujet résolu
    9 juin 2022 à 22:12:53

    bonjour a tout le monde pour commencer je m excuse de mes faute d orthographe 

    Voile je vais rentré dans le concret du sujet je voudrais comme expliquer dans le titre récupère tout mes mails et le mètre dans un fichier json ( plus tard écraser les mail qui sont pareil ou même ne pas écrire si le mail existe déjà ( l' exact copie ( comme cela pas de doublon )))

    Pour cela j'ai regardé énormément de tuto mais voilà que des problème quand j' aborde les 

    '(RFC822)'

    et 

    decode('utf-8')

    que des messages d'erreur et j'ai beau cherché je ne trouve pas comment enlever c' est problème

    voila ce que donne les problème

    pour le :

    decode('utf-8') :
    raw_email_string = raw_email.decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 4926: invalid continuation byte

    Et pour le

    '(RFC822)' : 
    type, data = mail.search(None, 'EA@e.ea.com')
      File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.1520.0_x64__qbz5n2kfra8p0\lib\imaplib.py", line 734, in search
        typ, dat = self._simple_command(name, *criteria)
      File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.1520.0_x64__qbz5n2kfra8p0\lib\imaplib.py", line 1230, in _simple_command
        return self._command_complete(name, self._command(name, *args))
      File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.1520.0_x64__qbz5n2kfra8p0\lib\imaplib.py", line 1055, in _command_complete
        raise self.error('%s command error: %s %s' % (name, typ, data))
    imaplib.IMAP4.error: SEARCH command error: BAD [b'Could not parse command']
    



    je tourne en rond depuis des jours et s’il y a des personne qui ont déjà eu les même problème que moi et qui peuvent m’expliquer je veux bien de l' aide et si possible ne pas juste jeter les DOCUMENT sens me dire ce que j'ai mal fait merci a vous:waw:



    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2022 à 22:09:59

      Bonsoir, est-ce qu'on peut voir le code ?

      • Partager sur Facebook
      • Partager sur Twitter
        14 juin 2022 à 12:09:52

        pour le 2nd problème, c'est un problème de format de critère de la fonction search cf la doc https://docs.python.org/3/library/imaplib.html#imaplib.IMAP4.search 

        type,data=mail.search(None,'FROM', '"EA@ea.com"')

        Ensuite, si tu précises à la place de None "utf-8' tu ne devrais pas avoir besoin du décode ensuite

        • Partager sur Facebook
        • Partager sur Twitter
          15 juin 2022 à 11:45:02

          Franck_popo a écrit:

          Bonsoir, est-ce qu'on peut voir le code ?


          import imaplib
          import base64
          import os
          import email
          
          
          email_user = input('Email: ')
          email_pass = input('Password: ')
          
          
          mail = imaplib.IMAP4_SSL('imap.gmail.com', 993)
          
          
          mail.login(email_user, email_pass)
          
          
          mail.select('Inbox')
          
          
          type, data = mail.search(None, 'EA@e.ea.com')
          mail_ids = data[0]
          id_list = mail_ids.split()
          
          w
          for num in data[0].split():
              typ, data = mail.fetch(num, '(RFC822)')
              raw_email = data[0][1]
          # converts byte literal to string removing b''
              raw_email_string = raw_email.decode('utf-8')
              email_message = email.message_from_string(raw_email_string)
          # downloading attachments
              for part in email_message.walk():
                  # this part comes from the snipped I don't understand yet...
                  if part.get_content_maintype() == 'multipart':
                      continue
                  if part.get('Content-Disposition') is None:
                      continue
                  fileName = part.get_filename()
                  if bool(fileName):
                      filePath = os.path.join('/Users/sanketdoshi/python/', fileName)
                      if not os.path.isfile(filePath):
                          fp = open(filePath, 'wb')
                          fp.write(part.get_payload(decode=True))
                          fp.close()
                      subject = str(email_message).split(
                          "Subject: ", 1)[1].split("\nTo:", 1)[0]
                      print('Downloaded "{file}" from email titled "{subject}" with UID {uid}.'.format(
                          file=fileName, subject=subject, uid=latest_email_uid.decode('utf-8')))
          

          dsl pour le temps d attente 

          et pour 

          umfred a écrit:

          pour le 2nd problème, c'est un problème de format de critère de la fonction search cf la doc https://docs.python.org/3/library/imaplib.html#imaplib.IMAP4.search 

          type,data=mail.search(None,'FROM', '"EA@ea.com"')

          Ensuite, si tu précises à la place de None "utf-8' tu ne devrais pas avoir besoin du décode ensuite

          je vais voir et je vous dit ce que ça donne 





          • Partager sur Facebook
          • Partager sur Twitter
            17 juin 2022 à 14:36:13

            umfred a écrit:

            pour le 2nd problème, c'est un problème de format de critère de la fonction search cf la doc https://docs.python.org/3/library/imaplib.html#imaplib.IMAP4.search 

            type,data=mail.search(None,'FROM', '"EA@ea.com"')

            Ensuite, si tu précises à la place de None "utf-8' tu ne devrais pas avoir besoin du décode ensuite


            j ai fait ce que tu m a dit anfain ce d'on j ai compri mais je ne comprend pas pourquoi cela ne marche pas 

            je te drope le code 

            import imaplib
            import base64
            import os
            import email
            
            
            email_user = input('Email: ')
            email_pass = input('Password: ')
            
            
            mail = imaplib.IMAP4_SSL('imap.gmail.com', 993)
            
            
            mail.login(email_user, email_pass)
            
            
            mail.select('Inbox')
            
            
            type, data = mail.search('utf-8', 'EA@e.ea.com')
            mail_ids = data[0]
            id_list = mail_ids.split()
            
            
            for num in data[0].split():
                typ, data = mail.fetch(num, '(RFC822)')
                raw_email_string = data[0][1]
            # converts byte literal to string removing b''
                email_message = email.message_from_string(raw_email_string)
            # downloading attachments
                for part in email_message.walk():
                    # this part comes from the snipped I don't understand yet...
                    if part.get_content_maintype() == 'multipart':
                        continue
                    if part.get('Content-Disposition') is None:
                        continue
                    fileName = part.get_filename()
                    if bool(fileName):
                        filePath = os.path.join('/Users/sanketdoshi/python/', fileName)
                        if not os.path.isfile(filePath):
                            fp = open(filePath, 'wb')
                            fp.write(part.get_payload(decode=True))
                            fp.close()
                        subject = str(email_message).split(
                            "Subject: ", 1)[1].split("\nTo:", 1)[0]
                        print('Downloaded "{file}" from email titled "{subject}" with UID {uid}.'.format(
                            file=fileName, subject=subject))
            



            • Partager sur Facebook
            • Partager sur Twitter
              17 juin 2022 à 15:54:55

              ça veut dire quoi "ça ne marche pas" ? message d'erreur ? 

              pour moi (sauf erreur) ta ligne 20 devrait être:

              type, data = mail.search('utf-8','FROM' 'EA@e.ea.com')



              • Partager sur Facebook
              • Partager sur Twitter
                17 juin 2022 à 20:24:47

                umfred a écrit:

                ça veut dire quoi "ça ne marche pas" ? message d'erreur ? 

                pour moi (sauf erreur) ta ligne 20 devrait être:

                type, data = mail.search('utf-8','FROM' 'EA@e.ea.com')


                j ai cette erreur meme avec la modification 



                • Partager sur Facebook
                • Partager sur Twitter
                  20 juin 2022 à 9:20:15

                  j'ai oublié les guillemets doubles dans mon précédent message (que j'avais pourtant mis avant)

                  	
                  type, data = mail.search('utf-8','FROM' '"EA@e.ea.com"')

                  ou 

                  	
                  type, data = mail.search('utf-8','(FROM "EA@e.ea.com")')




                  -
                  Edité par umfred 20 juin 2022 à 9:20:30

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 juin 2022 à 14:00:17

                    umfred a écrit:

                    j'ai oublié les guillemets doubles dans mon précédent message (que j'avais pourtant mis avant)

                    	
                    type, data = mail.search('utf-8','FROM' '"EA@e.ea.com"')

                    ou 

                    	
                    type, data = mail.search('utf-8','(FROM "EA@e.ea.com")')

                    j ai pris le premier que vous mavez donné et cela ma bien debloquer 

                    je vais force je vous l accord car je suis un peut l argué mais j ai une autre errue suite au code 

                    donc voila je vous repasse le code on ne c est jamais 

                    import imaplib
                    import base64
                    import os
                    import email
                    
                    
                    email_user = input('Email: ')
                    email_pass = input('Password: ')
                    
                    
                    mail = imaplib.IMAP4_SSL('imap.gmail.com', 993)
                    
                    
                    mail.login(email_user, email_pass)
                    
                    
                    mail.select('Inbox')
                    
                    
                    type, data = mail.search('utf-8', '(FROM "EA@e.ea.com")')
                    mail_ids = data[0]
                    id_list = mail_ids.split()
                    
                    
                    for num in data[0].split():
                        typ, data = mail.fetch(num, '(RFC822)')
                        raw_email_string = data[0][1]
                    # converts byte literal to string removing b''
                        email_message = email.message_from_string(raw_email_string)
                    # downloading attachments
                        for part in email_message.walk():
                            # this part comes from the snipped I don't understand yet...
                            if part.get_content_maintype() == 'multipart':
                                continue
                            if part.get('Content-Disposition') is None:
                                continue
                            fileName = part.get_filename()
                            if bool(fileName):
                                filePath = os.path.join('/Users/sanketdoshi/python/', fileName)
                                if not os.path.isfile(filePath):
                                    fp = open(filePath, 'wb')
                                    fp.write(part.get_payload(decode=True))
                                    fp.close()
                                subject = str(email_message).split(
                                    "Subject: ", 1)[1].split("\nTo:", 1)[0]
                                print('Downloaded "{file}" from email titled "{subject}" with UID {uid}.'.format(
                                    file=fileName, subject=subject))
                    

                    je suis que j en demande beacoup mais pour etre franc je ne connais pas trop cette partit meme c est la premier foi que je touche a sela


                    -
                    Edité par umfred il y a environ 4 heures



                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 juin 2022 à 16:35:38

                      pff je viens de m'apercevoir que j'avais oublier une virgule .... décidément (pas le top ce lundi)

                      type,data=mail.search(None,'FROM', '"EA@ea.com"')


                      mais rien à voir avec ton erreur.

                      Le message indique que raw_email_string est de type byte et non pas de type string; donc contrairement à ce que j'avais supposé, il faut remettre la ligne de decode que je t'avais fait supprimer au début

                      raw_email_string = raw_email.decode('utf-8')

                      ou il faut utiliser

                      email_message=email.message_from_bytes(raw_email)

                      à la place du decode et email.message_from_string (les 2 techniques font peut-être la même chose) Fait des essais dans l'interpréteur python pour voir.


                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 juin 2022 à 12:46:16

                        umfred a écrit:

                        pff je viens de m'apercevoir que j'avais oublier une virgule .... décidément (pas le top ce lundi)

                        type,data=mail.search(None,'FROM', '"EA@ea.com"')


                        mais rien à voir avec ton erreur.

                        Le message indique que raw_email_string est de type byte et non pas de type string; donc contrairement à ce que j'avais supposé, il faut remettre la ligne de decode que je t'avais fait supprimer au début

                        raw_email_string = raw_email.decode('utf-8')

                        ou il faut utiliser

                        email_message=email.message_from_bytes(raw_email)

                        à la place du decode et email.message_from_string (les 2 techniques font peut-être la même chose) Fait des essais dans l'interpréteur python pour voir.


                        ouai sacré lundi mais avec ce que tu ma donné le code sarette directement 

                        pas de print rien de rien 

                        hahha a force vous allez y ariver 

                        je rigole deja merci beacoup 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 juin 2022 à 13:06:21

                          pas de print mais pas de message d'erreur non plus ^^

                          tu peux rajouter des print intermédiaires dans les if par exemple, pour voir où tu passes et si tu y passes

                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 juin 2022 à 14:42:50

                            umfred a écrit:

                            pas de print mais pas de message d'erreur non plus ^^

                            tu peux rajouter des print intermédiaires dans les if par exemple, pour voir où tu passes et si tu y passes


                            voila j ai tout detaillé de ce que j ai pu avoir

                            comme on peut le constater il ne passe pas par la TEST

                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 juin 2022 à 16:15:13

                              ça voudrait dire qu'il n'y a pas de pièces jointes dans les mails provenant de EA@e.ea.com

                              Je rajouterai éventuellement un print(filename) entre 42 et 43

                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 juin 2022 à 19:24:16

                                umfred a écrit:

                                ça voudrait dire qu'il n'y a pas de pièces jointes dans les mails provenant de EA@e.ea.com

                                Je rajouterai éventuellement un print(filename) entre 42 et 43


                                je compris en gros ce qu il fait ( le programe ) 

                                mais le truc c est que je voudrais qu il recup le text et pas forcement les piced joint 

                                et le prit si tu vois se que je veut dire 

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  22 juin 2022 à 11:08:43

                                  tu peux faire un print("------------------------\n" ,part) dans la boucle pour voir chacun des éléments.

                                  Et consulte la doc de email dont la fonction get_body() qui devrait pouvoir t'aider https://docs.python.org/3/library/email.message.html#email.message.EmailMessage.get_body 

                                  (c'est mieux de savoir ce que fait un bout de code que l'on copie pour savoir si ça correspond au besoin ^^) et après utiliser des techniques de "débogage" en vérifiant pas à pas (c'est pratique d'utiliser l'interpréteur python dans ce cas) que l'on a bien ce qu'on l'on s'attendait à avoir, ou analyser que l'on a.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    22 juin 2022 à 14:08:00

                                    umfred a écrit:

                                    tu peux faire un print("------------------------\n" ,part) dans la boucle pour voir chacun des éléments.

                                    Et consulte la doc de email dont la fonction get_body() qui devrait pouvoir t'aider https://docs.python.org/3/library/email.message.html#email.message.EmailMessage.get_body 

                                    (c'est mieux de savoir ce que fait un bout de code que l'on copie pour savoir si ça correspond au besoin ^^) et après utiliser des techniques de "débogage" en vérifiant pas à pas (c'est pratique d'utiliser l'interpréteur python dans ce cas) que l'on a bien ce qu'on l'on s'attendait à avoir, ou analyser que l'on a.


                                    merci bien j ai tout le body mais avec tout les details 

                                    donc jai compris que get_body(preferencelist=('related', 'html', 'plain')) sert a recupere simplement le body 


                                    mais j ai pas compris c est ligne 


                                    preferencelist must be a sequence of strings from the set relatedhtml, and plain, and indicates the order of preference for the content type of the part returned.


                                    dsl defoi je comprend pas tout je vais continuer mes recherche de mon cote aussi 

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      22 juin 2022 à 14:25:15

                                      n'en met qu'un des 3 et regarde les différences de résultat

                                      get_body(preferencelist=('html','plain'))

                                      ou get_body(preferencelist=('plain'))

                                      cf les notes à la fin de la description de la fonction

                                      -
                                      Edité par umfred 22 juin 2022 à 14:25:39

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        22 juin 2022 à 14:36:19

                                        umfred a écrit:

                                        n'en met qu'un des 3 et regarde les différences de résultat

                                        get_body(preferencelist=('html','plain'))

                                        ou get_body(preferencelist=('plain'))

                                        cf les notes à la fin de la description de la fonction

                                        -
                                        Edité par umfred il y a 5 minute

                                        j ai tester avec 

                                        test = part.get_body(preferencelist=('html', 'plain'))
                                                print("------------------------\n", test)

                                        le problem c est get_body n ai pas reconu comme un fonction ou je m i prend mal mais j airais fait ça par reflex

                                        je sais que je doit taper sur le sistem ahaha 



                                        -
                                        Edité par WillemCornil 22 juin 2022 à 14:36:40

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          22 juin 2022 à 15:04:16

                                          c'est quoi le message d'erreur complet ? c'est sur le message (email_message) qu'il faut faire le get_body(..) (donc avant la boucle qui parcours les parties de celui-ci)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            22 juin 2022 à 16:16:39

                                            umfred a écrit:

                                            c'est quoi le message d'erreur complet ? c'est sur le message (email_message) qu'il faut faire le get_body(..) (donc avant la boucle qui parcours les parties de celui-ci)


                                            le massage : 

                                            Traceback (most recent call last):
                                              File "d:\wamp\www\phyton\bot_gmail\bot_mail.py", line 34, in <module>  
                                                for part in email_message.get_body(preferencelist=('html', 'plain')):
                                            AttributeError: 'Message' object has no attribute 'get_body'

                                            et ce que j ai fait 

                                                for part in email_message.get_body(preferencelist=('html', 'plain')):
                                            



                                            le code en entier au cas ou 

                                            import imaplib
                                            import base64
                                            import os
                                            import email
                                            
                                            
                                            email_user = input('Email: ')
                                            email_pass = input('Password: ')
                                            
                                            
                                            mail = imaplib.IMAP4_SSL('imap.gmail.com', 993)
                                            
                                            
                                            mail.login(email_user, email_pass)
                                            
                                            
                                            mail.select('Inbox')
                                            
                                            
                                            type, data = mail.search(
                                                'utf-8', '(FROM', '"notices@wayfarer.nianticlabs.com")')
                                            mail_ids = data[0]
                                            id_list = mail_ids.split()
                                            
                                            
                                            for num in data[0].split():
                                                typ, data = mail.fetch(num, '(RFC822)')
                                                raw_email = data[0][1]
                                            # converts byte literal to string removing b''
                                            
                                                email_message = email.message_from_bytes(raw_email)
                                            
                                            # downloading attachments
                                                for part in email_message.get_body(preferencelist=('html', 'plain')):
                                                    print("------------------------\n", part)
                                            
                                                   # this part comes from the snipped I don't understand yet...
                                                    if part.get_content_maintype() == 'multipart':
                                                        print("je suis passé ici")
                                                        continue
                                            
                                                    if part.get('Content-Disposition') is None:
                                                        print("je suis passé la")
                                                        continue
                                                    fileName = part.get_filename()
                                                    print(fileName)
                                                    if bool(fileName):
                                                        print("test")
                                                        filePath = os.path.join('/Users/sanketdoshi/python/', fileName)
                                                        if not os.path.isfile(filePath):
                                                            fp = open(filePath, 'wb')
                                                            fp.write(part.get_payload(decode=True))
                                                            fp.close()
                                                        subject = str(email_message).split(
                                                            "Subject: ", 1)[1].split("\nTo:", 1)[0]
                                                        print('Downloaded "{file}" from email titled "{subject}" with UID {uid}.'.format(
                                                            file=fileName, subject=subject))
                                            




                                            -
                                            Edité par WillemCornil 22 juin 2022 à 16:19:33

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              26 juin 2022 à 23:55:22

                                              umfred a écrit:

                                              c'est quoi le message d'erreur complet ? c'est sur le message (email_message) qu'il faut faire le get_body(..) (donc avant la boucle qui parcours les parties de celui-ci)


                                              j ai toujours pas réglé le problem par rapport 

                                              email_message = email.message_from_bytes(raw_email)
                                                  email_message.get_body(preferencelist=('html', 'plain'))
                                              # downloading attachments
                                                  for part in email_message.walk():
                                                      print("------------------------\n", part)
                                              

                                              le code : 

                                              import imaplib
                                              import base64
                                              import os
                                              import email
                                              
                                              
                                              email_user = input('Email: ')
                                              email_pass = input('Password: ')
                                              
                                              
                                              mail = imaplib.IMAP4_SSL('imap.gmail.com', 993)
                                              
                                              
                                              mail.login(email_user, email_pass)
                                              
                                              
                                              mail.select('Inbox')
                                              
                                              
                                              type, data = mail.search(
                                                  'utf-8', '(FROM', '"notices@wayfarer.nianticlabs.com")')
                                              mail_ids = data[0]
                                              id_list = mail_ids.split()
                                              
                                              
                                              for num in data[0].split():
                                                  typ, data = mail.fetch(num, '(RFC822)')
                                                  raw_email = data[0][1]
                                              # converts byte literal to string removing b''
                                              
                                                  email_message = email.message_from_bytes(raw_email)
                                                  email_message.get_body(preferencelist=('html', 'plain'))
                                              # downloading attachments
                                                  for part in email_message.walk():
                                                      print("------------------------\n", part)
                                              
                                                     # this part comes from the snipped I don't understand yet...
                                                      if part.get_content_maintype() == 'multipart':
                                                          print("je suis passé ici")
                                                          continue
                                              
                                                      if part.get('Content-Disposition') is None:
                                                          print("je suis passé la")
                                                          continue
                                                      fileName = part.get_filename()
                                                      print(fileName)
                                                      if bool(fileName):
                                                          print("test")
                                                          filePath = os.path.join('/Users/sanketdoshi/python/', fileName)
                                                          if not os.path.isfile(filePath):
                                                              fp = open(filePath, 'wb')
                                                              fp.write(part.get_payload(decode=True))
                                                              fp.close()
                                                          subject = str(email_message).split(
                                                              "Subject: ", 1)[1].split("\nTo:", 1)[0]
                                                          print('Downloaded "{file}" from email titled "{subject}" with UID {uid}.'.format(
                                                              file=fileName, subject=subject))
                                              



                                              mais le get_body ne marche pas je ne sais pas pouquoi 

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                27 juin 2022 à 12:17:55

                                                En fait, il faudrait utiliser get_payload() sur une part du message voir un code plus détaillé ici https://www.thepythoncode.com/article/reading-emails-in-python (il faut rajouter ton étape de recherche)
                                                status, messages = imap.select("INBOX")
                                                # number of top emails to fetch
                                                N = 3
                                                # total number of emails
                                                messages = int(messages[0])
                                                for i in range(messages, messages-N, -1):
                                                    # fetch the email message by ID
                                                    res, msg = imap.fetch(str(i), "(RFC822)")
                                                    for response in msg:
                                                        if isinstance(response, tuple):
                                                            # parse a bytes email into a message object
                                                            msg = email.message_from_bytes(response[1])
                                                            # decode the email subject
                                                            subject, encoding = decode_header(msg["Subject"])[0]
                                                            if isinstance(subject, bytes):
                                                                # if it's a bytes, decode to str
                                                                subject = subject.decode(encoding)
                                                            # decode email sender
                                                            From, encoding = decode_header(msg.get("From"))[0]
                                                            if isinstance(From, bytes):
                                                                From = From.decode(encoding)
                                                            print("Subject:", subject)
                                                            print("From:", From)
                                                            # if the email message is multipart
                                                            if msg.is_multipart():
                                                                # iterate over email parts
                                                                for part in msg.walk():
                                                                    # extract content type of email
                                                                    content_type = part.get_content_type()
                                                                    content_disposition = str(part.get("Content-Disposition"))
                                                                    try:
                                                                        # get the email body
                                                                        body = part.get_payload(decode=True).decode()
                                                                    except:
                                                                        pass
                                                                    if content_type == "text/plain" and "attachment" not in content_disposition:
                                                                        # print text/plain emails and skip attachments
                                                                        print(body)
                                                                    elif "attachment" in content_disposition:
                                                                        # download attachment
                                                                        filename = part.get_filename()
                                                                        if filename:
                                                                            folder_name = clean(subject)
                                                                            if not os.path.isdir(folder_name):
                                                                                # make a folder for this email (named after the subject)
                                                                                os.mkdir(folder_name)
                                                                            filepath = os.path.join(folder_name, filename)
                                                                            # download attachment and save it
                                                                            open(filepath, "wb").write(part.get_payload(decode=True))
                                                            else:
                                                                # extract content type of email
                                                                content_type = msg.get_content_type()
                                                                # get the email body
                                                                body = msg.get_payload(decode=True).decode()
                                                                if content_type == "text/plain":
                                                                    # print only text email parts
                                                                    print(body)
                                                            if content_type == "text/html":
                                                                # if it's HTML, create a new HTML file and open it in browser
                                                                folder_name = clean(subject)
                                                                if not os.path.isdir(folder_name):
                                                                    # make a folder for this email (named after the subject)
                                                                    os.mkdir(folder_name)
                                                                filename = "index.html"
                                                                filepath = os.path.join(folder_name, filename)
                                                                # write the file
                                                                open(filepath, "w").write(body)
                                                                # open in the default browser
                                                                webbrowser.open(filepath)
                                                            print("="*100)
                                                # close the connection and logout
                                                imap.close()
                                                imap.logout()
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  27 juin 2022 à 13:09:50


                                                  umfred a écrit:

                                                  En fait, il faudrait utiliser get_payload() sur une part du message voir un code plus détaillé ici https://www.thepythoncode.com/article/reading-emails-in-python (il faut rajouter ton étape de recherche)

                                                  status, messages = imap.select("INBOX")
                                                  # number of top emails to fetch
                                                  N = 3
                                                  # total number of emails
                                                  messages = int(messages[0])
                                                  for i in range(messages, messages-N, -1):
                                                      # fetch the email message by ID
                                                      res, msg = imap.fetch(str(i), "(RFC822)")
                                                      for response in msg:
                                                          if isinstance(response, tuple):
                                                              # parse a bytes email into a message object
                                                              msg = email.message_from_bytes(response[1])
                                                              # decode the email subject
                                                              subject, encoding = decode_header(msg["Subject"])[0]
                                                              if isinstance(subject, bytes):
                                                                  # if it's a bytes, decode to str
                                                                  subject = subject.decode(encoding)
                                                              # decode email sender
                                                              From, encoding = decode_header(msg.get("From"))[0]
                                                              if isinstance(From, bytes):
                                                                  From = From.decode(encoding)
                                                              print("Subject:", subject)
                                                              print("From:", From)
                                                              # if the email message is multipart
                                                              if msg.is_multipart():
                                                                  # iterate over email parts
                                                                  for part in msg.walk():
                                                                      # extract content type of email
                                                                      content_type = part.get_content_type()
                                                                      content_disposition = str(part.get("Content-Disposition"))
                                                                      try:
                                                                          # get the email body
                                                                          body = part.get_payload(decode=True).decode()
                                                                      except:
                                                                          pass
                                                                      if content_type == "text/plain" and "attachment" not in content_disposition:
                                                                          # print text/plain emails and skip attachments
                                                                          print(body)
                                                                      elif "attachment" in content_disposition:
                                                                          # download attachment
                                                                          filename = part.get_filename()
                                                                          if filename:
                                                                              folder_name = clean(subject)
                                                                              if not os.path.isdir(folder_name):
                                                                                  # make a folder for this email (named after the subject)
                                                                                  os.mkdir(folder_name)
                                                                              filepath = os.path.join(folder_name, filename)
                                                                              # download attachment and save it
                                                                              open(filepath, "wb").write(part.get_payload(decode=True))
                                                              else:
                                                                  # extract content type of email
                                                                  content_type = msg.get_content_type()
                                                                  # get the email body
                                                                  body = msg.get_payload(decode=True).decode()
                                                                  if content_type == "text/plain":
                                                                      # print only text email parts
                                                                      print(body)
                                                              if content_type == "text/html":
                                                                  # if it's HTML, create a new HTML file and open it in browser
                                                                  folder_name = clean(subject)
                                                                  if not os.path.isdir(folder_name):
                                                                      # make a folder for this email (named after the subject)
                                                                      os.mkdir(folder_name)
                                                                  filename = "index.html"
                                                                  filepath = os.path.join(folder_name, filename)
                                                                  # write the file
                                                                  open(filepath, "w").write(body)
                                                                  # open in the default browser
                                                                  webbrowser.open(filepath)
                                                              print("="*100)
                                                  # close the connection and logout
                                                  imap.close()
                                                  imap.logout()


                                                  j ai tester et modifier comme il le faut et il trouve bien des mail et les 3 premier oui , enfin je pence car les mail que j ai ressu son surement des spam

                                                  mais la ou je vais en venir c est le moment de metre dans un fichier j ai un porblem ici : 

                                                  return codecs.charmap_encode(input,self.errors,encoding_table)[0]
                                                  UnicodeEncodeError: 'charmap' codec can't encode character '\u2502' in position 56387: character maps to <undefined>     

                                                  et le code modifier : 

                                                  imap_server = "imap.gmail.com"


                                                  ( au debut ) 

                                                  et en gros j ai un message d erreur ici : 

                                                    open(filepath, "w").write(body)

                                                  donc le code en entier pour etre sur : 

                                                  imap_server = "imap.gmail.com"
                                                  
                                                  
                                                  def clean(text):
                                                      # clean text for creating a folder
                                                      return "".join(c if c.isalnum() else "_" for c in text)
                                                  
                                                  
                                                  # create an IMAP4 class with SSL
                                                  imap = imaplib.IMAP4_SSL(imap_server)
                                                  # authenticate
                                                  imap.login(username, password)
                                                  
                                                  status, messages = imap.select("INBOX")
                                                  # number of top emails to fetch
                                                  N = 3
                                                  # total number of emails
                                                  messages = int(messages[0])
                                                  
                                                  
                                                  for i in range(messages, messages-N, -1):
                                                      # fetch the email message by ID
                                                      res, msg = imap.fetch(str(i), "(RFC822)")
                                                      for response in msg:
                                                          if isinstance(response, tuple):
                                                              # parse a bytes email into a message object
                                                              msg = email.message_from_bytes(response[1])
                                                              # decode the email subject
                                                              subject, encoding = decode_header(msg["Subject"])[0]
                                                              if isinstance(subject, bytes):
                                                                  # if it's a bytes, decode to str
                                                                  subject = subject.decode(encoding)
                                                              # decode email sender
                                                              From, encoding = decode_header(msg.get("From"))[0]
                                                              if isinstance(From, bytes):
                                                                  From = From.decode(encoding)
                                                              print("Subject:", subject)
                                                              print("From:", From)
                                                              # if the email message is multipart
                                                              if msg.is_multipart():
                                                                  # iterate over email parts
                                                                  for part in msg.walk():
                                                                      # extract content type of email
                                                                      content_type = part.get_content_type()
                                                                      content_disposition = str(part.get("Content-Disposition"))
                                                                      try:
                                                                          # get the email body
                                                                          body = part.get_payload(decode=True).decode()
                                                                      except:
                                                                          pass
                                                                      if content_type == "text/plain" and "attachment" not in content_disposition:
                                                                          # print text/plain emails and skip attachments
                                                                          print(body)
                                                                      elif "attachment" in content_disposition:
                                                                          # download attachment
                                                                          filename = part.get_filename()
                                                                          if filename:
                                                                              folder_name = clean(subject)
                                                                              if not os.path.isdir(folder_name):
                                                                                  # make a folder for this email (named after the subject)
                                                                                  os.mkdir(folder_name)
                                                                              filepath = os.path.join(folder_name, filename)
                                                                              # download attachment and save it
                                                                              open(filepath, "wb").write(
                                                                                  part.get_payload(decode=True))
                                                              else:
                                                                  # extract content type of email
                                                                  content_type = msg.get_content_type()
                                                                  # get the email body
                                                                  body = msg.get_payload(decode=True).decode()
                                                                  if content_type == "text/plain":
                                                                      # print only text email parts
                                                                      print(body)
                                                              if content_type == "text/html":
                                                                  # if it's HTML, create a new HTML file and open it in browser
                                                                  folder_name = clean(subject)
                                                                  if not os.path.isdir(folder_name):
                                                                      # make a folder for this email (named after the subject)
                                                                      os.mkdir(folder_name)
                                                                  filename = "index.html"
                                                                  filepath = os.path.join(folder_name, filename)
                                                                  # write the file
                                                                  open(filepath, "w").write(body)
                                                                  # open in the default browser
                                                                  webbrowser.open(filepath)
                                                              print("="*100)
                                                  # close the connection and logout
                                                  imap.close()
                                                  imap.logout()
                                                  

                                                  oui j ai mis que apres le login de tout facon cela ne change pas 

                                                  et aussi je ne comprend pas pourquoi dans le demonstration ( https://www.thepythoncode.com/article/reading-emails-in-python ) 

                                                  il ont cela a la fin : 

                                                  Subject: Thanks for Subscribing to our Newsletter !
                                                  From: example@domain.com
                                                  ====================================================================================================
                                                  Subject: An email with a photo as an attachment
                                                  From: Python Code <example@domain.com>
                                                  Get the photo now!
                                                  
                                                  ====================================================================================================
                                                  Subject: A Test message with attachment
                                                  From: Python Code <example@domain.com>
                                                  There you have it!
                                                  
                                                  ====================================================================================================

                                                  et moi je me retrouve avec cela : 

                                                  Subject: 🔥 Boost sur Conforama 🔥 Samsung, Expedia, chaussures.fr...
                                                  From: iGraal Sélection du jour
                                                  
                                                  %%first_name%% %%balance%%€ : http://email.fr.igraal.com/c/eJxVj0FrwzAMhX9NfHNQHNuKDz4USmG3HnYPiiM3hnQJjlO2f7-kh8Hg8UA8SXxv39PoEUM0CEFGEzvZNBzkQMFJUKwsEmhrQCSvQCmwCsGB1bZ2w8DsRoVMujPIlYaY6_TIRHMdlqeYPDG1MAQkB9GOLnbgTKsikGID7KzYN84fo-9Qa0QjZj-Vsm5Ve6nU7dC_f8d8-Fr4zNrblgrfKZeqvfJ3ydQ_Kc3itM-flf3GM4eSli-RfZl44K3EJfOLu-YAfZx7b8jyriXBSoU9WID-77K_itGbA_8Xq1RaYw
                                                  iGraal : http://email.fr.igraal.com/c/eJxVT7FqxDAU-5p4c3hx7PeSwcPBcdCtQ_fgvDxfDLnmcJzS_n2TGwoFoUFIQtr3NHkijo6AdXSx000jrMfAvQYjBimARQcqeQPGABqCHtBi3Y-jSD8ZkmA7R1JZiLlO9xzCUvP6ULN3phdkhyOFpmWOGI4GZ4GdTIgdq32T_Db5jqwlcmrxcynPrWovlbkd-Nd3Su1tS0XeQy5Ve5XvksPwCGlRJ338PMVvsgiXtH6q7Msso2wlrlm-pGuOfffT99pWXm80oDY0AAIMf8nhqibvRqZfVbVXDA
                                                  
                                                        Sélection du jour
                                                      27 juin 2022
                                                      Profitez de nos offres exclusives du jour
                                                      découvrir: http://email.fr.igraal.com/c/eJxVj0trxDAMhH9NfHNQ_FJ88KGwLPTWQ-_BD3ljyDaL45T23zfZw0JBCIb5NIz2vSSHGLNGiDzrPPJhoMiDj5aDIGHQgzIaWHEChAAjECwYZXobApFNAsmrUSN1CnLty616v_RxvbPZCTWiJRk0eMpWAiSEYfBGKhGyEontG9X35EZUClGzxc2tPbZOvnXiesy_vENvtFBsZf06bXndSqMPX1snL_TTqp_uvizsXJ-_D3IvmlXXZgq0tbxW-qZxOLreTu7Zsz0_42C4wAkMwPS6nC4sOR0i_gFbw1sE


                                                  ect jusqu au message d erreur entier : 

                                                    File "d:\wamp\www\phyton\bot_gmail\test.py", line 95, in <module>
                                                      open(filepath, "w").write(body)
                                                    File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.1520.0_x64__qbz5n2kfra8p0\lib\encodings\cp1252.py", line 19, in encode
                                                      return codecs.charmap_encode(input,self.errors,encoding_table)[0]
                                                  UnicodeEncodeError: 'charmap' codec can't encode character '\u2502' in position 56387: character maps to <undefined>  

                                                  je sais que je doi paser une colle ici merci a vous





                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    27 juin 2022 à 14:50:55

                                                    ce qu'ils indiquent à la fin est un exemple de ce que retourne le code (ça change bien évidemment selon les mails reçus)

                                                    Sinon tu as un problème d'encodage

                                                    essai

                                                    open(filepath, "w", encoding='utf-8').write(body)



                                                    -
                                                    Edité par umfred 27 juin 2022 à 14:51:04

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      27 juin 2022 à 15:21:26

                                                      umfred a écrit:

                                                      ce qu'ils indiquent à la fin est un exemple de ce que retourne le code (ça change bien évidemment selon les mails reçus)

                                                      Sinon tu as un problème d'encodage

                                                      essai

                                                      open(filepath, "w", encoding='utf-8').write(body)



                                                      -
                                                      Edité par umfred il y a 26 minutes

                                                      cool tout marche bien je resoi bien les mail je le modifi pour que cela soit dans un fichier json si tout marche je le post ici et je ferm le suject merci a ous vous etes le miellleur 

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        13 juillet 2022 à 13:40:17

                                                        bon voila la vertion final de mon project je vais aussi le metre sur github 

                                                        import imaplib
                                                        import email
                                                        from email.header import decode_header
                                                        from traceback import print_tb
                                                        import os
                                                        import json
                                                        import html2text
                                                        import re
                                                        
                                                        
                                                        # -------------------Function--------------------
                                                        
                                                        def encodage(corps, dico):
                                                        
                                                            h = html2text.HTML2Text()
                                                            h.ignore_links = True
                                                            corps = str(h.handle(corps))
                                                        
                                                            # --------------------------------------------------------
                                                            regex = r'\n'
                                                        
                                                            corps = re.sub(regex, "", corps, 0)
                                                        
                                                            regex = r"\!\[.+?\]\(https://[\w\./\-\\\?\=\&\%\~\@\-\-\_\+]+\)"
                                                        
                                                            corps = re.sub(regex, "", corps, 0)
                                                        
                                                            regex = r"\!\[\]\(https://[\w\./\-\\\?\=\&\%\~\@\-\-\_\+]+\)"
                                                        
                                                            corps = re.sub(regex, "", corps, 0)
                                                        
                                                            regex = r"[\s|\||\-\#]{2,}"
                                                        
                                                            # ---------- a faire une function car surement desactivé
                                                            # si le bot discord li bien les ascii
                                                        
                                                            corps = re.sub(regex, "", corps, 0)
                                                        
                                                            regex = r'é'
                                                        
                                                            corps = re.sub(regex, "e", corps, 0)
                                                        
                                                            regex = r'ê'
                                                        
                                                            corps = re.sub(regex, "e", corps, 0)
                                                        
                                                            regex = r'à'
                                                        
                                                            corps = re.sub(regex, "a", corps, 0)
                                                        
                                                            regex = r'è'
                                                        
                                                            corps = re.sub(regex, "e", corps, 0)
                                                        
                                                            regex = r'î'
                                                        
                                                            corps = re.sub(regex, "i", corps, 0)
                                                        
                                                            regex = r"’"
                                                        
                                                            corps = re.sub(regex, " ", corps, 0)
                                                        
                                                            # ---------- a faire une function car surement desactivé
                                                            # si le bot discord li bien les ascii
                                                        
                                                            # --------------------------------------------------------
                                                        
                                                            print("body:", corps)
                                                            dico['body'] = str(corps)
                                                            # --------------------------------------------------------
                                                        
                                                        
                                                        # -------------------/Function--------------------
                                                        # account credentials
                                                        username = "***********"
                                                        password = "**********"
                                                        # use your email provider's IMAP server, you can look for your provider's IMAP server on Google
                                                        # or check this page: https://www.systoolsgroup.com/imap/
                                                        # for office 365, it's this:
                                                        imap_server = "imap.gmail.com"
                                                        
                                                        
                                                        def clean(text):
                                                            # clean text for creating a folder
                                                            return "".join(c if c.isalnum() else "_" for c in text)
                                                        
                                                        
                                                        # create an IMAP4 class with SSL
                                                        imap = imaplib.IMAP4_SSL(imap_server)
                                                        # authenticate
                                                        imap.login(username, password)
                                                        
                                                        status, messages = imap.select("INBOX")
                                                        # number of top emails to fetch
                                                        N = 1
                                                        # total number of emails
                                                        
                                                        messages = int(messages[0])
                                                        
                                                        
                                                        maildict = {}
                                                        maildict['n message'] = str(messages)
                                                        
                                                        for i in range(messages, messages-N, -1):
                                                            # fetch the email message by ID
                                                            res, msg = imap.fetch(str(i), "(RFC822)")
                                                            for response in msg:
                                                                if isinstance(response, tuple):
                                                                    # parse a bytes email into a message object
                                                                    msg = email.message_from_bytes(response[1])
                                                                    # decode the email subject
                                                                    subject, encoding = decode_header(msg["Subject"])[0]
                                                        
                                                                    if isinstance(encoding, str):
                                                                        # if it's a bytes, decode to str
                                                                        subject = subject.decode(encoding)
                                                        
                                                                    # decode email sender
                                                        
                                                                    From, encoding = decode_header(msg.get("From"))[0]
                                                        
                                                                    if isinstance(From, bytes):
                                                                        try:
                                                                            From = From.decode(encoding)
                                                                        except:
                                                                            pass
                                                        
                                                                    print("Subject:", subject)
                                                                    print("From:", From)
                                                        
                                                                    maildict['Subject'] = str(subject)
                                                                    maildict['From'] = str(From)
                                                        
                                                                    content_type = msg.get_content_type()
                                                                    print("content_type:", content_type)
                                                        
                                                                    try:
                                                        
                                                                        body = msg.get_payload(decode=True).decode()
                                                        
                                                                    except:
                                                        
                                                                        pass
                                                        
                                                                    if content_type == "text/plain":
                                                        
                                                                        # --------------------------------------------------------
                                                                        encodage(body, maildict)
                                                        
                                                                    # if the email message is multipart
                                                                    if content_type == "text/html":
                                                                        # --------------------------------------------------------
                                                        
                                                                        encodage(body, maildict)
                                                        
                                                                        # --------------------------------------------------------
                                                        
                                                                        print("="*100)
                                                                        print(msg.is_multipart())
                                                        
                                                                    if msg.is_multipart():
                                                                        # --------------------------------------------------------
                                                                        # iterate over email parts
                                                                        for part in msg.walk():
                                                                            # extract content type of email
                                                                            content_type = part.get_content_type()
                                                                            content_disposition = str(
                                                                                part.get("Content-Disposition"))
                                                                            body = ''
                                                                            try:
                                                                                # get the email body
                                                                                body = part.get_payload(decode=True).decode()
                                                                            except:
                                                                                pass
                                                        
                                                                            # --------------------------------------------------------
                                                        
                                                                            encodage(body, maildict)
                                                                            # --------------------------------------------------------
                                                                        encodage(body, maildict)
                                                        
                                                        with open(f'{os.path.abspath( os.path.dirname( __file__ ))}\\valeur_bot.json', 'w') as f:
                                                            json.dump(maildict, f, indent=4)
                                                            f.close()
                                                        # close the connection and logout
                                                        
                                                        
                                                        imap.close()
                                                        imap.logout()
                                                        

                                                        le github : https://github.com/NEKOgrile/mail-into-json

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        récupéré les mail sur un fichier json

                                                        × 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