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 :

Comprendre l'erreur TypeError: object of type 'Header' has no len() [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien bureau d'études mécanique
    Inscrit en
    Avril 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien bureau d'études mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Comprendre l'erreur TypeError: object of type 'Header' has no len()
    Bonjour,

    Etant novice en programmation python, j'essaie de faire un petit programme qui récupère les derniers mails.
    Quand je lance le programme, il commence bien à m'afficher les derniers mails reçu, mais au bout de 5 mails il me mets l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "I:\Python\testmail.py", line 32, in <module>
        if len(varSubject) > 35:
    TypeError: object of type 'Header' has no len()
    Je vous mets le programme :
    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
    30
    31
    32
    33
    34
    35
    36
    import imaplib
    imaplib._MAXLINE = 200000
    import email
     
    mail = imaplib.IMAP4_SSL('imap.gmail.com')
    mail.login('monadresse@gmail.com', 'motdepasse')
    mail.list()
    mail.select('inbox')
    typ, data = mail.search(None, 'ALL')
    ids = data[0]
    id_list = ids.split()
     
    #get the most recent email id
    latest_email_id = int(id_list[-1])
     
    #iterate through 15 messages in descending order starting with latest_email_id
    #the '-1' dictates reverse looping order
    for i in range(latest_email_id, latest_email_id - 15, -1):
        typ, data = mail.fetch(str(i), '(RFC822)')
     
        for response_part in data:
            if isinstance(response_part, tuple):
                msg = email.message_from_bytes(response_part[1])
                varSubject = msg['subject']
                varFrom = msg['from']
     
        #remove the brackets around the sender email address
        varFrom = varFrom.replace('<', '')
        varFrom = varFrom.replace('>', '')
     
        #add ellipsis (...) if subject length is greater than 35 characters
        if len(varSubject) > 35:
            varSubject = varSubject[0:32] + '...'
     
        print('[' + varFrom.split()[-1] + ']' + varSubject)
    mail.close()
    Si vous avez déjà eu le problème ou une idée, je vous remercie d'avance.
    Jérôme

  2. #2
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Points : 143
    Points
    143
    Par défaut
    Bonjour,

    J'ai essayé chez moi et j'ai le même problème (mais au bout de 9 messages)
    L'instruction msg['subject'] renvoie en général un string mais renvoie parfois un objet du type email.header.Header.
    Je ne sais pas la raison.
    Tu peux régler le problème en remplaçant la ligne 24 par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varSubject = str(msg['subject'])
    même s'il doit exister une meilleure solution à mon avis.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien bureau d'études mécanique
    Inscrit en
    Avril 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien bureau d'études mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour Biribibi,

    En effet ta modification fonctionne.
    Je sais pas si il existe une meilleur solution, mais en tous cas elle répond au besoin.
    Je te remercie.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Biribibi Voir le message
    L'instruction msg['subject'] renvoie en général un string mais renvoie parfois un objet du type email.header.Header.
    Je ne sais pas la raison.
    La raison est dans les sources:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        def header_fetch_parse(self, name, value):
            """+
            If the value contains binary data, it is converted into a Header object
            using the unknown-8bit charset.  Otherwise it is returned unmodified.
            """
            return self._sanitize_header(name, value)
    "str" fonctionne car le header définit cette méthode:
    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
       def __str__(self):
            """Return the string value of the header."""
            self._normalize()
            uchunks = []
            lastcs = None
            lastspace = None
            for string, charset in self._chunks:
                # We must preserve spaces between encoded and non-encoded word
                # boundaries, which means for us we need to add a space when we go
                # from a charset to None/us-ascii, or from None/us-ascii to a
                # charset.  Only do this for the second and subsequent chunks.
                # Don't add a space if the None/us-ascii string already has
                # a space (trailing or leading depending on transition)
                nextcs = charset
                if nextcs == _charset.UNKNOWN8BIT:
                    original_bytes = string.encode('ascii', 'surrogateescape')
                    string = original_bytes.decode('ascii', 'replace')
                ...
    mais perd des informations dans ce cas là.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Technicien bureau d'études mécanique
    Inscrit en
    Avril 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien bureau d'études mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Ok, merci pour ton explication wiztricks.

    Jérôme

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 07/05/2014, 15h05
  2. Réponses: 11
    Dernier message: 06/05/2009, 17h13
  3. [PRO*C] comp erreur sur object types /AQ / ALLOCATE
    Par ydelanoe dans le forum Interfaces de programmation
    Réponses: 0
    Dernier message: 22/10/2007, 17h36
  4. Erreur de conversion de type Null en String
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/07/2005, 15h25
  5. Erreur : '800a01a8' Object Required
    Par kiks dans le forum ASP
    Réponses: 4
    Dernier message: 01/12/2004, 13h58

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