Por qué un proveedor de correo tiene la forma equivocada para QA
Se ha probado cada forma de darle direcciones de correo a una batería de pruebas, y cada una tiene una fuga en un sitio distinto:
| Enfoque | Qué cuesta | Dónde falla |
|---|---|---|
Un buzón compartido (qa@company.com) | Nada que configurar. | Cada test lee el correo de todos los demás. La primera consulta de una ejecución nueva encuentra el código de la ejecución anterior. Las ejecuciones en paralelo son imposibles. |
Direccionamiento con signo más (qa+run42@company.com) | Nada que configurar, si el proveedor lo admite. | Sigue siendo un solo buzón: una cuota, un inicio de sesión IMAP compartido por todo el equipo, y un formulario de registro que quita la etiqueta o rechaza el +. |
| Un buzón por tester del proveedor | Una licencia cada uno, y un ticket para crear uno. | Nadie aprovisiona un buzón por ejecución de test. Los testers reutilizan el suyo, y el problema del buzón compartido vuelve, esta vez persona por persona. |
| Un dominio catch-all apuntado aquí | Un registro DNS, una vez. | El buzón es público para cualquiera que conozca la dirección, y el correo dura 5 días. Las dos cosas están bien para un código que importa durante once segundos; ninguna de las dos está bien para correo real de clientes. |
La cuarta fila es esta guía. Es el mismo mecanismo sobre el que funcionan los dominios públicos desechables — un servidor que acepta cualquier dirección de un dominio en lugar de una lista de buzones — aplicado a un nombre que nadie más que tú está usando.
El único registro DNS
En tu proveedor de DNS, añade un único registro MX en la raíz de un dominio que poseas. Ningún otro registro aquí, ningún TXT que demuestre nada, ninguna cuenta en este sitio:
Registro MX para el dominio10 smtp.grabmail.io
- Publica el MX. Prioridad 10, apuntando a
smtp.grabmail.io. Elimina cualquier otro MX del dominio — el correo solo se puede entregar en un sitio, y un registro que se quede por ahí envía parte de él a otro lugar. - Espera al DNS. Normalmente minutos; en ocasiones el TTL de lo que hubiera antes.
dig MX qa-example.commuestra cuándo ha hecho efecto. - Envía un mensaje a cualquier dirección de ese dominio. La primera entrega es lo que conecta el dominio: el servidor consulta el MX en ese momento, se ve a sí mismo, y acepta. A partir de ahí, cada dirección del dominio es un buzón.
Un esquema de nombres que dice quién creó el buzón
Con toda dirección siendo válida, la parte local queda libre para llevar información — y a las dos de la madrugada, con una ejecución fallida y un buzón abierto, vas a querer que la lleve. Tres partes, unidas por guiones, en este orden:
| Parte | Ejemplo | Qué te aporta |
|---|---|---|
| Qué lo creó | signup, reset, e2e, alice | Un vistazo dice a qué flujo o a qué persona pertenece el buzón. |
| Qué ejecución | 1234567890 (el id de ejecución de CI), un nombre de rama, una fecha | Cada buzón de una misma ejecución de pipeline comparte un token que puedes buscar. |
| Aleatoriedad | 3f9a1c2e | Ocho caracteres de ella. Esta es la parte que hace que dos tests, dos shards o dos reintentos nunca compartan un buzón. |
| Nunca: nada real | un nombre de cliente, un id de usuario real, un número de ticket que nombra a un cliente | El buzón es público para cualquiera que conozca la dirección. Nada de la dirección debería merecer la pena saberse. |
// one helper, every runner: who made it, which run, and eight random characters
export const testAddress = (who: string, run = process.env.GITHUB_RUN_ID ?? 'local') =>
`${who}-${run}-${crypto.randomUUID().slice(0, 8)}@qa-example.com`;
testAddress('signup'); // signup-1234567890-3f9a1c2e@qa-example.comLeer cualquier dirección, las mismas tres llamadas
Nada de la API cambia para tu propio dominio. La misma llamada de listado, la misma llamada de mensaje, el mismo borrado — sin clave en el nivel público, y el dominio de la dirección es lo único que cambia:
$ curl -sG https://grabmail.io/api/v1/mailbox --data-urlencode "address=signup-1234567890-3f9a1c2e@qa-example.com"Lo que significa que todo ayudante de este sitio funciona sin cambios tras editar una constante: el fixture de Playwright, la tarea de Cypress, los módulos de Python y Node. Vale la pena saber tres cosas en las que los dominios públicos no te hacen pensar:
- Un
404significa que el MX todavía no está ahí - El listado responde
404para un dominio que no está alojado aquí. En tu propio dominio eso es un problema de DNS — el registro no se ha propagado, o apunta a otro sitio — no un problema de la API.dig MXprimero. - El alias también funciona en tu dominio
- Todo buzón, en cualquier dominio, tiene una segunda dirección en un dominio distinto que entrega en él y que no puede leerlo. Dásela a un sitio cuando prefieras que no pueda abrir el buzón; consulta tú tu propia dirección.
- Una dirección con mucho tráfico se pagina
- Una dirección catch-all que recoge rebotes o un día de notificaciones puede contener más de una página de 200. Pasa
nextde vuelta comobeforehasta que seanull.
Mantener un dominio de pruebas utilizable
Un dominio propio no está en ninguna lista de bloqueo de correo desechable, que suele ser la razón misma para usar uno: la aplicación bajo prueba rechaza grabmail.io y cualquier otro dominio público, exactamente como debería. Cuatro hábitos mantienen esa situación:
- Usa un dominio dedicado —
qa-example.com, no un subdominio de producción ni el dominio al que escriben los clientes. El servicio solo acepta dominios registrables (example.com, nuncamail.example.com), y un dominio de pruebas no debería tener ningún otro trabajo. - No lo publiques. Las listas se construyen a partir de lo que aparece en sitios públicos de correo temporal y en volcados de direcciones compartidos. Un dominio que solo aparece en tu propia batería de pruebas no tiene forma de llegar a ellas.
- Ciérralo con SPF y DMARC. Un dominio de solo recepción sin SPF es un dominio desde el que cualquiera puede suplantar correo; dos registros cierran eso, y no cuestan nada.
- No apuntes correo real hacia él. En el momento en que un sistema de staging envía notificaciones de clientes a una dirección catch-all, un buzón público pasa a contener datos de clientes. Los dominios de pruebas llevan correo de pruebas.
Si la aplicación rechaza todos los dominios catch-all — algunas comprobaciones antifraude lo hacen, sondeando si se acepta una dirección aleatoria del dominio — hay un fondo de pago de dominios .com de aspecto normal que se mantienen fuera de las listas, descrito en la página de precios. Por qué los formularios de registro bloquean el correo desechable explica qué ve cada tipo de comprobación.
Para un equipo: un dominio, muchos testers, muchos pipelines
Un solo dominio catch-all sirve a todo el mundo, porque la parte local es lo único que tiene que ser distinto y es gratis. Lo que necesita un equipo es acordar el esquema de nombres de arriba y tres pequeñas convenciones:
- Un prefijo por pipeline y por persona
e2e-,nightly-,alice-. Buscar el prefijo en un log de job encuentra todos los buzones que creó; buscar el de un compañero encuentra el bug que está mirando.- Nada compartido, nunca
- No hay ningún «buzón de equipo» en el dominio ni ningún fixture que reparta una dirección fija. Si dos personas necesitan el mismo buzón, una de ellas le manda la dirección a la otra.
- Los límites de solicitudes son por cliente
- Una lectura por segundo por dirección, 1200 solicitudes por minuto por cliente — un ejecutor de CI es un cliente, un portátil es otro. Un equipo de diez ejecutando baterías de pruebas a la vez son diez clientes, no uno.
Los límites que se aplican
Tu propio dominio recibe el mismo servicio que los públicos, con los mismos límites. Ninguno de ellos es ajustable, y ninguno es un problema para una batería de pruebas:
| Límite | Valor | Qué significa para QA |
|---|---|---|
| Retención | 5 días por mensaje | Cada ejecución crea su propio correo; nunca se recupera nada de una semana anterior. Las reglas exactas. |
| Adjuntos | 5 MB por mensaje | Suficiente para un PDF de factura o una exportación CSV; un mensaje mayor se rechaza en el momento del SMTP, así que se le avisa al remitente. |
| Lecturas | 1 por segundo por dirección, 1200 por minuto por cliente | Veinte buzones consultados una vez por segundo desde un solo ejecutor. Por encima de eso, 429 con Retry-After. |
| Privacidad | Ninguna — cualquiera que conozca una dirección puede leerla | Partes locales aleatorias, un dominio sin publicar, y nada de correo real de clientes. |
| Envío | Ninguno | El dominio solo recibe. Tu aplicación envía a través de su propio proveedor, igual que en producción. |
Antes de darlo por terminado
- Un dominio registrable dedicado, con un registro MX:
10 smtp.grabmail.io, y ningún otro MX. - Un mensaje enviado a cualquier dirección de ese dominio, y leído de vuelta a través de la API.
- SPF y DMARC publicados, para que nadie pueda enviar en nombre de el dominio.
- Un ayudante de nombres — quién, qué ejecución, ocho caracteres aleatorios — usado por todas las baterías de pruebas.
- El dominio guardado en la configuración del entorno, nunca en el código, en capturas de pantalla o en tickets.
- Nada que envíe correo real de clientes apuntado hacia él.
A partir de aquí, las baterías de pruebas son las que ya están escritas: Playwright con el dominio en su fixture, la disciplina independiente del ejecutor, y el workflow de GitHub Actions con el dominio en una variable.
Preguntas
¿Puedo usar un subdominio, como test.company.com?
No — el servicio solo acepta dominios registrables (company.com, o company.co.uk), porque quien controla un dominio controla todo nombre por debajo de él, y dos partes no pueden tener mitades solapadas de un mismo espacio de nombres. Registra un dominio dedicado barato para las pruebas; de todas formas es la mejor práctica.
¿Cuánto tarda en funcionar el registro MX?
En cuanto el DNS lo sirve, que suele ser cuestión de minutos. Si había un MX anterior, se aplica su TTL. El dominio queda conectado con el primer mensaje que llega después de eso — no tiene que pasar nada más, y dig MX te dice cuándo el registro ya está activo.
¿Cuesta algo?
No. Conectar un dominio, cada dirección de ese dominio y la API son gratis, sin cuenta. Lo único de pago en este sitio es un fondo de dominios que se mantienen fuera de las listas de bloqueo de correo desechable, para quienes no pueden usar un dominio propio.
¿Puede otra persona leer el correo de mi dominio?
Cualquiera que conozca una dirección puede, exactamente igual que en los dominios públicos. Lo que cambia tu propio dominio es la posibilidad de adivinarlo: sus direcciones están sobre un nombre que nadie más está usando. Las partes locales aleatorias y un dominio sin publicar hacen que adivinar sea poco práctico; no hacen que el buzón sea privado, y nada aquí lo hace.
¿Qué pasa con el correo enviado al dominio antes de conectarlo?
Nada llega aquí hasta que el MX apunta aquí. El correo enviado mientras el registro antiguo estaba activo fue al servidor antiguo, o rebotó; el correo enviado después de que cambiara el DNS llega y conecta el dominio.
¿Cómo desconecto el dominio?
Elimina el registro MX. El correo nuevo deja de llegar de inmediato; lo que ya esté en los buzones caduca por su cuenta dentro de 5 días. No se guarda nada del dominio después de eso.
La aplicación también rechaza mi dominio de pruebas. ¿Y ahora qué?
Algunas comprobaciones antifraude rechazan cualquier dominio que acepte una dirección aleatoria — un sondeo de catch-all — en lugar de comprobar una lista. Para esas, hace falta un dominio que se comporte como un proveedor de correo normal, que es lo que ofrece el fondo de pago; por qué los formularios de registro bloquean el correo desechable explica a qué comprobación te enfrentas.


