Leer correos de GMail desde una aplicación Node.js

Ayuda de GMail para activar POP3.

Para leer el correo, se suele usar el protocolo POP3. En Node.js existen varios paquetes que ayudan en la labor de implementar un cliente de correo:

2018-03-18: Primera prueba con node-poplib-yapc

El código se puede encontrar en el repo: brthr-email-reader

Probando con el código de prueba de la librería, y configurando dirección del servidor, nombre de usuario y contraseña correcta, tengo el siguiente error:

events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: [AUTH] Web login required: https://support.google.com/mail/answer/78754
    at Client.onData (/home/rchavarria/projects/brthr-email-reader/node_modules/node-poplib-yapc/main.js:97:10)
    at emitOne (events.js:116:13)
    at TLSSocket.emit (events.js:211:7)

Miro en el buzón de correo al que intento acceder, y hay un correo de Google. Debo permitir acceso a GMail desde aplicaciones no seguras. Incluyen un enlace a la configuración, así que es fácil.

SUCCESS!!

Conseguido!! Leo los mensajes del correo. Los recibo en orden cronológico inverso, el más antiguo primero.

Problema: la primera vez recibo todos los mensajes, pero ya no los vuelvo a recibir de nuevo. Solución: deshabilitar el acceso POP3 de GMail y volverlo a activar. Es muy pesado, pero bueno. Otra solución es enviarme un correo, de forma que recibiré solamente el nuevo mensaje. Menos pesado.

¿Qué propiedades tiene cada mensaje?

Después de conectar el cliente, con client.retrieveAll obtengo una lista con todos los mensajes nuevos (aquellos que no han sido obtenidos todavía). Pero pasa algo curioso. El primer elemento no es ningún mensaje. Obtengo un elemento más de los mensajes reales, es decir, si hay 3 mensajes nuevos, obtengo un array de 4 elementos. El primero lo tengo que ignorar, al menos por ahora.

Las propiedades son:

Las que parecen más interesantes son: messageId, headers (que contiene mucha información adicional), from y to (que son objetos en sí).

No veo nada de ficheros adjuntos, que sería interesante. Quizá los adjuntos viajen en las propiedades text o html.

2018-03-18: Leyendo correos con ficheros adjuntos

Aha!!! Un mail con ficheros adjuntos lleva otra propiedad nueva: attachments (quién me lo hubiera dicho).

¿Qué propiedades tiene esa propiedad?

En realidad es un array de objetos. Cada uno tiene las siguientes propiedades:

Bastante directo, y unas propiedades bastante lógicas. El mail de prueba contenía un fichero de texto plano como adjunto, pero el contenido del fichero, presente en content, parece que está en un buffer. Supongo que para que pueda contener también contenido binario (imágenes y tal)

Imprimiendo el contenido de un adjunto

Con un attachments[0].content.toString() tengo esto por consola:

Primera línea

Segunda

Tercera

Final-----

SUCCESS!!

Prueba conseguida

Por ahora me doy por satisfecho con esta prueba. ¿Qué he conseguido?

  1. Configurar GMail para leer correos en clientes externos a través de POP3
  2. Escribir un cliente POP3 que lee correos de GMail
  3. Saber la estructura de los correos leidos
  4. Leer ficheros adjuntos en los correos, y saber su estructura
  5. Imprimir por consola (o guardar en un fichero físico en local) los ficheros adjuntos de los correos recibidos

Siguientes pasos