Enviar correos electrónicos con NodeJs y MailJet

Implementa un sistema para enviar correos electrónicos con NodeJs y MailJet, el servicio cloud de mailing gratuito

En este artículo detallaré cómo dar de alta y conectar la plataforma Mailjet a un backend desarrollado con NodeJs.

MailJet proveedor de envio de correos online
MailJet proveedor de envio de correos online

Mantener al usuario informado en todo momento, puede resultar clave para el éxito de cualquier aplicación digital.

Sin embargo, en muchas ocasiones olvidamos que es necesario establecer canales de comunicación que vayan más allá de la app.

Por supuesto, el envío de correos electrónicos, es una de las opciones más usadas, y por lo tanto, algo que tenemos que tener en consideración.

Cuando un usuario genera un compromiso con nuestra solución digital, valora muy positivamente que se le informe de novedades de su interés a través de su correo electrónico.

Por eso, voy a dedicar este artículo a detallar cómo generar envíos de correos electrónicos mediante JavaScript y el servicio MailJet.

¿Qué es MailJet y porqué usar este servicio?

Antes de entrar en materia, es necesario explicar qué es MailJet y porqué es una opción interesante a la hora de realizar “mailing”.

Mailjet es un servicio de envío de correos electrónicos en la nube.

Una de las principales ventajas que ofrece Mailjet es la simplificación del proceso de envío, así como una interfaz amigable que ofrece información de las campañas realizadas.

Cualquier usuario puede programar envíos sin necesidad de tener conocimientos técnicos, a golpe de click.

Pero, ¿qué pasa si además de querer lanzar campañas de marketing, deseamos utilizar Mailjet para realizar comunicaciones vinculadas a nuestra aplicación?

Pues, en mi opinión, es precisamente allí donde más brilla este Saas.

Mailjet pone a disposición de los desarrolladores toda su infraestructura, para poder ser explotada mediante su API.

Tal y como veremos a continuación, dar de alta el servicio, y conectarlo a nuestro backend Node no podría resultar más sencillo.

Por si todo esto fuera poco, Mailjet ofrece un plan gratuito que permite enviar hasta 6000 emails al mes sin coste alguno.

https://www.mailjet.com/es/tarifas/

Alta y configuración del servicio de Mailjet

Mi intención es ofrecer una guía paso a paso, así que en los próximos apartados detallaré los puntos a seguir para realizar el proceso de alta y configuración del servicio.

Siéntete libre de saltar a la parte técnica si lo deseas, aunque te recomiendo seguir leyendo si no estás familiarizado con la configuración de DNS y el firmado DKIM.

En primer lugar, accedemos a la página oficial de Mailjet y creamos un registro nuevo.

https://www.mailjet.com/

Registro Mailjet
Registro Mailjet

Dar de alta el usuario no tiene mayor misterio, una vez completado el registro dispondremos de una interfaz de bienvenida, parecida a esta.

Dashboard Mailjet
Dashboard Mailjet

A partir de aquí, es donde las cosas se ponen interesantes, técnicamente hablando.

Vinculación con un dominio personalizado

Para enviar correos a través de este servicio, es preciso disponer de un dominio propio, así como de una dirección de correo que actúe de “sender”.

Omitiré el proceso de contratación de un nuevo dominio, para evitar que éste tutorial sea demasiado largo.

Existen múltiples proveedores de dominios y hostings, de modo que te recomiendo que compares precios y prestaciones, antes de contratar uno.

Yo usaré el dominio de libreriasjs.com para ilustrar esta guía, concretamente, mi intención es dar de alta el correo “no-reply@libreriasjs.com”.

Los correos de tipo “no-reply” suelen asociarse a comunicaciones de las que no se espera respuesta por parte del destinatario.

Seguimos pues con la configuración del dominio y el “sender”.

Accedemos a la sección “Account settings” y hacemos click en “Add a Sender Domain or Address”.

Añadimos un dominio nuevo con una etiqueta, en mi caso, libreriasjs.com

Añadir un nuevo dominio
Añadir un nuevo dominio

Tras incluir el nuevo dominio, veremos que su estatus aparece como “pendiente”.

Estado de validación de dominio pendiente

Para que Mailjet pueda enviar correos asociados a un determinado dominio, es necesario validar la propiedad de dicho dominio.

Y precisamente esto es lo que vamos a hacer a continuación.

Seleccionamos la opción “Validate” dentro del menú en el icono de la rueda dentada.

En función del tipo de hosting que tengamos asociado al dominio, podremos activar la validación automática o no.

