2010-11-01 18 views
18

Tengo un objeto de mensaje de correo electrónico multiparte, y quiero convertir el archivo adjunto en ese mensaje de correo electrónico en un objeto de archivo python. es posible? Si es posible, ¿qué método o clase en Python debería considerar para realizar tal tarea?Obtención de adjuntos de correo al objeto de archivo python

+0

¿Qué parte de la biblioteca de Python que han leído hasta ahora? ¿Has mirado las bibliotecas pop o imap en absoluto? –

+0

Solo me he fijado en email.message.Message y mimetools.Message. Ok, leeré pop y imail y veré qué puedo hacer con él. –

Respuesta

47

Realmente no entiendo lo que quiere decir con "objeto de mensaje multiparte de correo electrónico". ¿Te refieres a un objeto que pertenece a la clase email.message.Message?

Si eso es lo que quiere decir, es sencillo. En un mensaje multiparte, el método get_payload devuelve una lista de partes del mensaje (cada una de las cuales es en sí misma un objeto Message). Puede iterar sobre estas partes y examinar sus propiedades: por ejemplo, el método get_content_type devuelve el tipo MIME de la pieza y el método get_filename devuelve el nombre de archivo de la parte (si se especifica alguno en el mensaje). Luego, cuando encuentre la parte correcta del mensaje, puede llamar al get_payload(decode=True) para obtener los contenidos descodificados.

>>> 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 va a extraer mediante programación archivos adjuntos de mensajes de correo electrónico que ha recibido, es posible que desee tomar precauciones contra virus y troyanos. En particular, probablemente solo deba extraer archivos adjuntos cuyos tipos MIME sepa que son seguros, y probablemente desee elegir su propio nombre de archivo, o al menos desinfectar el resultado de get_filename.

+0

Esto funciona genial. Gracias. –

+1

Los correos HTML a menudo tienen imágenes en los pies de página, que también se envían como archivos adjuntos. Puede distinguir estos archivos adjuntos "reales" mirando la disposición del contenido: las imágenes en línea comienzan con "en línea", mientras que los archivos adjuntos reales comienzan con "datos adjuntos". No hay un método para obtener la disposición del contenido, pero puede llamar a part.get ('Content-Disposition'). Startswith ('attachment') si solo está interesado en los archivos adjuntos actuales. – jrial

9

aquí es solución de trabajo, los mensajes son formulario servidor 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)) 
Cuestiones relacionadas