2010-02-20 29 views
7

Estoy jugando con Python imaplib (Python 2.6) para recuperar correos de GMail. Todo lo que obtengo es un correo electrónico con el método http://docs.python.org/library/imaplib.html#imaplib.IMAP4.fetch Recibo un correo electrónico completo. Solo necesito una parte de texto y también analizar los nombres de los archivos adjuntos, sin descargarlos. ¿Cómo se puede hacer esto? Veo que los correos electrónicos devueltos por GMail siguen el mismo formato que los navegadores envían a los servidores HTTP.Cómo analizar eficientemente correos electrónicos sin tocar archivos adjuntos usando Python

Respuesta

0

Me temo que estás de suerte. De acuerdo con this post, solo hay dos partes en el correo electrónico: el encabezado y el cuerpo. El cuerpo está donde están los archivos adjuntos si los hay y tienes que descargar todo el cuerpo antes de extraer solo el texto del mensaje. La información sobre el comando FETCH encontrado here también es compatible con esta opinión. Si bien dice que puedes extraer parciales del cuerpo, estos se especifican en términos de octetos, lo que realmente no ayuda.

+0

+1 gracias por los punteros. Haré más investigación sobre eso. – Viet

5

Echa un vistazo a esta receta: http://code.activestate.com/recipes/498189/

adapté un poco para imprimir el De, Asunto, Fecha, nombre de los archivos adjuntos y el cuerpo del mensaje (solo texto plano por ahora - su trivial para agregar mensajes HTML) .

Usé el servidor Gmail pop3 en este caso, pero también debería funcionar para IMAP.

import poplib, email, string 

mailserver = poplib.POP3_SSL('pop.gmail.com') 
mailserver.user('recent:YOURUSERNAME') #use 'recent mode' 
mailserver.pass_('YOURPASSWORD') #consider not storing in plaintext! 

numMessages = len(mailserver.list()[1]) 
for i in reversed(range(numMessages)): 
    message = "" 
    msg = mailserver.retr(i+1) 
    str = string.join(msg[1], "\n") 
    mail = email.message_from_string(str) 

    message += "From: " + mail["From"] + "\n" 
    message += "Subject: " + mail["Subject"] + "\n" 
    message += "Date: " + mail["Date"] + "\n" 

    for part in mail.walk(): 
     if part.is_multipart(): 
      continue 
     if part.get_content_type() == 'text/plain': 
      body = "\n" + part.get_payload() + "\n" 
     dtypes = part.get_params(None, 'Content-Disposition') 
     if not dtypes: 
      if part.get_content_type() == 'text/plain': 
       continue 
      ctypes = part.get_params() 
      if not ctypes: 
       continue 
      for key,val in ctypes: 
       if key.lower() == 'name': 
        message += "Attachment:" + val + "\n" 
        break 
      else: 
       continue 
     else: 
      attachment,filename = None,None 
      for key,val in dtypes: 
       key = key.lower() 
       if key == 'filename': 
        filename = val 
       if key == 'attachment': 
        attachment = 1 
      if not attachment: 
       continue 
      message += "Attachment:" + filename + "\n" 
     if body: 
      message += body + "\n" 
    print message 
    print 

Esto debería ser suficiente para conseguir que va en la dirección correcta.

+0

+1 ¡gracias! ¡Es genial ver el código de muestra! – Viet

+1

['poplib.retr()'] (http://docs.python.org/library/poplib.html#poplib.POP3.retr) descarga el mensaje completo. – Harvey

2

Usted puede obtener sólo el texto del correo electrónico haciendo algo como:

connection.fetch(id, '(BODY[1])') 

Para los mensajes de Gmail que he visto, apartado 1 tiene el texto completo, incluyendo la chatarra de varias partes. Esto puede no ser tan robusto.

No sé cómo obtener el nombre del archivo adjunto sin todo. No he intentado usar parciales.

Cuestiones relacionadas