SMTP para Node.js — correo de su aplicación que llega
Node.js no tiene función de correo integrada; prácticamente todas las aplicaciones usan Nodemailer para eso. Esa biblioteca hace sencillo el envío, pero no dice nada sobre la entregabilidad: eso depende por completo del servidor SMTP por el que envía.
Nodemailer trabaja con un transporte. Cree un transporte SMTP con los datos de su relay —host, puerto, cifrado y acceso— y el resto de su código se queda igual. Lo que hoy sale por un servidor local o una cuenta de pruebas, mañana pasa por 2mail.
Por qué falla sin relay
Una aplicación en Node.js envía correo justo cuando importa: un código de verificación, una recuperación de contraseña, la confirmación de una reserva. Son mensajes que se esperan en cuestión de segundos. Si salen de un servidor sin reputación, una parte no llega o llega tarde, y el usuario pulsa "volver a enviar" hasta que se rinde.
Configurar el SMTP en Node.js
Obtener los datos
Acceda a su cuenta de 2mail y obtenga allí su servidor SMTP, su nombre de usuario y su contraseña.
Introducirlos en Node.js
Cree en Nodemailer un transporte SMTP. Ponga como host el servidor SMTP de 2mail y como puerto el 587, y desactive la opción secure para que la conexión se eleve por STARTTLS. En auth introduzca el usuario y la contraseña de su acceso de 2mail. Lea esos datos de variables de entorno, no del código. Nodemailer tiene un método verify para comprobar la conexión antes del primer correo real: úselo.
Autenticar el dominio
Asegúrese de que SPF, DKIM y DMARC de su dominio son correctos, para que los destinatarios puedan verificar que el correo viene de usted.
Probar
Envíe desde su plataforma un mensaje de prueba a una dirección de un gran proveedor y compruebe que llega a la bandeja de entrada y no a la carpeta de spam.
Los campos que pide Node.js
Cada plataforma los llama de una manera algo distinta, pero siempre son los mismos cinco. Los valores concretos dependen de su cuenta y los encuentra en su cuenta de 2mail: cópielos de ahí para asegurarse de usar los correctos.
| Campo | Qué introducir |
|---|---|
| Servidor SMTP (host) | El nombre del servidor de su cuenta de 2mail. |
| Puerto | El puerto que corresponde al cifrado elegido; su cuenta le indica cuál. |
| Cifrado | TLS. No envíe nunca sin cifrar: de lo contrario sus credenciales viajan en claro. |
| Nombre de usuario | El acceso SMTP de su cuenta de 2mail. |
| Contraseña | La contraseña correspondiente. No use nunca la contraseña del buzón de un empleado. |
Configuración SMTP para Node.js en código
Ejemplos que funcionan para el puerto 587 con STARTTLS, listos para copiar. Sustituya la dirección de remitente por una dirección de su propio dominio y compruebe el nombre del servidor y el acceso en su cuenta de 2mail. La contraseña va en una variable de entorno: nunca en el código y nunca en el control de versiones.
Nodemailer: createTransport para el puerto 587
Un solo transporte, creado al arrancar y reutilizado en todas partes. La combinación de secure: false con requireTLS: true es la correcta para el puerto 587: la conexión empieza sin cifrar, se eleva a TLS por STARTTLS, y Nodemailer se niega a continuar si esa elevación falla. El acceso y la contraseña salen de variables de entorno.
// mailer.js
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
host: 'relay.2mail.eu',
port: 587,
secure: false, // 587 starts plain and upgrades with STARTTLS; true is for port 465 only
requireTLS: true, // refuse to continue if the upgrade to TLS fails
auth: {
user: process.env.SMTP_USERNAME,
pass: process.env.SMTP_PASSWORD,
},
});
module.exports = transporter; Probar la conexión con verify() y un primer correo
verify() recorre todo el inicio de sesión sin enviar nada y lanza un error con un code que le permite reconocer la causa: vea la tabla de mensajes de error más abajo. En el envío real, registre el messageId y la respuesta del servidor: es su prueba de que el relay ha aceptado el mensaje.
const transporter = require('./mailer');
async function main() {
// Checks DNS, port, TLS and login without sending anything.
await transporter.verify();
const info = await transporter.sendMail({
from: '"Example" <noreply@example.com>',
to: 'you@example.org',
subject: 'SMTP test',
text: 'Sent through the 2mail SMTP relay.',
});
console.log(info.messageId, info.response);
}
main().catch((err) => {
console.error(err.code, err.message);
process.exit(1);
}); Volúmenes mayores: agrupar conexiones
Si su aplicación envía en picos —una ronda de recordatorios, una serie de avisos—, deje que Nodemailer mantenga abierto un número reducido de conexiones en lugar de montar una nueva por cada mensaje. Es más rápido y al relay no le parece un abuso.
const transporter = nodemailer.createTransport({
pool: true, // keep connections open and reuse them
maxConnections: 3,
maxMessages: 100, // per connection, then reconnect
host: 'relay.2mail.eu',
port: 587,
secure: false,
requireTLS: true,
auth: {
user: process.env.SMTP_USERNAME,
pass: process.env.SMTP_PASSWORD,
},
}); Qué correos envía Node.js
Una vez configurado el relay, todos estos pasan por 2mail: no tiene que configurarlos uno a uno.
Errores frecuentes con Node.js
secure y el puerto tienen que encajar
La opción secure no significa "seguro o inseguro", sino "TLS desde el primer byte". En el puerto 587 debe estar desactivada: STARTTLS viene después. Si la activa igualmente, la conexión se cuelga o se corta de inmediato, sin un error claro.
Un transporte, reutilizado
Cree el transporte una sola vez al arrancar y reutilícelo, en lugar de montar uno nuevo por cada correo. En un pico —una ronda de recordatorios, una campaña— abriría si no cientos de conexiones a la vez, lo que un relay puede leer como abuso. Nodemailer puede agrupar conexiones; actívelo con volúmenes mayores.
Espere el resultado y regístrelo
El envío es asíncrono. Quien no espera la respuesta del servidor ni la registra nunca ve que un mensaje ha sido rechazado. Registre como mínimo el id del mensaje y el posible rechazo, y conecte preferiblemente los webhooks de 2mail para la entrega y el rebote, para ver también lo que falla tras la entrega.
Mensajes de error habituales con Node.js
Los mensajes que recibe cuando el host, el puerto, el cifrado o el acceso no son correctos: citados literalmente, para que los reconozca en su registro, con la causa y la solución al lado.
| Mensaje | Causa | Solución |
|---|---|---|
Error: connect ECONNREFUSED 127.0.0.1:587 | Nodemailer se conecta a su propia máquina en lugar de al relay. La opción host está vacía o es undefined —típicamente una variable de entorno que no existe en producción— y entonces Nodemailer recurre a localhost. | Registre las opciones justo antes de createTransport y compruebe que host contiene realmente relay.2mail.eu. |
Error: Connection timeout | El relay no responde (err.code es ETIMEDOUT). El cortafuegos de su proveedor de alojamiento, de su contenedor o de su plataforma en la nube detiene el tráfico saliente por el puerto 587. | Pruebe desde la misma máquina con openssl s_client -starttls smtp -connect relay.2mail.eu:587 y haga que le abran el puerto 587 de salida. |
Error: Invalid login: 535 5.7.8 Error: authentication failed | El relay rechaza el acceso (err.code es EAUTH): un usuario o una contraseña incorrectos, o una variable de entorno vacía, con lo que Nodemailer inicia sesión sin acceso o con uno vacío. | Compruebe SMTP_USERNAME y SMTP_PASSWORD en el entorno en el que se ejecuta el proceso, y use el acceso SMTP de su cuenta de 2mail, no la contraseña de un buzón. |
Error: …:SSL routines:ssl3_get_record:wrong version number | secure: true en el puerto 587. Nodemailer empieza entonces directamente con una negociación TLS, mientras que el relay espera primero SMTP sin cifrar en ese puerto y solo cambia tras STARTTLS. | Ponga secure: false y requireTLS: true. La conexión queda igual de bien cifrada. |
Error: self signed certificate | No es el relay sino algo por el camino lo que presenta el certificado: un proxy corporativo o un antivirus que intercepta TLS, o un servidor de pruebas local al que host sigue apuntando. | Arregle la ruta en lugar de desactivar la comprobación. tls: { rejectUnauthorized: false } hace desaparecer el error, pero envía su acceso a cualquiera que se haga pasar por el relay. |
¿Otra plataforma?
SMTP es un protocolo estándar: cualquier sistema que hable SMTP —un CRM, un ERP, una aplicación propia o un servidor— puede enviar a través de 2mail con esos mismos cinco campos.