Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Obtención del componente "text/plain", limpio, en mensajes de correo electrónico

Última Actualización: 12 de Agosto de 2004 - Jueves

Aunque entre los usuarios experimentados está mal visto, se considera un crimen en la mayoría de las listas de correo electrónico/news, ocasiona infinidad de problemas para los sistemas automatizados, y triplican (o más aún) el tamaño de los mensajes de correo electrónico, lo cierto es que hoy en día buena parte de los usuarios envían sus mensajes en formato HTML. Lo que muchas personas no saben es que, salvo SPAM y similar, los clientes de correo electrónico acostumbran a enviar dos versiones del texto, una en texto "plano" y otra como HTML, y el cliente de correo receptor elige una representación u otra según su conveniencia. Así pues, lo que se propone con esta pequeña utilidad es disponer de una herramienta que analice un mensaje de correo electrónico y devuelva exclusivamente el componente "text/plain", haciendo frente también a la presencia de ficheros adjuntos, imágenes, etc. El procedimiento realmente es muy sencillo:

  • Si el mensaje no es MIME, el cuerpo es directamente "text/plain", que es el tipo por defecto en el correo electrónico.

  • Si el mensaje es MIME:

    • Si el mensaje consta de un único componente, comprobamos que sea "text/plain" y lo decodificamos si es preciso (base64, "quoted-printable").

    • Si el mensaje consta de varios componentes, rastreamos los componentes de primer nivel, buscando dos tipos de objetos:

      • Si alguno de los componentes es "text/plain", lo decodificamos si es preciso (base64, "quoted-printable") y terminamos.

      • Si alguno de los componentes es "multipart/alternative", nos introducimos dentro de ese componente, buscando un componente "text/plain". Si lo encontramos, lo decodificamos si es preciso (base64, "quoted-printable") y terminamos.

Es importante rastrear exclusivamente los componentes MIME de primer nivel del mensaje, ya que no nos interesa analizar archivos adjuntos, mensajes adjuntos, etc.

El código fuente que implementa este proceso, escrito en Python (probado en Python 2.3.4), es el siguiente:

import email
import sys

def devuelve_el_plain(msg) :
  if not msg.is_multipart() :
    tipo=msg.get_type() or "text/plain"
    if tipo!="text/plain" :
      return "NO HAY COMPONENTE 'text/plain'\n\n"
    return msg.get_payload(decode=True)

  for i in msg.get_payload() :
    tipo=i.get_type()
    if tipo=="text/plain" :
      return i.get_payload(decode=True)
    elif tipo=="multipart/alternative" :
      for j in i.get_payload() :
        if j.get_type()=="text/plain" :
          return j.get_payload(decode=True)

  return "NO HAY COMPONENTE 'text/plain'\n\n"

a=open(sys.argv[1]).read()
msg=email.message_from_string(a)
print devuelve_el_plain(msg)
ATENCIÓN: Esta limpieza de correo, si se hace como frontal para un sistema automático, debe hacerse después de procesar cosas como los rebotes de correo, cuyo tipo MIME es "multipart/report", y análisis similares.


Historia

  • 12/Ago/04: Primera versión de esta página.



Python Zope ©2004 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS