martes, agosto 05, 2014

Gestionar el buzón de Gmail con comandos IMAP (1 de 4)

Anda por mi cabeza arrancar un proyecto con Gmail, así que estos días he andado jugando con el protocolo IMAP en GMail. Ya os contaré más adelante en qué ando pensando, pero mientras tanto, como este blog siempre fue mi cuaderno personal de anotaciones, he querido hacer esta serie de artículos para que no se me olvide lo que he aprendido, y si así sucede, siempre pueda volver a leerme este artículo. Espero que a alguno de vosotros os venga también de utilidad en algún momento.

Una introducción a IMAP

El protocolo IMAP (Internet Messsage Application Protocol) es un protocolo de acceso a un servidor de mensajes. Entre otras cosas, y recalco lo de entre otras cosas, sirve para cumplir las funciones de un protocolo de acceso al buzón de correo electrónico, como podría ser POP3 (Post-Office Protocol version 3), pero realmente no tiene porque estar ligado al correo electrónico, aunque sí al concepto de mensajes.

Algunas aplicaciones y servidores implementan IMAP como forma de trabajo con documentos, que pueden ser archivos ofimáticos, binarios o citas de agendas. Al final, un mensaje puede ser casi cualquier cosa y hasta un correo electrónico.

A diferencia de POP3, con IMAP se pueden subir mensajes al servidor, con lo que la gestión del buzón es mucho más completa. Por ejemplo, alguien podría usar una aplicación cliente para gestionar su buzón de correo electrónico con IMAP y hacer un borrador, ese borrador de correo electrónico, aún sin destinatario, podría ser subido al buzón a una carpeta borradores y guardarse allí. Algo como eso, con POP3 no es posible realizarlo.

Conexión al buzón de GMAIL con IMAP

El acceso al buzón de Gmail se puede hacer con una conexión IMAP en modo comandos, lo que permitiría controlar en todo momento lo que se quiere hacer con los mensajes. El servidor IMAP de Gmail se encuentra en imap.gmail.com y utiliza un túnel SSL para conectarse. Su puerto de conexión es el 993 y para establecer una conexión a él basta con hacer una conexión openssl con s_client. Eso sí, asegúrate de que tu cliente de OpenSSL está correctamente actualizado y parcheado contra HeartBleed.

Se debe utilizar el parámetro -connect para hacer la conexión -quiet si no se quiere ver toda la negociación y -crlf para no tener que preocuparse de escribir los caracteres de fin de línea y retorno de carro.

Figura 1: Conexión OpenSSL a servidor IMAP de Gmail

Una vez conectados al servidor IMAP podemos comenzar a escribir los comandos IMAP. La última RFC del protocolo es la RFC3501, del año 2003. Lo primero que se debería hacer es autenticarse, pero existen algunos comandos que se pueden utilizar sin conectarse, como por ejemplo negociar la autenticación. Para obtener un buen número de opciones e información del servidor, se puede usar el comando CAPABILITY.

Una cosa un poco curiosa con los comandos IMAP es que es necesario poner una etiqueta delante de cada comando para que el servidor conteste a esa etiqueta. La etiqueta puede ser cualquier cosa, pero una buena práctica es poner un etiqueta que te ayude a identificar la sesión y un número de comando secuencial, para que después en un log puedas moverte con más soltura. En el caso de Gmail, al invocar el comando CAPABILITY vemos muchas cosas, como que implementa la última versión de IMAP4rev1 o que se puede negociar una conexión en plano.

Figura 2: Resultados del comando IMAP Capability en Gmail

En mi caso, utilizo Google Authenticator - que aún no puedo poner Latch - en mi cuenta de Gmail como Segundo Factor de Autenticación, por lo que para conectarme a mi cuenta de correo electrónico desde un cliente pesado utilizo una contraseña de aplicación. Tanto si tienes un 2FA como si no, te recomiendo que, para cualquier cliente de correo electrónico que utilices, configures una contraseña de aplicación como se explica aquí.

Figura 3: Configuración de contraseñas de aplicación en Google

Al final, si te quitan esa contraseña no perderás toda tu cuenta Google, aunque sí que se tenga acceso a todo tu precioso correo electrónico temporalmente, hasta que le revoques el acceso.

Autenticarse contra el servidor IMAP

Para autenticarse en el servidor IMAP necesitas hacer un comando LOGIN, por supuesto etiquetado al principio, en el que pongas tu usuario y tu contraseña. Esto dará como resultado una conexión autenticada a tu servidor de mensajes IMAP4rev1 de Gmail.

Figura 4: Autenticando contra el servidor IMAP de Gmail

Para configurar una autenticación en texto plano, por si quisieras hacerlo en algún entorno de pruebas debes usar el comando AUTHENTICATE. Se me ocurre que podría ser útil probar si en un ataque con man in the middle contra un cliente que no verifique correctamente los certificados digitales podría robarse la contraseña al igual que pasaba con LDAP-s en algunas herramientas.

