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.