2010-11-01 10 views
18

J'ai un objet de message en plusieurs parties et je souhaite convertir la pièce jointe dans ce message en objet de fichier python. Est-ce possible? Si c'est possible, quelle méthode ou classe en Python je devrais regarder pour faire une telle tâche?Obtention de la pièce jointe à un objet fichier python

+0

Quelle partie de la bibliothèque Python avez-vous lu jusqu'à présent? Avez-vous regardé les bibliothèques pop ou imap? –

+0

J'ai seulement regarder dans email.message.Message et mimetools.Message. Ok, je vais lire dans la pop et l'image et voir ce que je peux faire avec. –

Répondre

47

Je ne comprends pas vraiment ce que vous entendez par "objet de message multipart email". Voulez-vous dire un objet appartenant à la classe email.message.Message?

Si c'est ce que vous voulez dire, c'est simple. Dans un message multipartie, la méthode get_payload renvoie une liste de parties de message (chacune étant elle-même un objet Message). Vous pouvez itérer sur ces parties et examiner leurs propriétés: par exemple, la méthode get_content_type renvoie le type MIME de la pièce et la méthode get_filename renvoie le nom de fichier de la pièce (s'il en est spécifié dans le message). Ensuite, lorsque vous avez trouvé la bonne partie du message, vous pouvez appeler le get_payload(decode=True) pour obtenir le contenu décodé.

>>> import email 
>>> msg = email.message_from_file(open('message.txt')) 
>>> len(msg.get_payload()) 
2 
>>> attachment = msg.get_payload()[1] 
>>> attachment.get_content_type() 
'image/png' 
>>> open('attachment.png', 'wb').write(attachment.get_payload(decode=True)) 

Si vous extraire des pièces jointes de programmation des messages électroniques que vous avez reçus, vous voudrez peut-être prendre des précautions contre les virus et les chevaux de Troie. En particulier, vous devriez probablement seulement extraire les pièces jointes dont vous connaissez les types MIME, et vous voudrez probablement choisir votre propre nom de fichier, ou au moins nettoyer la sortie de get_filename.

+0

Cela fonctionne très bien. Merci. –

+1

Les messages HTML contiennent souvent des images dans les pieds de page, qui sont également envoyés en pièce jointe. Vous pouvez les distinguer des "vrais" attachements en regardant la disposition du contenu: les images en ligne commencent par "en ligne", tandis que les pièces jointes commencent par "pièce jointe". Il n'y a pas de méthode pour obtenir la disposition du contenu, mais vous pouvez appeler part.get ('Content-Disposition'). Startswith ('attachment') si vous êtes uniquement intéressé par les pièces jointes. – jrial

9

Voici la solution de travail, les messages sont sous forme serveur IMAP

self.imap.select() 
typ, data = self.imap.uid('SEARCH', 'ALL') 
msgs = data[0].split() 
print "Found {0} msgs".format(len(msgs)) 

for uid in msgs: 
    typ, s = self.imap.uid('FETCH', uid, '(RFC822)') 
    mail = email.message_from_string(s[0][1]) 

    print "From: {0}, Subject: {1}, Date: {2}\n".format(mail["From"], mail["Subject"], mail["Date"]) 

    if mail.is_multipart(): 
     print 'multipart' 
     for part in mail.walk(): 
      ctype = part.get_content_type() 
      if ctype in ['image/jpeg', 'image/png']: 
       open(part.get_filename(), 'wb').write(part.get_payload(decode=True))