Primero es necesario generar el token de autenticación en plano, que será codificado en BASE64. Para ello hay que generar el BASE64(\0id_usuario\0passwd). Esto se puede hacer con muchas herramientas. Este es un ejemplo con una cuenta falsa.

Figura 5: Creando el token BASE64 para autenticar en PLAIN

Después se debe configurar el comando AUTHENTICATE PLAIN e introducir el token una vez que lo solicite el servidor, tal y como se ve en la siguiente imagen:

Figura 6: Autenticado en PLAIN contra el servidor IMAP de Gmail

Sea como fuere, negociado el sistema de autenticación, ahora estaríamos conectados y listos para comenzar a gestionar el contenido de nuestra cuenta en el servidor IMAP de Gmail utilizando toda la potencia de IMAP.

Folders, Subfolders, Separators y Namespaces

Ya estamos dentro, pero ahora hay que moverse, para lo que necesitamos primero entender un poco de la estructura en la que se organizan nuestros mensajes dentro del servidor. Para ello, hay que tener presentes los siguientes conceptos:
- Folder: Es un objeto contenedor de mensajes.
- Subfolder: Es un objeto contenedor de mensajes contenido dentro de un folder.
- Separator: Son los elementos que separan una carpeta de otra.
- Namespace: Es un grupo de carpetas que se hace para acotar la gestión de mensajes.
En todo momento hay que estar en una determinada ubicación, para lo que se utiliza el comando SELECT. Para gestionar una determina carpeta basta con hacer SELECT y el nombre. Lo más evidente es ir al INBOX y recibir una lista de los mensajes contenidos allí.

Figura 7: Seleccionando el buzón INBOX de Gmail vía IMAP

Como se puede ver, también se muestran los FLAGs que se utilizan en la gestión de los mensajes de esa carpeta, y los identificadores de los mensajes.

SEARCH y FETCH: Message ID y Message UID

Cada mensaje dentro de una carpeta cuenta con un identificador ID, pero dentro de todo el buzón completo cuenta con un identificador único que es el UID. Con este valor se le puede referenciar en cualquier momento para ver su contenido. Para ello podemos utilizar dos comandos que son SEARCH y FETCH. El primero busca dentro de la carpeta, buzón o namespace en busca de los ID o UID que cumplen el patrón.

El resultado, como se puede ver es una lista de números que apuntan directamente al mensaje. Si se quiere que se devuelvan siempre los UID, se debe poner delante del comando, justo después de la etiqueta que se vaya a utilizar en la invocación del mismo.

Figura 8: Búsqueda de correos en INBOX enviados por rodol@informatica64.com
en formato ID de INBOX y en formato UID

Para buscar se pueden utilizar muchos campos, desde FLAGS, remitentes, fechas, etcétera, etcétera. No pretendo contaros todos los comandos, así que si queréis aprender bien las opciones es momento de que juguéis un poco con vuestro buzón y la sintaxis del comando. Todas descritas en la RFC 3501.

Una vez que se tiene el ID o el UID, se puede utilizar FETCH o UID FETCH para obtener el contenido del mensaje. Para ello hay que especificar qué partes del mismo se quieren, por lo que deberás jugar con los nombres de los campos, filtros y etiquetas para sentirte cómodo con las opciones de recuperación de mensajes.

Figura 9: El ID 246 en INBOX corresponde al UID 2808 dentro del buzón

Hasta aquí por hoy. Sirva de introducción para que empieces a sentirte más o menos cómodo con los comandos básicos. Para salir, ya sabes un comando LOGOUT pero no te olvides de poner la etiqueta delante. Mañana más.

Saludos Malignos!

**********************************************************************************************
Gestionar el buzón de Gmail con comandos IMAP (1 de 4)
Gestionar el buzón de Gmail con comandos IMAP (2 de 4)
- Gestionar el buzón de Gmail con comandos IMAP (3 de 4)
- Gestionar el buzón de Gmail con comandos IMAP (4 de 4)
**********************************************************************************************

4 comentarios:

Anónimo dijo...

esto se ve muy bueno!! saludos

Anónimo dijo...

"Link to database cannot be established: SQLSTATE[28000] [1045] Access denied for user 'utibrq9a_admin2'@'localhost' (using password: YES)" al acceder al libro

Anónimo dijo...

1337 password!

Ángel dijo...

«Tanto si tienes un 2FA como si no, te recomiendo que, para cualquier cliente de correo electrónico que utilices, configures una contraseña de aplicación como se explica aquí.»

Ya me gustaría, pero como dice en la misma captura de pantalla que incluyes:
«Solo puedes crear una contraseña específica de la aplicación si te has registrado para realizar el proceso de verificación en dos pasos.»

Lo que no deja de ser una limitación arbitraria impuesta por Google: si quieres usar contraseñas de aplicación, te fuerzo a usar autenticación de doble factor.

Sí, la autenticación de doble factor requiere que haya contraseñas de aplicación (para uso por terceras aplicaciones), pero igualmente tienen utilidad incluso sin 2FA y no deberían restringirse.

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares