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)
**********************************************************************************************