Envío de correos electrónicos desde un servidor de NestJS
En este artículo te comparto como enviar correos electrónicos desde NestJS usando de fondo la librería de Nodemailer, creando una plantilla de handelbars para adaptar el correo que reciba el usuario y configurando el archivo .env con la configuración SMTP de nuestro proveedor de correo electrónico.
Para esto necesitarás tener instalado NestJS, en caso de no tenerlo instalado, abre una terminal de comandos y usa el siguiente:
npm i -g @nestjs/cli
Luego creamos un proyecto nuevo con el siguiente comando:
nest new email-server
Ahora en nuestro proyecto tendremos que instalar las siguientes dependencias:
npm i --save @nestjs/config
npm install --save @nestjs-modules/mailer nodemailer handlebars
npm install --save-dev @types/nodemailer
Creamos nuestro módulo de mail en nuestro proyecto de Nest con el siguiente comando:
# Creamos el modulo
nest g module mail
# Creamos el servicio
nest g service mail
# Creamos el directorio templates donde se encontrará la plantilla
mkdir src/mail/templates
Establecemos una variable de entorno en nuestro archivo .env llamada MAIL_TRANSPORT que tendrá lo siguiente:
# En caso de ser con el proveedor de GMAIL
MAIL_TRANSPORT=smtps://tu-correo@gmail.com:tu-contraseña@smtp.gmail.com:465
Luego, dentro del módulo de mail específicamente en el archivo mail.module.ts lo configuramos de la siguiente manera:
Importamos las dependencias y nuestra variable de entorno donde tendremos la configuración de nuestro servidor SMTP, y por último configuramos la carpeta, templates y el adaptador. Para obtener más información sobre los otros adaptadores de plantilla puedes visitar la documentación de Mailer.
Ahora es momento de crear la plantilla, para eso usaremos handelbars creamos un archivo en la carpeta templates que llamaremos test.hbs, en este archivo podremos escribir etiquetas HTML y propiedades CSS con el que le daremos forma a nuestra plantilla, quedando de la siguiente manera:
Estos corchetes son expresiones de handelbars y proporciona el valor que le indiquemos más adelante en el contexto de nuestro servicio.
Cuando compiles tu aplicación Nest, notarás que en el resultado de la compilación en la carpeta .dist/mail/templates faltará la plantilla.
Recomendado por LinkedIn
De forma predeterminada, Nest solo distribuye archivos compilados de TypeScript durante el paso de compilación. Para distribuir los archivos con extensión .hbs, hay que abrir nuestro archivo de nest-cli.json agregar el directorio assets en el archivo, de esta forma:
Vuelve a compilar la aplicación Nest y ahora los archivos de plantilla se incluirán en el resultado de la compilación.
Ahora es momento de configurar nuestro servicio de email.service.ts, quedándonos de la siguiente forma:
¿Recuerdas que en la plantilla de handelbars entre corchetes se encuentra el parámetro user?, es el mismo que le estamos mandando en la propiedad context de nuestro servicio.
Luego, desde el lugar donde lo quieras llamar solo tienes que importar el servicio de mail en el módulo donde lo necesites, yo ya tengo creado otro módulo dentro del proyecto llamado tasks (tareas) y quedaría de la siguiente manera:
Ahora en el servicio de nuestro módulo tasks importamos el servicio de mail y en la función sendEmail y ejecutamos la función testEmail nos quedaría de la siguiente forma:
Y listo, al llamar la función, ya debería de estar llegando el correo electrónico a sus respectivos destinatarios.
Software Engineer | DevOps Jr | Cyber Security | Web Developer
6 mesesTengo toda la configuración igual pero a mí me sale este error...
Ingeniero informático | Linux | Docker | Javascript | Node | TypeScript | Mysql | Git
7 mesesDiego Jose Chavez Chirinos, muchas gracias justo me encontraba buscando información con respecto a este tema, de nestjs y gmail, segui tu tutorial paso a paso me ayudo un montón, solo te falto agregar la configuración del app.module, pero funciona perfecto. Muchas gracias por compartir tus conocimientos. ✌
Ingeniera de software | TI | DevOps | DataOps | MLOps | Scrum |
8 mesesGracias Diego por compartir tu experiencia, he podido ver de primera mano estos conocimientos aplicados a la app en la que estamos trabajando juntos y es una guía clara y rápida que funciona a la perfección ¡Bravo! 👏🏼👏🏼