Original article: How to Use Nodemailer to Send Emails from Your Node.js Server

Nodemailer es un módulo de Node.js que te permite enviar emails desde tu servidor con facilidad. Sea que quieras comunicarte con tus usuarios o sólo notificarte a ti mismo cuando algo ha salido mal, una de las opciones para hacerlo es a través de un email.

Hay muchos artículos por ahí que explican cómo usar Nodemailer de forma muy básica, pero este artículo no es uno de ellos. Aquí, te mostraré la práctica más común de enviar un email desde tu backend Node.js usando Nodemaier y Gmail.

Cómo empezar con Nodemailer

Primero, necesitamos configurar nuestro boilerplate de Node.js usando Express. Para asegurarte que tienes Node y npm instalados, puedes ejecutar los siguientes comandos:

node -v 
npm -v

Si ambos de estos comandos muestran una versión, puedes continuar. De otra manera, instala lo que falta.

Crea una carpeta para tu proyecto. Usaremos el nombre nodemailerProject.

mkdir nodemailerProject

Ve dentro de la nueva carpeta creada y ejecuta:

npm init

Esto iniciará nuestro proyecto con un archivo package.json.

Lo siguiente, necesitaremos instalar Express usando:

npm install express

Dependiendo qué archivo señalaste como tu punto de entrada (por defecto es index.js), ábrelo y pega el siguiente código:

const express = require('express')
const app = express()
const port = 3000


app.listen(port, () => {
  console.log(`nodemailerProject is listening at http://localhost:${port}`)
})
index.js

Lo de arriba es lo que se necesita para empezar un simple servidor usando Express. Puedes ver que está funcionando adecuadamente ejecutando:

node index.js

Cómo instalar Nodemailer

Instala nodemailer usando el siguiente comando:

npm install nodemailer

La API de Nodemailer es bastante sencillo y nos pide que hagamos lo siguiente:

  1. Crea un objeto Transporter
  2. Crea un objeto MailOptions
  3. Usa el método Transporter.sendMail

Para crear un objeto transporter, hacemos lo siguiente:

let transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        type: 'OAuth2',
        user: process.env.MAIL_USERNAME,
        pass: process.env.MAIL_PASSWORD,
        clientId: process.env.OAUTH_CLIENTID,
        clientSecret: process.env.OAUTH_CLIENT_SECRET,
        refreshToken: process.env.OAUTH_REFRESH_TOKEN
      }
    });
✋ Presta atención, aparte de las claves de usuario y contraseña, los cuales son tus propias credenciales para tu cuenta de gmail, las otras tres claves necesitan ser recuperadas después de configurar OAuth.

Como dijimos al principio de este artículo, estaremos usando Gmail para nuestras necesidades de envío de correo. Como habrás adivinado, Gmail tiene un alto nivel de seguridad cuando se trata de correo enviado por/a la cuenta de un usuario.

Hay varias formas que podemos superar este obstáculo (algunas mejores que las otras), y elegiremos la que nos pide configurar un proyecto en la Plataforma de Nube de Google. Necesitamos hacer eso para tener las credenciales para la seguridad de OAuth activado por Gmail.

aquí

Los próximos pasos requerirán algunas configuraciones en vez de código, así que prepárense.

image-297
Photo by Daniel McCullough / Unsplash

Configuraciones de la Plataforma de la Nube de Google

Si no tienes una cuenta de la Plataforma de la Nube de Google, asegúrate de configurar uno como pre-requisito. Una vez que lo hayas creado, crea un nuevo proyecto haciendo clic en el menú desplegable en la esquina izquierda superior.

1_a4fnFLNMoTtLJuqsKilVnA

Selecciona la opción New Project:

1_HNwUG3wPdbrwc3JB5D7_tg

En la próxima ventana, tendremos que darle a nuestro proyecto un nombre. Elige cualquiera que te guste, pero continuaremos con nuestro nombre NodemailerProject. Para la propiedad location, puedes dejarlo como No organization.

1_TRlA6RBLCCCSMQ5R4di27A

Podría tomar unos pocos segundos para que el proyecto se configure, pero luego de eso serás capaz de ver esta pantalla:

1_FT9MhBZyU4cZd4Qg6zeFag

Abre el menú de navegación haciendo clic en las tres líneas punteadas en la esquina de arriba a la izquierda y selecciona APIs and Services:

1_qPaPpPadHQLdKCQbhjND7Q

Para ser capaz de usar Nodemailer y Gmail tendremos que usar OAuth2. Si no estás familiarizado con OAuth, es un protocolo para autenticación. No voy a entrar en detalles aquí, ya que no es necesario, pero si quieres entender más sobre ello, ve aquí.

Primero tendremos que configurar nuestra OAuth Consent Screen:

1_W2oeT1KmJXpwSQlIMIVo5w

