Integración con Nodemailer
Prueba el correo de Nodemailer con InboxTap
InboxTap acepta el mismo mensaje SMTP que una aplicación Nodemailer envía a un proveedor de entrega, pero lo captura en memoria local acotada en lugar de retransmitirlo. El recurso oficial proporciona un transporte listo y parámetros SMTP dinámicos para que las pruebas ejerciten la construcción real del mensaje sin puertos fijos.Configura correctamente SMTP local sin cifrado
Un transporte Nodemailer manual para InboxTap usa el host y el puerto locales, secure: false, ignoreTLS: true y ningún objeto auth. secure: false indica que TLS no está activo al conectar; por sí solo, no impide que Nodemailer intente después una actualización STARTTLS.
InboxTap desactiva la autenticación y STARTTLS porque es un servidor de captura limitado a loopback. Mantén esos ajustes de desarrollo separados del transporte autenticado y cifrado que se usa para la entrega en producción.
Prefiere el recurso verificado
startInboxTapFixture() elige puertos SMTP y API libres, inicia el servidor, crea un transporte Nodemailer, llama a verify() y comprueba el endpoint de salud de InboxTap antes de devolver el control. Su método close() es idempotente y limpia tanto el transporte como las escuchas.
El transporte del recurso resulta práctico en pruebas de integración de plantillas. Para comprobar el componente de correo de la aplicación, configúralo con inboxTap.smtp y envía mediante la API de la aplicación.
import { startInboxTapFixture } from "inboxtap/fixtures";
const inboxTap = await startInboxTapFixture();
try {
const inbox = await inboxTap.createInbox();
await inboxTap.transport.sendMail({
from: "app@local.test",
to: inbox.address,
subject: "Account",
text: "https://app.local.test/verify",
});
const email = await inbox.waitForMessage();
expect(email.envelope.to).toContain(inbox.address);
} finally {
await inboxTap.close();
}Entiende qué demuestra la verificación del transporte
verify() de Nodemailer comprueba la resolución DNS, la conexión TCP, cualquier actualización TLS y la autenticación sin enviar un mensaje. No demuestra que un servidor acepte un remitente de sobre o un mensaje concretos.
Conserva al menos una transacción sendMail() real en la prueba. InboxTap almacena el mensaje solo cuando SMTP DATA termina correctamente, por lo que el CapturedEmail resultante representa una entrega aceptada y no solo la disponibilidad del transporte.
Comprueba el sobre y el contenido
Usa toHaveRecipient() cuando importe el enrutamiento de entrega, porque compara el sobre SMTP y no una dirección visible analizada desde la cabecera del mensaje. Usa toContainLink() para URL HTTP o HTTPS extraídas y waitForCode() para un valor numérico.
Usa waitForMessage() cuando la prueba necesite el asunto, las cabeceras normalizadas, el texto, el HTML, la fuente sin procesar o todos los enlaces extraídos. Evita imprimir el cuerpo o URL con tokens en los diagnósticos habituales.
Cierra cada recurso responsable
Coloca fixture.close() en un bloque finally cuando gestiones el ciclo de vida de forma explícita. Si la aplicación crea su propio transporte Nodemailer, su recurso debe cerrarlo antes de apagar InboxTap.
Los adaptadores nativos para Bun, Vitest y Playwright automatizan este orden. Hacer explícita la responsabilidad evita que conexiones abiertas mantengan vivo el proceso de pruebas después de un fallo.
Conecta un emisor real de la aplicación
Continúa con un flujo ejecutable de Express y Vitest que comprueba enlaces, tokens personalizados, OTP, destinatarios y cabeceras.
Leer la guía de Nodemailer