¿Tu script de Node.js deja de enviar correos en Windows 11 y solo muestra el temido ECONNREFUSED? Tranquilo: no es un problema de tu código, sino de la propia plataforma. En esta guía exhaustiva descubrirás por qué Windows 11 carece de un servicio SMTP nativo, cómo afecta a Nodemailer y cuáles son las estrategias más rápidas, seguras y productivas para solucionar el bloqueo sin sacrificar la experiencia de desarrollo.
Por qué Windows 11 carece de un servidor SMTP integrado
Microsoft eliminó el antiguo servicio “IIS 6.0 SMTP” de las ediciones de cliente por varias razones: mantenimiento complejo, bajo uso en entornos domésticos y riesgo elevado de convertirse en un open relay si se configura mal. El rol sigue disponible en Windows Server porque los administradores profesionales pueden dedicar tiempo y recursos a su endurecimiento; en Windows 11, en cambio, el modelo de seguridad prioriza minimizar la superficie de ataque. El resultado: ningún proceso escucha en los puertos 25, 465, 587 o 2525 y las llamadas a localhost
se rechazan de inmediato.
Cómo impacta la ausencia de SMTP nativo al usar Nodemailer
Nodemailer abre una conexión TCP con los parámetros que le pases a createTransport()
. Si el host
es localhost
o ::1
(IPv6 loopback) y no hay servidor, Windows devuelve WSAECONNREFUSED. Nodemailer lo traduce al mensaje legible connect ECONNREFUSED ::1:25/465/587/2525. No es un fallo de la librería ni del cortafuegos: simplemente no existe destino que responda.
Opciones prácticas para enviar correo en Windows 11
Objetivo | Alternativa recomendada | Pasos esenciales |
---|---|---|
Enviar correos reales de forma fiable | Proveedor SMTP externo (Mailtrap, Gmail, Outlook, SendGrid…) | Crear cuenta → Copiar host, puerto, usuario y contraseña → Configurar en nodemailer.createTransport({ host, port, auth }) |
Pruebas locales sin salir de la máquina | Servidor SMTP ligero: MailHog, Papercut SMTP, hMailServer, Docker/WSL + Postfix | Instalar → Verificar que escucha en 127.0.0.1:1025/2525/587 → Ajustar Nodemailer al puerto elegido |
Pruebas rápidas sin instalar nada | Cuenta de test integrada de Nodemailer (createTestAccount() ) | Generar credenciales temporales → Usarlas en createTransport → Consultar las vistas previas en la URL devuelta |
Proveedor SMTP externo: la vía más sencilla y segura
Utilizar un servicio profesional elimina la responsabilidad de gestionar certificados, colas, listas negras y políticas SPF/DKIM. Además, la mayoría ofrece paneles de análisis, reintentos automáticos y API adicionales. El flujo típico con Nodemailer:
const nodemailer = require('nodemailer');
async function enviarCorreo() {
const transporter = nodemailer.createTransport({
host: 'smtp.sendgrid.net', // o el host que te proporcione el servicio
port: 587,
secure: false, // true para 465
auth: {
user: 'apikey',
pass: process.env.SENDGRID\_TOKEN
}
});
await transporter.sendMail({
from: '"Soporte" <[soporte@tu-dominio.com](mailto:soporte@tu-dominio.com)>',
to: '[destinatario@ejemplo.com](mailto:destinatario@ejemplo.com)',
subject: 'Prueba desde Windows 11',
text: '¡Hola mundo!',
html: '\¡Hola mundo!\'
});
}
enviarCorreo().catch(console.error);
Servidor SMTP ligero para pruebas locales
Cuando necesitas ver el contenido de un correo sin exponerlo a Internet, un servidor “capturador” es ideal. Aquí se describen las tres herramientas más populares:
MailHog
- Binario autónomo (≈ 10 MB) o contenedor Docker.
- Escucha en 1025 para SMTP y 8025 para la interfaz web.
- Muestra mensajes en tiempo real y dispone de API JSON.
Papercut SMTP
- Instalador MSI clásico para Windows.
- Ventana de escritorio para visualizar correos.
- Puede inyectar encabezados de diagnóstico.
hMailServer
- Proyecto Open Source veterano.
- Permite dominios virtuales, alias y reglas.
- Opción de entregar a ficheros EML o reenviar a un relay externo.
Instalación detallada de MailHog en Windows 11
- Descarga el ejecutable desde la página oficial y cópialo en
C:\Herramientas\MailHog
. - Crea un acceso directo en shell:startup para que arranque con la sesión.
- Abre PowerShell como administrador y ejecuta:
New-NetFirewallRule -DisplayName "SMTP MailHog" -Action Allow -Direction Inbound -Protocol TCP -LocalPort 1025
- Inicia MailHog: aparecerá una consola indicando “Serving under 127.0.0.1:1025”.
- Navega a
http://localhost:8025
y verifica que la UI está activa. - Configura Nodemailer:
const transporter = nodemailer.createTransport({ host: '127.0.0.1', port: 1025, secure: false });
Instalación rápida de Papercut SMTP
- Descarga el instalador y sigue el asistente. No requiere dependencias.
- Papercut se inicia minimizado en el área de notificación.
- Ve a “Settings → Listening” y confirma que el puerto sea 2525.
- En Nodemailer:
const transporter = nodemailer.createTransport({ host: 'localhost', port: 2525, secure: false });
- Cada correo aparecerá en la lista y podrás “replay” o exportarlo.
Uso de Docker o WSL 2 para levantar Postfix
Si ya trabajas con contenedores, basta añadir a tu docker-compose.yml:
mail:
image: mailhog/mailhog
ports:
- "1025:1025"
- "8025:8025"
Al ejecutar docker compose up -d tendrás la misma funcionalidad que el binario nativo, aisladamente y sin tocar el registro de Windows. Con WSL 2 puedes incluso correr un Postfix completo en Ubuntu para validar características como TLS STARTTLS o autenticación SASL.
Configuración completa de ejemplo
El siguiente script detecta si existe la variable CI
(indicativo de ejecución en un pipeline) y, según el caso, selecciona el transporte apropiado:
import nodemailer from 'nodemailer';
import { hostname } from 'os';
export async function buildTransport() {
if (process.env.CI) {
return nodemailer.createTransport({
host: 'localhost',
port: 1025,
secure: false
});
}
// Producción
return nodemailer.createTransport({
host: process.env.SMTP\_HOST,
port: Number(process.env.SMTP\_PORT) || 587,
secure: false,
auth: {
user: process.env.SMTP\_USER,
pass: process.env.SMTP\_PASS
}
});
}
(async () => {
const transporter = await buildTransport();
await transporter.sendMail({
from: `"Bot ${hostname()}" <bot@ejemplo.com>`,
to: '[dev@ejemplo.com](mailto:dev@ejemplo.com)',
subject: 'Correo de prueba',
text: 'Hola desde ' + hostname()
});
})();
Verificación y depuración
Antes de culpar a Nodemailer ejecuta en PowerShell:
Test-NetConnection -ComputerName localhost -Port 1025
Si el resultado indica TcpTestSucceeded : False, no hay servicio escuchando. Con openssl s_client -starttls smtp -connect smtp.gmail.com:587 puedes comprobar la capa TLS y confirmar que las credenciales sean correctas.
Buenas prácticas de seguridad
- Almacena contraseñas en variables de entorno o secret managers, nunca en el código fuente.
- Activa OAuth 2.0 en Gmail u Outlook para eliminar la dependencia de contraseñas de aplicación.
- Registra SPF y DKIM en tu dominio para mejorar la entregabilidad y evitar falsos positivos de spam.
- Si expones un servidor SMTP casero en Internet, usa fail2ban y TLS obligatorio.
Integración en CI/CD
MailHog en Docker es la forma más sencilla de validar correos en pipelines. Añade al trabajo YAML:
services:
mailhog:
image: mailhog/mailhog
ports:
- "1025:1025"
options: >-
--health-cmd="curl -f http://localhost:8025/api/v2/messages"
--health-interval=10s
--health-retries=5
Después del test, haz curl http://localhost:8025/api/v2/messages
y analiza el JSON para comprobar que el número de correos enviados coincide con lo esperado.
Preguntas frecuentes
¿Puedo reinstalar IIS 6.0 SMTP en Windows 11?
No. El componente fue eliminado por completo de las ediciones de cliente. Solo está disponible en Windows Server a través del administrador de roles.
¿Telnet es una prueba fiable?
Telnet solo indica si hay un socket abierto. No verifica autenticación ni TLS, por lo que conviene complementarlo con scripts de envío reales.
¿MailHog envía correos a Internet?
No. Su diseño es capturar y retener los mensajes. Para entregas externas debes configurarlo como relay o usar un proveedor real.
¿Qué puerto debo abrir en el firewall?
Depende de la herramienta: 1025 por defecto en MailHog, 2525 en Papercut, 587 en hMailServer si habilitas TLS.
Resumen
Windows 11 prescinde deliberadamente de un SMTP nativo, lo que provoca errores ECONNREFUSED en Nodemailer cuando se apunta a localhost
. La solución pasa por:
- Usar un proveedor externo para correos de producción.
- Instalar un servidor ligero (MailHog, Papercut, hMailServer) para pruebas locales.
- Aprovechar Docker/WSL en entornos automatizados.
- Mantener buenas prácticas de seguridad, autenticación y registro.
Así obtendrás envíos fiables, una trazabilidad impecable y un entorno de desarrollo a prueba de sorpresas.