Si no eres un miembro del G-Suite, la única opción disponible será External for user Type.

1_l_GrPVtXODPS0GXKLMdWYA

Luego de hacer clic en crear, la próxima pantalla nos pide rellenar la información de la aplicación (nuestro servidor):

1_reZ04hUX4jh1IzLGh7vCFA

Rellena tu email en el campo User Support y también en el campo Developer Contact Information. Haz clic en Save y Continue nos traerá a la fase Scopes de esta configuración. Omite esta fase, ya que no es relevante para nosotros, y dirígete a la fase Test Users.

1_Jms50wZ5mVmUyOaiVF7b4w

Aquí, añádete a ti mismo como un usuario y haz clic en Save y Continue.

Cómo configurar tus Opciones de OAuth

En esta fase crearemos nuestras credenciales de OAuth para ser usados con Nodemailer. Dirígete a la pestaña Credentials sobre OAuth Consent Screen. Haz clic en el signo más (➕) que tiene el texto Create Credentials y elige OAuth Client ID.

1_h0nME2ccR7HPjKmz_DMZRw

En el menú desplegable de tipo de Aplicación, elige Web Application:

1_72Em-VS-fdM2WCwOA6zcfg

En la sección de Authorized Redirect URIs, asegúrate de agregar OAuth2 Playground, ya que lo usaremos para obtener una de las claves que fue mencionado al principio de este artículo.

1_ywIcOlqA5DHdsPaSNnjJ9Q

Después de hacer clic en create, te será presentado tú id y secreto de cliente. Guárdalos y nunca los expongas de ninguna manera o forma.

image-298
Photo by Power Lai / Unsplash

Obtén tu Token de Actualización de OAuth

Para obtener un token de actualización, el cual usaremos dentro del objeto transporter en Nodemailer, necesitamos dirigirnos al Playground de OAuth2. Aprobamos este URI para este propósito específico en una etapa previa.

  1. Haz clic en el ícono de engranaje a la derecha (el cual es la Configuración de OAuth2) y verifica la casilla de verificación para usar tus propias Credenciales de OAuth2:
1_Kbg3RnTBNkDd_RQ0zn59mQ

2. Mira a la parte izquierda del sitio web y verás una lista de servicios. Desplázate hacia abajo hasta que veas Gmail API v1.

1_BppvkU1r4JzZ6j6FvC2qNw

3. Haz clic en Authorize APIs

Te será presentado una pantalla para iniciar sesión con cualquiera de tus cuentas Gmail. Elige la que listaste como un usuario de Prueba.

4. La próxima pantalla te hará saber que Google todavía no ha verificado esta aplicación, pero esto está bien, ya que no lo hemos entregado para verificación. Haz clic en continue.

1_rL0tNdaZqOyIg6aCp4IR3g

5. En la próxima pantalla, te preguntará para conceder permiso a tu proyecto para interactuar con tu cuenta de Gmail. Házlo.

1_y0TUXbtC_oUaB6KoGlURbQ

6. Una vez que esto está hecho, serás redireccionado de vuelta al Plaground de OAuth y puedes ver que hay un código de autorización en el menú a la izquierda. Haz clic en el botón azul etiquetado Exchange authorization code for tokens.

Los campos para el token de actualización y el token de acceso estarán rellenados ahora.

De vuelta al Servidor

Después de hacer todas esas configuraciones, podemos volver a nuestra aplicación e ingresar todos esos datos en la creación de transporter. Para tener todas tus credenciales de manera privada, puedes usar el paquete dotenv. No te olvides también de agregar el archivo .env que crearás en .gitignore.

Así que, ahora tenemos esto:

let transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        type: 'OAuth2',
        user: process.env.MAIL_USERNAME,
        pass: process.env.MAIL_PASSWORD,
        clientId: process.env.OAUTH_CLIENTID,
        clientSecret: process.env.OAUTH_CLIENT_SECRET,
        refreshToken: process.env.OAUTH_REFRESH_TOKEN
      }
    });

Después, crearemos el objeto mailOptions, el cual tiene los detalles de a dónde enviar el email y con qué datos.

let mailOptions = {
      from: tomerpacific@gmail.com,
      to: tomerpacific@gmail.com,
      subject: 'Nodemailer Project',
      text: 'Hi from your nodemailer project'
    };

Este objeto puede tener muchos más campos e inclusive múltiples recipientes, pero no veremos eso aquí.

Finalmente, usaremos el método sendMail:

transporter.sendMail(mailOptions, function(err, data) {
      if (err) {
        console.log("Error " + err);
      } else {
        console.log("Email sent successfully");
      }
    });

Ejecuta tu aplicación y verás tu bandeja de entrada ser rellenado con un nuevo email.

Este artículo fue inspirado de un proyecto que creé que usa Nodemailer. Si quieres verlo, ve aquí.