2011-06-30 2 views
4

J'essaie d'accéder au serveur de messagerie POP3. Je vais interroger les messages et télécharger les pièces jointes pour chacun d'entre eux. Je peux me connecter avec succès et recevoir les messages, mais je n'arrive pas à comprendre comment obtenir la pièce jointe, ce que je devrai analyser plus tard. Je pense que je pourrais enregistrer dans tmp dir jusqu'à ce que je le traite.python poplib obtenir la pièce jointe

Voici ce que je suis arrivé à ce jour:

pop = poplib.POP3_SSL(server) 
pop.user(usr) 
pop.pass_(pwd) 

f = open(file_dir, 'w') 
num_msgs = len(pop.list()[1]) 
for msg_list in range(num_msgs): 
    for msg in pop.retr(msg_list+1)[1]: 
     mail = email.message_from_string(msg) 
     for part in mail.walk(): 
      f.write(part.get_payload(decode=True)) 
f.close() 

C'est un code que je Rassemblé des exemples que j'ai trouvé en ligne, mais aucun exemple solide d'obtenir effectivement la pièce jointe. Le fichier auquel j'écris est vide. Qu'est-ce qui me manque ici? Merci dans une avance.

+0

Je suis curieux de savoir si vous avez trouvé la réponse à votre problème? – bogeymin

+0

@bogeymin J'ai trouvé la réponse. Si vous en avez besoin je peux déterrer le fichier pour vous :) – t0x13

+0

Je connaissais la réponse, et je l'aurais ajoutée ici si vous n'aviez pas trouvé le problème. Mais la question était ancienne, donc je ne savais pas si elle avait besoin d'une réponse. – bogeymin

Répondre

2

Je sais que c'est une vieille question, mais juste au cas où: La valeur que vous transmettez à email.message_from_string est en fait une liste du contenu de l'email, où chaque élément est une ligne. Vous devez le joindre pour obtenir une représentation sous forme de chaîne de cet e-mail:

mail = email.message_from_string("".join(msg)) 
1

Veuillez voir un exemple complet ci-dessous.

Importation poplib et analyseur

import poplib from email import parser

Une fonction pour retourner une connexion au serveur pop:

def mail_connection(server='pop.mymailserver.com'): 
    pop_conn = poplib.POP3(server) 
    pop_conn.user('[email protected]') 
    pop_conn.pass_('password') 
    return pop_conn 

Une fonction pour aller chercher le courrier:

def fetch_mail(delete_after=False): 
    pop_conn = mail_connection() 
    messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)] 
    messages = ["\n".join(mssg[1]) for mssg in messages] 
    messages = [parser.Parser().parsestr(mssg) for mssg in messages] 
    if delete_after == True: 
     delete_messages = [pop_conn.dele(i) for i in range(1, len(pop_conn.list()[1]) + 1)] 
    pop_conn.quit() 
    return messages 

Ensuite, une fonction pour enregistrer les pièces jointes en tant que fichiers. NB, le allowed mimetypes; vous pourriez avoir une liste d'entre eux, tels que:

allowed_mimetypes = ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"] 

et ainsi de suite.

def get_attachments(): 
    messages = fetch_mail() 
    attachments = [] 
    for msg in messages: 
     for part in msg.walk(): 
      if part.get_content_type() in allowed_mimetypes: 
       name = part.get_filename() 
       data = part.get_payload(decode=True) 
       f = file(name,'wb') 
       f.write(data) 
       f.close() 
       attachments.append(name) 
    return attachments 
+0

Bonjour. Une question - dans la ligne messages = [parser.Parser(). Parsestr (mssg) pour mssg dans les messages], d'où obtenez-vous parser.Parser()? Ce n'est pas dans l'analyseur de module stdlib. –

+1

@Pawel - from email import parser – Ominus

+0

@Ominus Merci, c'est celui-là. – torrange