2010-02-07 19 views
6

Estoy tratando de hacer un programa de Python que recupera solo el texto del cuerpo de un correo electrónico sin pasar encabezados o cualquier otro parámetro. No estoy seguro de cómo hacerlo.Python: Recuperando solo el texto del mensaje POP3, sin encabezados

El objetivo es poder enviar comandos básicos a un programa a través del texto del mensaje.

Lo que tenemos ahora es la siguiente:

import poplib 

host = "pop.gmail.com" 
mail = poplib.POP3_SSL(host) 
print mail.getwelcome() 
print mail.user("user") 
print mail.pass_("pass") 
print mail.stat() 
print mail.list() 
print "" 

if mail.stat()[1] > 0: 
    print "You have new mail." 
else: 
    print "No new mail." 

print "" 

numMessages = len(mail.list()[1]) 
for i in range(numMessages): 
    for j in mail.retr(i+1)[1]: 
     print j 

mail.quit() 
input("Press any key to continue.") 

que es todo bien, excepto cuando se ejecuta "J impresión" se imprime el mensaje completo, incluyendo las cabeceras. Solo quiero extraer el texto del cuerpo sin ningún tipo de basura adicional.

¿Alguien puede ayudar? ¡Gracias!

+1

WOW! ¿Eso es todo lo que se necesita para descargar el correo electrónico en Python? He estado intentando hacer esto en C# durante meses. ¡Y ninguno de los componentes de terceros funciona en C#! ........ No conozco Python, pero recuerdo haber visto el mismo problema en alguna parte, estoy buscando el sitio web ahora y si aún puedo encontrarlo , publique la solución de personas aquí para usted ... si han encontrado la solución –

+0

Python hace que todo parezca una tarea trivial;) – Ospho

Respuesta

3

Este es un fragmento de código de mi propio lector de POP3:

 response, lines, bytes = pop.retr(m) 

     # remove trailing blank lines from message 
     while lines[-1]=="": 
      del lines[-1] 

     try: 
      endOfHeader = lines.index('') 
      header = lines[:endOfHeader] 
      body = lines[endOfHeader+1:] 
     except ValueError: 
      header = lines 
      body = [] 

Este teclas fuera de la primera línea vacía en la lista de todas las líneas que el final de la información de la cabecera. Luego, simplemente haz una lista desde allí hasta el final para el cuerpo del mensaje.

+0

¡Gracias por la ayuda! Aunque estoy teniendo un pequeño problema. ¿Qué representa m en pop.retr (m)? Se trata de arrojar errores y no sé qué poner allí, o si esta rutina debe residir en un submarino específico. – mplewis

+0

'pop.retr (m)' en mi código es análogo a 'mail.retr (i + 1)' en su código - m es el número de mensaje, y es un número entero. Mira cómo descomprimo la tupla devuelta por retr, mientras solo tomas el elemento [1] th? En tu código, simplemente itera sobre líneas hasta que toques una cadena vacía, o te quedas sin líneas. El resto es el cuerpo. – PaulMcG

5

me gustaría utilizar correo electrónico módulo para conseguir el cuerpo del mensaje de correo electrónico con get_payload() método que omite información de la cabecera.

he añadido unas líneas a su código (que están marcados con # new statement al final de la línea)

import poplib 
import email # new statement 

host = "pop.gmail.com" 
mail = poplib.POP3_SSL(host) 
print mail.getwelcome() 
print mail.user("user") 
print mail.pass_("pass") 
print mail.stat() 
print mail.list() 
print "" 

if mail.stat()[1] > 0: 
    print "You have new mail." 
else: 
    print "No new mail." 

print "" 

numMessages = len(mail.list()[1]) 
for i in range(numMessages): 
    for j in mail.retr(i+1)[1]: 
     #print j 
     msg = email.message_from_string(j) # new statement 
     print(msg.get_payload()) # new statement 

mail.quit() 
input("Press any key to continue.") 
+0

obtengo el error 'TypeError: initial_value debe ser str o None, not bytes' cuando intento usar su línea msg = email.message_from_string (j) –

+0

@Tintinabulator Zea - Esto debería suceder porque está usando ** Python3 **. Use 'msg = email.message_from_bytes (j)' en lugar de 'msg = email.message_from_string (j)'. Consulte [Problema de análisis de correo electrónico de Python] (https://stackoverflow.com/questions/19508393/python-email-parsing-issue/19508543) también. –

Cuestiones relacionadas