¿Cómo omito el procesamiento de los archivos adjuntos de un correo electrónico que es un archivo adjunto de un correo electrónico diferente

StackOverflow https://stackoverflow.com/questions/319896

Pregunta

usando jython

Tengo una situación en la que los correos electrónicos vienen con diferentes archivos adjuntos. Ciertos tipos de archivos proceso otros que ignoro y no escribo en el archivo. Estoy atrapado en una situación bastante desagradable, porque a veces las personas envían un correo electrónico como archivo adjunto, y ese correo electrónico adjunto tiene archivos adjuntos legales.

Lo que quiero hacer es omitir ese correo electrónico adjunto y todos sus archivos adjuntos.

usando python / jythons std email lib ¿cómo puedo hacer esto?


para hacerlo más claro

Necesito analizar un correo electrónico (llamado ROOT email), quiero obtener los archivos adjuntos de este correo electrónico usando jython. A continuación, se admiten ciertos archivos adjuntos, es decir .pdf .doc, etc. ahora sucede que los clientes envían un correo electrónico (correo ROOT) con otro mensaje de correo electrónico (correo electrónico CHILD) como archivo adjunto, y en el correo electrónico CHILD tiene archivos adjuntos .pdf y similares.

Lo que necesito es: deshacerme de los correos electrónicos de NIÑO adjuntos al correo electrónico ROOT Y los archivos adjuntos de correos electrónicos de NIÑO. Lo que sucede es que reviso todo el correo electrónico y solo analiza cada archivo adjunto, AMBOS archivos RAÍZ y archivos NIÑOS como si fueran archivos adjuntos ROOT.

No puedo tener esto. Solo estoy interesado en los archivos adjuntos ROOT que son legales, es decir .pdf .doc. xls .rtf .tif .tiff

Eso debería hacer por ahora, ¡tengo que correr para tomar un autobús! gracias!

¿Fue útil?

Solución

El problema con las sugerencias existentes es el método de caminar. Esto recursivamente, primero en profundidad, recorre todo el árbol, incluidos los niños.

Mire la fuente del método de caminata y adáptelo para omitir la parte recursiva. Una lectura superficial sugiere:

if msg.is_multipart():
    for part in msg.get_payload():
          """ Process message, but do not recurse """
          filename = part.get_filename()

Al leer los pydocs, get_payload debería devolver una lista de los mensajes de nivel superior, sin recurrir.

Otros consejos

¿Qué pasa con el ejemplo llamado " Aquí hay un ejemplo de cómo descomprimir un mensaje MIME como el de arriba, en un directorio de archivos " ;? Se ve cerca de lo que quieres.

import email
...
msg = email.message_from_file(fp)
...
for part in msg.walk():
    # multipart/* are just containers
    if part.get_content_maintype() == 'multipart':
        continue
    # Applications should really sanitize the given filename so that an
    # email message can't be used to overwrite important files
    filename = part.get_filename()
    if not filename:
        ext = mimetypes.guess_extension(part.get_content_type())
    ...

¿Has probado el método get_payload ([i [, decode]])? A diferencia de caminar, no está documentado para abrir archivos adjuntos de forma recursiva.

Entiendo que sus preguntas significan "Tengo que verificar todos los archivos adjuntos de un correo electrónico, pero si un archivo adjunto es también un correo electrónico, quiero ignorarlo". De cualquier manera, esta respuesta debería guiarlo por el camino correcto.

Lo que creo que quieres es mimetypes.guess_type () . Usar este método también es mucho mejor que simplemente comparar una lista de exenciones.

def check(self, msg):
    import mimetypes

    for part in msg.walk():
        if part.get_filename() is not None:
            filenames = [n for n in part.getaltnames() if n]
            for filename in filenames:
                type, enc = mimetypes.guess_type(filename)
                if type.startswith('message'):
                    print "This is an email and I want to ignore it."
                else:
                    print "I want to keep looking at this file."

Tenga en cuenta que si esto todavía se ve a través de correos electrónicos adjuntos, cámbielo a esto:

def check(self, msg):
    import mimetypes

    for part in msg.walk():
        filename = part.get_filename()
        if filename is not None:
            type, enc = mimetypes.guess_type(filename)
            if type.startswith('message'):
                print "This is an email and I want to ignore it."
            else:
                part_filenames = [n for n in part.getaltnames() if n]
                for part_filename in part_filenames:
                    print "I want to keep looking at this file."

Documentación de tipos MIME

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top