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. P>
3 Réponses :
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. P>
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
POPLIB.RETR () CODE>
Télécharge tout le message.
Vous pouvez obtenir uniquement le texte brut de l'e-mail en faisant quelque chose comme: 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. P> 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. P> p>