lunes, 2 de abril de 2012

Recepción de correo en Python por IMAP

En la entrada de blog anterior se explicó como realizar envíos de correo de forma automática a través de un script en Python. En este caso, voy a explicar en qué consiste el protocolo IMAP (Internet Message Access Protocol), y mostraré un ejemplo de acceso a la cuenta de correo, búsqueda de un mensaje en la bandeja de entrada e imprimirlo en la pantalla de la consola.

El protocolo IMAP permite acceder a mensajes de correo electrónico que se encuentran almacenados en un servidor. A diferencia del protocolo POP, el cual también es usado para acceder a mensajes de correo electrónico de un servidor, permite especificar carpetas, y visualizar los mensajes sin necesidad de descargarlos, como en el caso de POP.

El protocolo IMAP generalmente es escuchado por el servidor en el puerto 143.

Código ejemplo

En el código que se muestra a continuación se hace uso de la librería imaplib de Python, la cual permite conectarse a un servidor IMAP (para este caso el de Gmail), e incluye funciones para búsqueda y recuperación de mensajes recibidos.

En este caso, el programa ejemplo se autenticará a una cuenta de Gmail, se dirigirá a la bandeja de entrada, y buscará los mensajes que contengan en el campo “Asunto”, la cadena que se asigne a la variable string_busqueda. Finalmente, contará los mensajes que cumplen con el criterio de búsqueda, e imprimirá el más reciente en la consola.

Se debe tener en cuenta que si el mensaje contiene imágenes o archivos adjuntos, se mostrará el binario de los mismos, representado en caracteres. Adicionalmente, se imprimirán encabezados y otra información de los mensajes, la cual generalmente no se muestra en los aplicativos Web para acceso al correo.


# vim: set fileencoding=utf-8 :

# Importación de librerías
import imaplib
import email

# Conexión a la cuenta de correo
mail = imaplib.IMAP4_SSL('imap.gmail.com') # Servidor IMAP de GMAIL
mail.login('pepito.perez', 'passxxx')    # Usuario y contraseña

# Lista mensajes de correo electrónico
mail.list()

# Selección de bandeja de entrada por defecto
mail.select()

# String de búsqueda
string_busqueda="Informe"

# Búsqueda de mensajes con el anterior criterio en el campo "Asunto"
typ, resBusq = mail.search(None, '(ALL SUBJECT "' + string_busqueda + '")')

# Se muestran resultados de la búsqueda
if resBusq[0] == '':
  print 'No se encontraron mensajes con la cadena "%s" en asunto' % (string_busqueda)
else:
  resBusq = resBusq[0].split(' ')
  print 'Se encontraron %s mensajes con la cadena "%s" en asunto' % (len(resBusq), string_busqueda)

# Se recupera el mensaje más reciente que cumpla con el criterio de búsqueda
typ, data = mail.fetch(resBusq[-1], '(RFC822)')

# Se convierte el mensaje de String a mensaje de la clase email
msg = email.message_from_string(data[0][1])

# Se imprime en pantalla el mensaje
print msg

# Cierra sesión en la cuenta de correo
mail.logout()

2 comentarios:

  1. En esta linea
    resBusq = resBusq[0].split(' ')
    me produce este error
    a bytes-like object is required, not 'str'

    ResponderEliminar
  2. resBusq = resBusq[0].split()

    ResponderEliminar