2009-08-20 6 views
3

J'utilise python pour ouvrir un e-mail sur le serveur (POP3). Chaque email a une pièce jointe qui est un email transmis lui-même.Extraction de l'en-tête To: à partir d'une pièce jointe d'un e-mail

J'ai besoin d'obtenir l'adresse "To:" hors de la pièce jointe. J'utilise python pour essayer de m'aider à apprendre la langue et je ne suis pas encore très bon!

Le code que j'ai est déjà ce

import poplib, email, mimetypes 

    oPop = poplib.POP3('xx.xxx.xx.xx') 
    oPop.user('[email protected]') 
    oPop.pass_('xxxxxx') 

    (iNumMessages, iTotalSize) = oPop.stat() 

    for thisNum in range(1, iNumMessages + 1): 
      (server_msg, body, octets) = oPop.retr(thisNum) 
      sMail = "\n".join(body) 

      oMsg = email.message_from_string(sMail) 

      # now what ?? 

Je comprends que j'ai l'e-mail comme une instance de la classe e-mail, mais je ne sais pas comment se rendre à l'attachement

Je sais cela en utilisant

sData = 'To' 
     if sData in oMsg: 
     print sData + "", oMsg[sData] 

obtient l'en-tête 'To:' du message principal mais comment puis-je obtenir cela de la pièce jointe?

J'ai essayé

for part in oMsg.walk(): 
    oAttach = part.get_payload(1) 

Mais je ne suis pas sûr de ce qu'il faut faire avec l'objet oAttach. J'ai essayé de le transformer en une chaîne et ensuite le passer à

oMsgAttach = email.message_from_string(oAttach) 

Mais cela ne fait rien. Je suis un peu dépassée par les docs python et j'ai besoin d'aide. Merci d'avance.

+0

Quel client de messagerie envoie l'e-mail? – codeape

+0

@codeape - Je ne sais pas. Les courriels proviennent de yahoo et hotmail et les pièces jointes sont les courriels d'origine envoyés à partir des listes de diffusion auxquelles les gens se sont abonnés, puis se sont plaints à yahoo et à hotmail. Ceci est une tentative d'automatisation des listes de suppression – 32423hjh32423

+0

Quelle était votre solution? Cela n'a jamais été mis à jour avec la réponse. –

Répondre

1

Sans avoir un email représentatif dans ma boîte de réception, il est difficile de travailler avec celui-ci (je n'ai jamais utilisé poplib). Cela dit, certaines choses qui pourraient aider de mon peu de l'enquête:

tout d'abord, faire beaucoup d'utilisation de l'interface de ligne de commande pour python et les fonctions dir() et help(): ceux-ci peuvent vous dire beaucoup de choses sur ce qui vient en dehors. Vous pouvez toujours insérer help(oAttach), dir(oAttach) et print oAttach dans votre code pour vous faire une idée de ce qui se passe en boucle. Si vous le saisissez ligne par ligne dans l'interface de ligne de commande, c'est encore plus simple dans ce cas.

Ce que je pense que vous devez faire est de parcourir chaque pièce jointe et de déterminer ce que c'est. Pour une pièce jointe classique, il est probablement base64 codé, donc quelque chose comme cela pourrait aider:

#!/usr/bin/python 
import poplib, email, mimetypes 

# Do everything you've done in the first code block of your question 
# ... 
# ... 

import base64 
for part in oMsg.walk(): 
    # I've removed the '1' from the argument as I think you always get the 
    # the first entry (in my test, it was the third iteration that did it). 
    # However, I could be wrong... 
    oAttach = part.get_payload() 
    # Decode the base64 encoded attachment 
    oContent = b64decode(oAttach) 
    # then maybe...? 
    oMsgAttach = email.message_from_string(oContent) 

Notez que vous avez probablement besoin de vérifier oAttach dans chaque cas pour vérifier qu'il ressemble à un message. Lorsque vous avez votre variable sMail, imprimez-la à l'écran. Ensuite, vous pouvez chercher quelque chose comme Content-Transfer-Encoding: base64 là-dedans, ce qui vous donnera une idée de la façon dont la pièce jointe est encodée. Comme je l'ai dit, je n'ai utilisé aucun des modules poplib, e-mail ou mimetypes, donc je ne suis pas sûr que cela puisse vous aider, mais je pensais que cela pourrait vous orienter dans la bonne direction.

+0

Merci pour cela, ça m'a aidé. Je l'ai réglé maintenant. Je posterai la solution sur mon blog et je l'ajouterai bientôt ici – 32423hjh32423

Questions connexes