7
votes

Comment analyser efficacement des emails sans toucher les pièces jointes à l'aide de Python

Je joue avec Python IMAPLIB (Python 2.6) pour chercher des courriels de Gmail. Tout ce que je vais chercher un email avec la méthode http://docs.python.org/ Bibliothèque / imaplib.html # imaplib.imap4.fetch Je reçois un email entier. Je n'ai besoin que d'une partie de texte et d'analyser les noms des pièces jointes, sans les télécharger. Comment cela peut être fait? Je vois que les courriels retournés par Gmail suivent le même format que les navigateurs envoient aux serveurs HTTP.


0 commentaires

3 Réponses :


0
votes

J'ai bien peur que tu n'as pas de chance. Selon Cet article , il n'y a que deux parties à l'e-mail - l'en-tête et le corps. Le corps est l'endroit où les attachements sont s'il y en a une et vous devez télécharger tout le corps avant d'extraire le texte du message. Les informations sur la commande FETCH ont trouvé ici soutient également cet avis . Bien qu'il soit dit que vous pouvez extraire des partiels du corps, ceux-ci sont spécifiés en termes d'octets qui ne vous aident pas vraiment.


0 commentaires

5
votes

Jetez un oeil à cette recette: http://code.activestate.com/recipes/498189/

Je l'ai légèrement adapté pour imprimer de la date, du sujet, de la date, du nom des pièces jointes et du corps du message (juste en clair pour maintenant - son trivial pour ajouter des messages HTML). P>

i Utilisé le serveur Gmail POP3 dans ce cas, mais cela devrait également fonctionner pour IMAP. P>

import poplib, email, string

mailserver = poplib.POP3_SSL('pop.gmail.com')
mailserver.user('recent:YOURUSERNAME') #use 'recent mode'
mailserver.pass_('YOURPASSWORD') #consider not storing in plaintext!

numMessages = len(mailserver.list()[1])
for i in reversed(range(numMessages)):
    message = ""
    msg = mailserver.retr(i+1)
    str = string.join(msg[1], "\n")
    mail = email.message_from_string(str)

    message += "From: " + mail["From"] + "\n"
    message += "Subject: " + mail["Subject"] + "\n"
    message += "Date: " + mail["Date"] + "\n"

    for part in mail.walk():
        if part.is_multipart():
            continue
        if part.get_content_type() == 'text/plain':
            body = "\n" + part.get_payload() + "\n"
        dtypes = part.get_params(None, 'Content-Disposition')
        if not dtypes:
            if part.get_content_type() == 'text/plain':
                continue
            ctypes = part.get_params()
            if not ctypes:
                continue
            for key,val in ctypes:
                if key.lower() == 'name':
                    message += "Attachment:" + val + "\n"
                    break
            else:
                continue
        else:
            attachment,filename = None,None
            for key,val in dtypes:
                key = key.lower()
                if key == 'filename':
                    filename = val
                if key == 'attachment':
                    attachment = 1
            if not attachment:
                continue
            message += "Attachment:" + filename + "\n"
        if body:
            message += body + "\n"
    print message
    print


1 commentaires

POPLIB.RETR () Télécharge tout le message.



2
votes

Vous pouvez obtenir uniquement le texte brut de l'e-mail en faisant quelque chose comme: xxx

pour les messages Gmail que j'ai vus, la section 1 a le clairext, y compris la malbouffe de Multipart. Cela peut ne pas être si robuste.

Je ne sais pas comment obtenir le nom de la pièce jointe sans tout cela. Je n'ai pas essayé d'utiliser des partiels.


0 commentaires