IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Imaplib - selection boite ayant des caractères accentué [Python 3.X]


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur de Production
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de Production
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Par défaut Imaplib - selection boite ayant des caractères accentué
    Bonjour

    Pour un projet que je suis en train de faire je doit :
    - recuperer les mails envoyé a un destinataire précis, pendant une periode données (chaque semaine, du lundi au dimanche)
    - traiter les données indiquées dans le corps du message.

    pour cela je pense dans un premier temps telecharger les mails, ce qui m'interesse c'est surtout le contenu
    puis ensuite traiter chaque mail pour recuperer les infos necessaire, et au final consolider les données dans un csv.

    mes message sont sur une boite gmail.
    je suis en train de tester la lib imaplib, j'arrive a me connecter sur la boite et al lister les dossiers.

    mes mails sont dans la boite d'envoie : Messages Envoyés

    Problème, comme il y'a un caractère special, je ne parvient pas a selectionner cette boite.
    voici ce que j'ai en listant la liste des dossier depuis python.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    b'(\\HasNoChildren) "/" "2021"'
    b'(\\HasNoChildren) "/" "2022"'
    b'(\\HasNoChildren) "/" "2023"'
    b'(\\HasNoChildren) "/" "2024"'
    b'(\\HasNoChildren) "/" "INBOX"'
    b'(\\HasChildren \\Noselect) "/" "[Gmail]"'
    b'(\\Drafts \\HasNoChildren) "/" "[Gmail]/Brouillons"'
    b'(\\HasNoChildren \\Trash) "/" "[Gmail]/Corbeille"'
    b'(\\HasNoChildren \\Important) "/" "[Gmail]/Important"'
    b'(\\HasNoChildren \\Sent) "/" "[Gmail]/Messages envoy&AOk-s"'
    b'(\\HasNoChildren \\Junk) "/" "[Gmail]/Spam"'
    b'(\\Flagged \\HasNoChildren) "/" "[Gmail]/Suivis"'
    b'(\\All \\HasNoChildren) "/" "[Gmail]/Tous les messages"'
    la dossier qui m'interesse est donc celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b'(\\HasNoChildren \\Sent) "/" "[Gmail]/Messages envoy&AOk-s"'
    comment faire pour le selectionner ?
    je me demandais si je pouvais pas utuliser ce qui ressemble a l'arborescence \\Sent, mais ca ne fonctionne pas.

    et sur Gmail, impossible de renommer la boite pour un truc plus court >_<

    Auriez vous une idée de comment faire ?

    Les messages sont des mails automatiques envoyé par nos copieurs aux fournisseur, pour la facturation selon le nombre de copie et cie.

    Merci a vous

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 752
    Par défaut
    Hello,

    On peut tester sur un code simple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import imaplib
     
    # Connexion (remplace par tes credentials)
    imap = imaplib.IMAP4_SSL('imap.gmail.com')
    imap.login('ton.email@gmail.com', 'ton_mot_de_passe_ou_app_password')
     
    # Sélection du dossier avec le nom exact
    status, messages = imap.select('[Gmail]/Messages envoy&AOk-s')
     
    if status == 'OK':
        print("Sélection réussie ! Nombre de messages :", messages[0].decode())
    else:
        print("Erreur lors de la sélection :", status)
     
    # ... Ensuite, vous pouvez chercher et fetch les mails comme d'habitude
    imap.close()
    imap.logout()
    Qu'est-ce que ça donne ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur de Production
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de Production
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Traceback (most recent call last):
      File "/home/dsi/python_sharp/test.py", line 16, in <module>
        status, messages = mailbox.select('[Gmail]/Messages envoy&AOk-s')
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3.12/imaplib.py", line 756, in select
        typ, dat = self._simple_command(name, mailbox)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3.12/imaplib.py", line 1230, in _simple_command
        return self._command_complete(name, self._command(name, *args))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3.12/imaplib.py", line 1055, in _command_complete
        raise self.error('%s command error: %s %s' % (name, typ, data))
    imaplib.IMAP4.error: SELECT command error: BAD [b'Could not parse command']
    il aime pas :'(

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 752
    Par défaut
    Si on active l'extension UTF-8 pour IMAP, on peut utiliser les accents,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import imaplib
     
    # Connexion SSL
    imap = imaplib.IMAP4_SSL('imap.gmail.com')
     
    # Login (utilise un App Password si 2FA activé)
    imap.login('ton.email@gmail.com', 'ton_app_password')
     
    # Activer l'extension UTF8 (doit être fait après login)
    status, response = imap._simple_command('ENABLE', 'UTF8=ACCEPT')
    print(f"Activation UTF8 : {status} {response}")  # Devrait afficher OK
     
    # Nom du dossier en unicode (avec accent)
    folder = '[Gmail]/Messages envoyés'
     
    # Encoder en UTF-8 bytes pour utiliser literal IMAP
    folder_bytes = folder.encode('utf-8')
     
    # Sélection du dossier
    status, messages = imap.select(folder_bytes)
     
    if status == 'OK':
        print("Sélection réussie ! Nombre de messages :", messages[0].decode())
    else:
        print("Erreur :", status, messages)
     
    # ... Suite de ton code (search, fetch, etc.)
    imap.close()
    imap.logout()
    Ça donne quoi du coup ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur de Production
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de Production
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Par défaut
    pas mieux, je pense effectivement comme toi, problème d'encodage, mais j'arrive pas a trouver le truc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Activation UTF8 : OK [b'Success']
    Traceback (most recent call last):
      File "/home/dsi/python_sharp/test2.py", line 20, in <module>
        status, messages = imap.select(folder_bytes)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3.12/imaplib.py", line 756, in select
        typ, dat = self._simple_command(name, mailbox)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3.12/imaplib.py", line 1230, in _simple_command
        return self._command_complete(name, self._command(name, *args))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3.12/imaplib.py", line 1055, in _command_complete
        raise self.error('%s command error: %s %s' % (name, typ, data))
    imaplib.IMAP4.error: SELECT command error: BAD [b'Could not parse command']
    imap oblige l'utilisation du nom du dossier ? on peut pas utiliser ce qui ressemble a l'arbo ?
    b'(\\HasNoChildren \\Sent) "/" "[Gmail]/Messages envoy\xc3\xa9s"'
    le \\HasNoChildren \\Sent ?
    j'avais essyé avec un imap.select("\\Sent"), ou avec les \\hasno...., avec et ses ", mais il voulait rien savoir.

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 040
    Par défaut
    Le nom n'est peux être pas exactement celui que tu crois.
    Regarde ce post :
    https://stackoverflow.com/questions/...r-using-python

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur de Production
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de Production
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Par défaut
    j'ai essayé avec Sent, [gmail]/Sent, INBOX.sent, INBOX.sent
    rien a faire.

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur de Production
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de Production
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Par défaut
    Alors j'ai l'impression que le soucis est autre.
    j'ai passé mon gmail en anglais pour voir.
    la liste des dossiers est du coup la suivante, retourné par un mailbox.list() --- mailbox = ma connexion imap
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> mailbox.list()
    ('OK', [b'(\\HasNoChildren) "/" "2021"', b'(\\HasNoChildren) "/" "2022"', b'(\\HasNoChildren) "/" "2023"', b'(\\HasNoChildren) "/" "2024"', b'(\\HasNoChildren) "/" "INBOX"', b'(\\HasChildren \\Noselect) "/" "[Gmail]"', b'(\\All \\HasNoChildren) "/" "[Gmail]/All Mail"', b'(\\Drafts \\HasNoChildren) "/" "[Gmail]/Drafts"', b'(\\HasNoChildren \\Important) "/" "[Gmail]/Important"', b'(\\HasNoChildren \\Sent) "/" "[Gmail]/Sent Mail"', b'(\\HasNoChildren \\Junk) "/" "[Gmail]/Spam"', b'(\\Flagged \\HasNoChildren) "/" "[Gmail]/Starred"', b'(\\HasNoChildren \\Trash) "/" "[Gmail]/Trash"'])
    >>> mailbox.select("[Gmail]/Sent Mail")
    la je me dit OK, plus d'accent, du coup j'y vais avec un mailbox.select("[Gmail]/Sent Mail")
    et la, c'est le drame
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> mailbox.select("[Gmail]\/Sent Mail")
    <stdin>:1: SyntaxWarning: invalid escape sequence '\/'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python3.12/imaplib.py", line 756, in select
        typ, dat = self._simple_command(name, mailbox)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3.12/imaplib.py", line 1230, in _simple_command
        return self._command_complete(name, self._command(name, *args))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3.12/imaplib.py", line 1055, in _command_complete
        raise self.error('%s command error: %s %s' % (name, typ, data))
    imaplib.IMAP4.error: SELECT command error: BAD [b'Could not parse command']
    Le soucis ne semble donc pas etre le caractères accentué mais l'espace dans le nom
    je peut acceder au dossier [Gmail]/Spam par exemple, ca marche, mais [Gmail]Sent Mail, veut pas :/

    en cherchant j'ai fini par trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> mailbox.select("\"[Gmail]/Sent Mail\"")
    ('OK', [b'18465'])
    je repasse donc mon gmail en francais, et bingo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> mailbox.select("\"[Gmail]/Messages envoy&AOk-s\"")
    ('OK', [b'18465'])

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 870
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Chico008 Voir le message
    en cherchant j'ai fini par trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> mailbox.select("\"[Gmail]/Sent Mail\"")
    Par trouvER. Et les chaines Python possèdent deux symboles différents permettant justement d'utiliser l'un lorsque l'autre doit être traité comme caractère => mailbox.select('"[Gmail]/Sent Mail"').
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] SELECT et caractères dés-accentués
    Par olbouss dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 08/09/2009, 15h38
  2. SELECT : perte des caractères accentués
    Par HRS dans le forum SQL
    Réponses: 2
    Dernier message: 04/08/2008, 16h51
  3. Réponses: 5
    Dernier message: 07/10/2007, 18h14
  4. Empécher la sélection du texte des pages dans un WebBrowser
    Par DevelOpeR13 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 05/06/2003, 19h36
  5. insérer des caractères accentués INFORMIX/JDBC
    Par donde dans le forum Informix
    Réponses: 2
    Dernier message: 19/11/2002, 21h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo