JavaScript envía correo electrónico desde un servidor, nunca directamente desde el navegador. El código del lado del cliente no puede abrir una conexión SMTP, y poner credenciales de correo en una página se las entregaría a cualquiera que abra las herramientas de desarrollo. Así que la verdadera pregunta es qué ruta del lado del servidor usar: SMTP a través de una biblioteca como Nodemailer, o una solicitud HTTP a un API de correo electrónico. Este artículo muestra ambas.
¿Por qué el navegador no puede enviar correo electrónico?
El envío de correo electrónico funciona sobre SMTP, un protocolo TCP. Los navegadores no exponen sockets TCP sin procesar a JavaScript, así que no hay forma de comunicarse con un servidor de correo desde el lado del cliente. Incluso si la hubiera, las credenciales SMTP o la clave API quedarían en código que cualquiera puede leer. El navegador recoge la entrada del formulario y la envía a tu backend; el backend envía el correo electrónico. Esa separación es todo el patrón.
¿Cómo envías desde un backend de Node con SMTP?
Nodemailer es la biblioteca estándar para SMTP en Node. Configuras un transporte una vez y luego llamas a sendMail:
import nodemailer from "nodemailer";
const transporter = nodemailer.createTransport({
host: "smtp.example.com",
port: 587,
secure: false,
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
await transporter.sendMail({
from: "you@yourdomain.com",
to: "recipient@example.org",
subject: "Your receipt",
text: "Thanks for your order.",
html: "<p>Thanks for your order.</p>",
});
Esto funciona bien en un servidor de larga ejecución. La guía completa, incluyendo adjuntos y pruebas locales, está en enviar correos electrónicos con Nodemailer.
¿Cómo envías con un HTTP de correo electrónico API?
La otra ruta es una solicitud HTTP. Tu backend llama a un API de correo electrónico con fetch, lo que evita operar un servidor de correo y se comporta igual ya sea en un host tradicional o en una función serverless:
const res = await fetch("https://api.bird.com/v1/emails", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BIRD_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "you@yourdomain.com",
to: "delivered@bird.dev",
subject: "Hello from JavaScript",
html: "<p>It works.</p>",
}),
});
if (!res.ok) {
throw new Error(`Send failed: ${res.status}`);
}
La clave sigue viviendo en el servidor, en una variable de entorno, y nunca se envía al cliente.
Envíalo con Bird
El Bird Node SDK envuelve esa misma llamada HTTP para que te saltes el fetch manual y obtengas resultados tipados:
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const { data, error } = await bird.email
.send({
from: "you@yourdomain.com",
to: ["delivered@bird.dev"],
subject: "Hello from Node",
html: "<p>It works.</p>",
})
.safe();
La dirección sandbox de delivered@bird.dev siempre acepta correo, así que la primera ejecución confirma tu configuración. Si construyes el cuerpo de tus correos como componentes React, combínalo con React Email, que renderiza el componente al HTML que pasas en html.
Preguntas frecuentes
¿Puede JavaScript del lado del cliente enviar correo electrónico?
No. Los navegadores no pueden abrir conexiones SMTP, y cualquier credencial en código del cliente queda expuesta. El navegador envía los datos del formulario a tu backend, y el backend envía el correo electrónico.
¿Debería usar Nodemailer o un HTTP API?
Nodemailer es buena opción en un servidor de larga ejecución donde controlas SMTP. Un HTTP API es más sencillo cuando quieres evitar operar un servidor de correo, y es la opción fiable en plataformas serverless donde los sockets SMTP no están disponibles.
¿Dónde guardo la clave API?
En una variable de entorno del lado del servidor, leída en tiempo de ejecución. Nunca debe aparecer en código del front-end ni en un repositorio público.
JavaScript por sí solo no entrega correo; un servidor lo hace. Para profundizar en la ruta API, la descripción del producto de correo electrónico y la guía de envío de correo electrónico cubren los detalles.