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:
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:
- Crea un objeto Transporter
- Crea un objeto MailOptions
- 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.
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.
Selecciona la opción New Project:
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.
Podría tomar unos pocos segundos para que el proyecto se configure, pero luego de eso serás capaz de ver esta pantalla:
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:
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:
Si no eres un miembro del G-Suite, la única opción disponible será External for user Type.
Luego de hacer clic en crear, la próxima pantalla nos pide rellenar la información de la aplicación (nuestro servidor):
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.
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.
En el menú desplegable de tipo de Aplicación, elige Web Application:
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.
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.
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.
- 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:
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.
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.
5. En la próxima pantalla, te preguntará para conceder permiso a tu proyecto para interactuar con tu cuenta de Gmail. Házlo.
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í.