En mi caso, validaré el dominio mediante la creación de un registro DNS nuevo de tipo TXT.

Opciones de validación del dominio
Opciones de validación del dominio

Agregar un nuevo registro DNS de tipo TXT es relativamente sencillo. 

Solo debes acceder a tu proveedor de hosting, y buscar el apartado de edición de zonas DNS.

Una vez allí encontrarás un listado de registros, y la opción de incluir uno nuevo.

Deberías acabar teniendo una entrada parecida a esta:

Registro DNS
Registro DNS

Una vez incluido el nuevo registro, volvemos al panel de gestión de Mailjet y hacemos click en el botón “check now” de la segunda opción.

Si todo ha ido bien, aparecerá ver una modal de confirmación, parecida a esta.

Confirmación de validación
Confirmación de validación

Validación por SPF (Sender Policy Framework) y DKIM (DomainKeys Identified Mail)

Llegados a este punto, Mailjet ha validado la propiedad del domino “@libreriasjs.com”, y es capaz de enviar correos electrónicos con dicho dominio.

No obstante, al tratarse un servicio de terceros, es necesario agregar una capa de seguridad adicional, que verifique la procedencia y autenticidad de los correos enviados.

Aquí es donde entran en juego los conceptos SPF y DKIM.

SPF y DKIM son herramientas que ayudan a verificar la autenticidad de los correos electrónicos en el mundo digital, al igual que verificar la firma del remitente en una carta.

Puedes entender el SPF como la tarjeta de identificación del remitente

Cuando se envía un correo electrónico, el servidor emisor le dice al servidor del destinatario: «Oye, puedo enviar correos electrónicos en nombre de este dominio».

Esto se hace creando un registro especial en la configuración DNS de tu dominio. 

Cuando el servidor del destinatario recibe su correo electrónico, verifica este registro SPF para confirmar si su servidor está autorizado a enviar correos electrónicos para ese dominio. 

Si todo coincide, es más probable que el correo electrónico sea genuino y no falsificado.

Por otra parte, el DKIM es como poner una firma digital en tu correo electrónico. Antes de enviar un correo electrónico, el servidor emisor lo firma con una clave única.

Cuando el servidor del destinatario recibe su correo electrónico, utiliza una clave pública (almacenada en el DNS de su dominio) para verificar la firma. 

Si la firma coincide, significa que el correo electrónico no ha sido modificado desde que lo envió y que realmente es suyo.

En términos más simples, SPF es como decirle al servidor del destinatario: «Puedo enviar correos electrónicos para este dominio», mientras que DKIM es como poner un sello digital para demostrar que no ha sido manipulado.

Tanto SPF como DKIM ayudan a reducir la suplantación de identidad, el phishing y las estafas de correo electrónico.

Son partes importantes de la autenticación de correo electrónico para garantizar que los correos electrónicos que se envían, realmente provienen de las personas u organizaciones de las que dicen ser.

Puedes encontrar más información en relación a este tema en la propia web de Mailjet:

https://documentation.mailjet.com/hc/es/articles/360042412734-Autenticar-dominios-con-SPF-y-DKIM

Ignorar este tipo de validaciones, puede provocar que los correos electrónicos que enviamos vayan directamente a la bandeja de SPAM de nuestros usuarios.

E incluso, en el peor de los casos, puede que nuestro dominio quede registrado en una lista negra donde se marcaría como fraudulento o abusivo.

Con estos conceptos entendidos, vamos a agregar esa capa de seguridad extra, incluyendo nuevos registros DNS.

Accedemos al apartado SPF/DKIM Authentication y seleccionamos “Setup SPF/DKIM Authentication” en el dominio.

Estado autenticación
Estado autenticación

De un modo muy parecido a la validación del dominio, Mailjet nos da dos registros DNS de tipo TXT que deberemos incluir en la zona DNS.

Opciones de autenticación
Opciones de autenticación

Al hacer click en refresh, deberá reconocer los registros, y veremos los estatus como OK.

Programar un envío con NodeJs a través de un correo “sender”

Ahora si, ya está todo listo para activar un correo “sender” y programar un envío mediante NodeJs.

Dentro de la sección «Sender domains & addresses” añadimos un correo electrónico con el dominio que hemos configurado previamente.

En mi caso, añadiré “no-reply@libreriasjs.com”.

Sender activo
Sender activo

Acto seguido, abrimos nuestro editor de código favorito y preparamos un proyecto nuevo NodeJs.

