Enviar correos electrónicos a los usuarios de su aplicación es una necesidad muy común estos días. Hoy te mostraré cómo usar el módulo Nodemailer para enviar correos electrónicos desde tu aplicación Express.js.

Vamos a utilizar el SMTP de Nodemailer para enviar correos electrónicos, necesitas un correo electrónico real configurado para enviar correos electrónicos a través de SMTP; si no tienes uno, puedes probar el código con la función createTestAccount de Nodemailer para generar el servicio SMTP con una cuenta de prueba desde ethereal.email.

Empieza por descargar el módulo Nodemailer con npm:

npm install nodemailer --save

Luego, crea un archivo para la configuración de Nodemailer. Comencemos con un ejemplo básico con la función createTestAccount solo para verificar si todo funciona correctamente.

// nodemailer.js

const nodemailer = require('nodemailer');

// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
nodemailer.createTestAccount((err, account) => {

const transporter = nodemailer.createTransport({
 host: 'smtp.ethereal.email',
 port: 587,
 secure: false, // true for 465, false for other ports
 auth: {
   user: process.env.EMAIL,
   pass: process.env.EMAIL_PASS
 }
});

function sendEmail() {
 const mailOptions = {
   from: ‘youremail@example.com’,
   to: `anyemail@example.com`,
   subject: `Nodemailer test`,
   text: `Nodemailer & Express.js email test`,
 };

transporter.sendMail(mailOptions, (err, info) => {
   if (err) console.log(err);

   console.log(info);
 });
}
});

Para probarlo solo necesitas requerir (require), el archivo nodemailer.js en su app.js / server.js, el archivo principal de su aplicación Express y deberías ver en la consola si hubo un error o si el correo electrónico fue enviado correctamente. por supuesto, querrás hacer una función para usarla en sus rutas Express.js, es bastante fácil de hacer, hagamos un ejemplo.

En el siguiente ejemplo, tendremos una ruta Express.js para manejar una solicitud “POST”, el usuario enviará su correo electrónico y un mensaje para contactarlo, enviaremos la información al correo electrónico de nuestra aplicación. También tendremos un ciclo de respuesta de solicitud, por lo que necesitamos pasar el objeto “res”, y la función “next” a la función sendEmail.

Primero crearemos la configuración de Nodemailer y la función sendEmail:

// nodemailer.js

const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({
 host: 'smtp.gmail.com',
 port: 25, // your port here
 secure: false, // true for 465, false for other ports
 auth: {
   user: ‘yourEmail’,
   pass: ‘yourPasword’
 }
});

function sendEmail(email, message, res, next) {
 const mailOptions = {
   from: email,
   to: `anyemail@example.com`,
   subject: `Nodemailer test`,
   text: message,
 };

transporter.sendMail(mailOptions, (err, info) => {
   if (err) return next(err);

   res.status(200).json({
     message: 'Email sent'
   });
});
}

module.exports = {
 sendEmail: sendEmail,
}

Observa que exportamos la función sendEmail para poder usarla en nuestra ruta, puedes exportar el “transport” y utilizarlo también, pero prefiero mantener la lógica de Nodemailer allí, y hacer la lógica de DB en las rutas con mongoose, secualize, etc.

Finalmente, necesitaremos la función sendEmail para usarla en nuestra ruta en el siguiente archivo:

// contact-us.routes.js

const express = require('express');
const router = express.Router();

const sendEmail = require('../route-to-the-file/nodemailer').sendEmail;

router
 .route('/contact-us/')
 .post(contactUs);

function contactUs(req, res, next) {
 // take the email and message sent by the frontend
 const email = req.body.email;
 const message = req.body.message;

 sendEmail(message, email, res, next);
}

Hemos terminado, la función sendEmail tomará los datos para enviar el correo electrónico por nosotros, luego utilizaremos el objeto “res” para hacer la respuesta a la interfaz (Frontend).

Si necesitas más información, puede visitar el sitio web oficial de Nodemailer para obtener una documentación más detallada de las capacidades de este módulo. Mantente en contacto para más publicaciones!