Cómo recibir correo usando python

Me gustaría recibir un correo electrónico utilizando python. Hasta ahora he podido obtener el sujeto pero no el cuerpo. Aquí está el código que he estado usando:

import poplib from email import parser pop_conn = poplib.POP3_SSL('pop.gmail.com') pop_conn.user('myusername') pop_conn.pass_('mypassword') #Get messages from server: messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)] # Concat message pieces: messages = ["\n".join(mssg[1]) for mssg in messages] #Parse message intom an email object: messages = [parser.Parser().parsestr(mssg) for mssg in messages] for message in messages: print message['subject'] print message['body'] pop_conn.quit() 

Mi problema es que cuando ejecuto este código, devuelve correctamente el Asunto pero no el cuerpo. Entonces, si envío un correo electrónico con el asunto “Probador” y el cuerpo “Este es un mensaje de prueba”, se ve así en IDLE.

 >>>>Tester >>>>None 

Entonces, parece que está evaluando con precisión el tema pero no el cuerpo, creo que está en el método de análisis, ¿no? El problema es que no sé lo suficiente sobre estas bibliotecas para descubrir cómo cambiarlas para que devuelva tanto un tema como un cuerpo.

El mensaje de objeto no tiene un cuerpo, tendrá que analizar las múltiples partes, como esto:

 for part in message.walk(): if part.get_content_type(): body = part.get_payload(decode=True) 

La función walk() itera primero la profundidad a través de las partes del correo electrónico, y usted está buscando las partes que tienen un tipo de contenido. Los tipos de contenido pueden ser text/plain o text/html , y algunas veces un correo electrónico puede contener ambos (si el tipo de mensaje está configurado como multipart/alternative ).

El analizador de correo electrónico devuelve un objeto email.message.Message , que no contiene una clave de body , como verá si ejecuta

 print message.keys() 

Lo que quieres es el método get_payload() :

 for message in messages: print message['subject'] print message.get_payload() pop_conn.quit() 

Pero esto se complica cuando se trata de mensajes de varias partes; get_payload() devuelve una lista de partes, cada una de las cuales es un objeto de Message . Puede obtener una parte particular del mensaje de get_payload(i) utilizando get_payload(i) , que devuelve la parte i , genera un IndexError si i está fuera del rango, o genera un TypeError si el mensaje no es multiparte.

Como lo señala Gustavo Costa De Oliveir, puede utilizar el método walk() para ordenar las partes: realiza un recorrido primero en profundidad de las partes y partes del mensaje.

Para obtener más información sobre el módulo email.parser , email.parser http://docs.python.org/library/email.message.html#email.message.Message .

También es bueno que los datos de retorno en la encoding correcta en el mensaje contengan contenido multilingüe.

charset = part.get_content_charset() content = part.get_payload(decode=True) content = content.decode(charset).encode('utf-8')
charset = part.get_content_charset() content = part.get_payload(decode=True) content = content.decode(charset).encode('utf-8') 

Si quieres usar IMAP4. Utilice la biblioteca de Outlook Python, descargue aquí: https://github.com/awangga/outlook para recuperar el correo electrónico no leído de su bandeja de entrada:

 import outlook mail = outlook.Outlook() mail.login('emailaccount@live.com','yourpassword') mail.inbox() print mail.unread() 

para recuperar el elemento de correo electrónico:

 print mail.mailbody() print mail.mailsubject() print mail.mailfrom() print mail.mailto()