Puedes preparar el entorno como mejor te convenga, pero te sugiero que instales la última versión estable de NodeJs.

Si no tienes claro cómo preparar un entorno backend con NodeJs, también puedes seguir el tutorial que preparé hace un tiempo:

Crear un entorno de desarrollo backend con NodeJs

Como suele ser habitual, nos apoyaremos en librerías JavaScript para conectar nuestro backend con el servicio.

En este caso instalaremos node-mailjet y dotenv

npm i node-mailjet dotenv

NodeMailjet es una librería desarrollada por el propio equipo de Mailjet para facilitar la conexión con su API.

Tal y como veremos a continuación, implementar éste recurso es muy fácil, solo es necesario obtener las claves API, y usarlas al instanciar la clase Mailjet.

Copiamos las claves en el apartado account / SMTP and SEND API Settings.

Claves API Mailjet
Claves API Mailjet

Para evitar que estas credenciales queden expuestas, no las incluiremos en el código fuente de nuestro proyecto.

En su lugar, las añadiremos como variables de entorno en un archivo .env. 

También aprovecharemos para incluir el correo electrónico definido como “sender” y el nombre del remitente.

MAILJET_API_KEY = tu_api_key_de_mailjet
MAILJET_API_SECRET = tu_api_secret_de_mailjet
MAILJET_SENDER = tu_correo_sender
MAILJET_SEND_NAME = tu_nombre

Asegúrate de NO trackear este archivo dentro de tu repositorio Git.

Con las variables de entorno definidas, ya podemos programar nuestro script.

import Mailjet from "node-mailjet";
import dotenv from "dotenv";
dotenv.config();
const sendEmail = async () => {
  try {
    const mailjet = new Mailjet({
      apiKey: process.env.MAILJET_API_KEY,
      apiSecret: process.env.MAILJET_API_SECRET,
    });
    await mailjet.post("send", { version: "v3.1" }).request({
      Messages: [
        {
          From: {
            Email: process.env.MAILJET_SENDER,
            Name: process.env.MAILJET_SEND_NAME,
          },
          To: [
            {
              Email: "YOUR_MAIL@YOUR_ADRESS",
              Name: "YOUR_NAME",
            },
          ],
          Subject: "Salidos desde LibreriasJS",
          TextPart: "Salidos desde LibreriasJS",
          HTMLPart:
            '<h3>Mantente informado de todos los avances en desarrollo frontend y backend con <a href="https://libreriasjs.com">LibreriasJS</a></h3><br /> Hasta la próxima desarrollador!🖐️',
        },
      ],
    });
    console.log("Mail sent correctly!");
  } catch (error) {
    console.log("Something went wrong", error.message);
  }
};
sendEmail();

Analizando brevemente el código, vemos que en primer lugar es necesario importar los recursos Mailjet y dotenv.

Mediante dotenv cargaremos las variables de entorno en nuestro proyecto durante el tiempo de ejecución.

Seguidamente, declaramos una función asíncrona que instancia un objeto “mailjet” a partir de la clase Mailjet.

En el constructor de la clase, incluimos las credenciales.

Concatenando los métodos “post” y “request” nos conectaremos a la API de Mailjet y solicitamos el envío de uno o varios mensajes.

Es importante que prestes especial atención al parámetro del método “request”, en él se definen los campos propios del envío del correo electrónico.

Asegúrate de sustituir el valor de Email dentro de la propiedad “To” para definir un destinatario válido, modificando el string “YOUR_MAIL@YOUR_ADRESS”.

A continuación, puedes lanzar el comando “node index.js” a través de tu CLI.

node index.js

Si todo ha funcionado correctamente, deberías recibir un correo electrónico en tu bandeja de entrada.

Por supuesto, este script es una prueba de concepto, ejecutarlo de forma aislada no tiene mucho sentido, te animo a que lo incluyas en un proyecto más complejo. 

Lo podrías usar, por ejemplo, como respuesta a una llamada a un endpoint, de modo que acepte un parámetro para decidir el mail del destinatario.

Una interfaz para gestionar tus campañas

Para terminar, también me gustaría destacar las funcionalidades que ofrece MailJet a la hora de hacer seguimiento de los correos enviados.

Sin necesidad de añadir ninguna configuración adicional, es capaz de informarnos sobre el estado de un correo enviado.

De un rápido vistazo, puedes ver cuales han sido abiertos, o incluso, si se ha hecho click en el contenido de estos.

Espero que esta guía te haya resultado útil, hasta la próxima publicación.

Deja un comentario