10-10-2026

Enviar correos con nodejs: una guía estructurada y segura

Enviar un correo desde un backend normalmente requiere preparar el contenido, configurar un proveedor y ejecutar el envío desde el servidor. NODEJS permite realizar este proceso de forma ordenada y mantenible mediante el uso de bibliotecas como Nodemailer y la aplicación de buenas prácticas de seguridad y organización del código.

Configuración del proveedor

El backend necesita conectarse a un servicio que permita el envío de mensajes. Es posible utilizar SMTP o una API de correo. Entre las opciones habituales se encuentran:
  • Gmail
  • SendGrid
  • Mailgun
  • SMTP genérico
Ejemplo básico con Nodemailer y Gmail queda de la siguiente manera:

import nodemailer from 'nodemailer';

const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: process.env.EMAIL_USER,
    pass: process.env.EMAIL_PASS,
  },
});

Almacenamiento de credenciales

Las claves, contraseñas o tokens utilizados para el envío de correos no deben colocarse directamente en el código. La práctica recomendada consiste en emplear variables de entorno. Un archivo ".env" típico puede contener:

EMAIL_USER=tu_correo@gmail.com
EMAIL_PASS=tu_contraseña
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
El acceso a estas variables se realiza de la siguiente manera:

import dotenv from 'dotenv';
dotenv.config();

const user = process.env.EMAIL_USER;
const pass = process.env.EMAIL_PASS;
Este enfoque protege la configuración y facilita el cambio de credenciales entre entornos.

Creación del servicio de correo

Para centralizar la lógica de envío y mantenerla separada del resto de la aplicación, resulta conveniente crear un módulo dedicado, por ejemplo "services/emailService.js.Una estructura de proyecto orientativa incluye:


src/
├── services/
│   └── emailService.js
├── controllers/
│   └── userController.js
└── routes/
    └── userRoutes.js
El servicio puede implementarse de esta manera:

import nodemailer from 'nodemailer';

export const sendEmail = async ({ to, subject, html }) => {
  const transporter = nodemailer.createTransport({
    host: process.env.SMTP_HOST,
    port: process.env.SMTP_PORT,
    auth: {
      user: process.env.EMAIL_USER,
      pass: process.env.EMAIL_PASS,
    },
  });

  await transporter.sendMail({
    from: process.env.EMAIL_USER,
    to,
    subject,
    html,
  });
};
Esta separación facilita el mantenimiento, las pruebas y la reutilización del código.

Definición de plantillas

Organizar el contenido de los correos mediante plantillas permite mantener separados el asunto, el HTML y los datos dinámicos. Esto simplifica las modificaciones y favorece la reutilización. Una estructura posible es:

src/
└── templates/
    ├── welcomeEmail.js
    └── resetPassword.js
Ejemplo de plantilla de bienvenida:

export const getWelcomeEmail = ({ name, userUrl }) => ({
  subject: '¡Bienvenido!',
  html: `<h1>Hola ${name}</h1>
    <p>Gracias por unirte.</p>
    <a href="${userUrl}">Comenzar</a>  `,
});
El resultado visual de este tipo de plantilla suele mostrar un mensaje claro, personalizado y con una llamada a la acción destacada.

Resumen de los elementos clave

Un sistema de envío de correos bien diseñado se apoya en cuatro pilares:
  • Proveedor: permite realizar el envío.
  • Variables de entorno: protegen la configuración.
  • Servicio: centraliza la lógica.
  • Plantillas: organizan el contenido.
Un buen sistema no solo envía correos, sino que también mantiene el código limpio y seguro. La aplicación de estas prácticas contribuye a proyectos más robustos, mantenibles y profesionales.