Cómo bloquear correos desechables en tu formulario de registro
Para bloquear correos desechables en el registro, rechaza el dominio si está en una lista mantenida de dominios desechables, luego consulta sus registros MX y recházalo si el correo lo gestiona un servidor que solo atiende buzones temporales. En nuestra prueba del 1 de octubre de 2026, esa comprobación MX detectó 420 de 445 dominios desechables recién listados que una lista desactualizada no tenía.
La mayoría de las guías se quedan en "usa una lista de bloqueo". Las preguntas interesantes son qué tan rápido se desactualiza una lista, qué cubre ese hueco y cómo evitar bloquear a personas reales mientras lo haces. Medimos las tres cosas.
Por qué una lista de dominios por sí sola no basta
Una lista de dominios desechables se queda atrás el mismo día que la copias. Los servicios de usar y tirar registran dominios nuevos constantemente, y cada uno funciona hasta que alguien lo añade a una lista.
La lista de SimpleVerifier, con 8740 dominios desechables, era una copia de la lista de código abierto disposable-email-domains tomada a principios de septiembre de 2026. La comparamos con la versión en vivo de esa misma lista, descargada el 1 de octubre de 2026. En menos de un mes, la lista en vivo había ganado 457 dominios que nuestra copia no tenía, y había quitado uno que nuestra copia seguía incluyendo. Cualquier formulario que usara la copia antigua habría dejado pasar los 457.
La lista también se deteriora en la otra dirección. Resolvimos los registros MX de los 8740 dominios:
| Resultado | Dominios | Proporción |
|---|---|---|
| Tiene registros MX | 5789 | 66.2% |
| MX nulo (no acepta correo, RFC 7505) | 134 | 1.5% |
| El dominio no existe (NXDOMAIN) | 1869 | 21.4% |
| Existe, sin registro MX | 838 | 9.6% |
| Fallo o tiempo de espera del servidor DNS | 110 | 1.3% |
Más de una quinta parte de los dominios ya no existe. Bloquearlos no cuesta nada, porque nadie puede recibir correo ahí. Pero muestra la rotación: los servicios abandonan dominios y registran otros nuevos, y una lista siempre describe el pasado.
Qué aporta una comprobación MX
Los servicios desechables operan cientos de dominios sobre un puñado de servidores de correo. Revisa adónde va el correo de un dominio nuevo y podrás reconocer el servicio aunque nunca hayas visto ese dominio.
Entre los 5789 dominios listados con registros MX funcionando había 1246 servidores de correo principales distintos, y están muy concentrados:
| Los N hosts MX principales | Dominios atendidos | Proporción de los dominios listados con MX |
|---|---|---|
| 10 | 2719 | 47.0% |
| 25 | 3636 | 62.8% |
| 50 | 4153 | 71.7% |
| 100 | 4503 | 77.8% |
El host con más carga, email.chatgpt.org.uk, es el MX principal de 470 dominios listados. generator.email, tinyhost.shop y emailfake.com atienden cada uno cientos más.
Luego probamos si ese conocimiento se aplica a dominios que una lista todavía no ha detectado. Resolvimos los MX de los 457 dominios que estaban en la lista de código abierto pero faltaban en la nuestra. 445 tenían registros MX. De ellos, 420 usaban al menos un servidor de correo que ya atendía algún dominio de nuestra lista antigua, excluyendo los proveedores de uso general (ver la siguiente sección). Los otros 25 usaban servidores de correo que nunca habíamos visto o solo proveedores compartidos.
Dicho de otro modo, si el formulario hubiera revisado los hosts MX además de los nombres de dominio, la lista desactualizada habría detectado igualmente 420 de los 445 dominios nuevos con correo funcionando (94%). Los dominios nuevos eran sobre todo nombres recientes en los mismos servidores de siempre.
El método, para que puedas repetirlo: las consultas se hicieron con dnspython 2.8.0 contra 1.1.1.1 y 8.8.8.8, con un tiempo de espera de 6 segundos, el 1 de octubre de 2026. Se registraron los hosts MX de cada dominio; un dominio contaba como coincidencia si alguno de sus hosts MX aparecía entre los hosts MX de nuestros 8740 dominios listados, tras excluir los proveedores compartidos que se enumeran abajo.
La trampa de los falsos positivos: la infraestructura de correo compartida
Nunca bloquees por un host MX que también atienda a empresas comunes. Esa sola regla separa una comprobación MX útil de una que rechaza a tus mejores clientes.
567 de los 5789 dominios listados con MX (9.8%) enrutan el correo a través de infraestructura de uso general:
| Proveedor (el nombre del host MX contiene) | Dominios desechables listados que lo usan |
|---|---|
cloudflare.net (Cloudflare Email Routing) |
290 |
google.com (Google Workspace / Gmail) |
88 |
above.com (estacionamiento de dominios) |
57 |
mailgun.org |
50 |
registrar-servers (reenvío de Namecheap) |
32 |
outlook.com (Microsoft 365) |
17 |
zoho |
13 |
secureserver (GoDaddy) |
10 |
improvmx |
7 |
forwardemail |
3 |
Si añadieras aspmx.l.google.com a un conjunto de MX desechables porque lo usan 51 dominios de usar y tirar, bloquearías a todas las empresas en Google Workspace. Lo mismo vale para los servidores de enrutamiento de Cloudflare. Esos 567 dominios solo se pueden detectar por nombre, y por eso la lista sigue siendo la primera capa.
Las demás fuentes de falsos positivos que conviene tener en cuenta en el diseño:
- Los relés de privacidad no son desechables. Las direcciones de Ocultar mi correo de Apple, Firefox Relay y DuckDuckGo reenvían a un buzón real y duradero. Ni
privaterelay.appleid.com, nimozmail.com, niduck.comestán en la lista de código abierto ni en la nuestra. Trátalos como usuarios reales con una preferencia de privacidad. - Los dominios muertos se vuelven a registrar. 1869 dominios listados no existen actualmente. Si una empresa legítima compra uno más adelante, una lista que nunca quita entradas bloqueará a su personal. Los propios mantenedores de la lista de código abierto lo dicen: "cannot guarantee all of these can still be considered disposable" (no pueden garantizar que todos sigan considerándose desechables), solo que "they were disposable at one point in time" (fueron desechables en algún momento).
- No tener MX no es lo mismo que no tener correo. Según el RFC 5321, un dominio sin registro MX recurre a su registro A. Rechazar todos los dominios sin MX bloquea a un pequeño número de configuraciones reales. Rechaza por NXDOMAIN y por MX nulo, que no dejan lugar a dudas.
- Subdominios de un dominio listado. Algunos servicios reparten
anything.service.tld. Compara el dominio y cada dominio padre con la lista, no solo la cadena exacta.
Una implementación funcional en Node.js
Este es el orden que recomendamos: búsqueda en la lista (sin red), luego una consulta MX con un tiempo de espera corto, y luego una decisión. Ante errores de DNS deja pasar, para que una caída de tu resolvedor nunca detenga registros reales.
import { promises as dns } from "node:dns";
import { readFileSync } from "node:fs";
const BLOCKLIST = new Set(
readFileSync("disposable_domains.txt", "utf8").split("\n").map((d) => d.trim().toLowerCase()).filter(Boolean)
);
// MX hosts that only serve throwaway inboxes. Never put Google, Microsoft,
// Cloudflare or Mailgun here: they host millions of real domains too.
const DISPOSABLE_MX = new Set([
"email.chatgpt.org.uk", "generator.email", "emailfake.com",
"tinyhost.shop", "mail.wabblywabble.com", "mail.mailinator.com",
]);
function onBlocklist(domain) {
const labels = domain.split(".");
for (let i = 0; i < labels.length - 1; i++) {
if (BLOCKLIST.has(labels.slice(i).join("."))) return true;
}
return false;
}
async function withTimeout(promise, ms) {
let timer;
const timeout = new Promise((_, reject) => { timer = setTimeout(() => reject(new Error("ETIMEOUT")), ms); });
try { return await Promise.race([promise, timeout]); } finally { clearTimeout(timer); }
}
export async function checkSignupDomain(email) {
const domain = email.split("@").pop().trim().toLowerCase();
if (onBlocklist(domain)) return { verdict: "block", reason: "domain on disposable list" };
let records;
try {
records = await withTimeout(dns.resolveMx(domain), 3000);
} catch (err) {
if (err.code === "ENOTFOUND") return { verdict: "block", reason: "domain does not exist" };
if (err.code === "ENODATA") {
// RFC 5321 section 5.1: no MX means mail falls back to the A record.
const hasA = await withTimeout(dns.resolve4(domain), 3000).then(() => true, () => false);
return hasA
? { verdict: "allow", reason: "no MX, but A record (implicit MX)" }
: { verdict: "block", reason: "domain cannot receive mail" };
}
return { verdict: "allow", reason: "DNS unavailable, failing open" };
}
const hosts = records.map((r) => r.exchange.toLowerCase().replace(/\.$/, ""));
if (hosts.length === 0 || hosts.every((h) => h === "")) {
return { verdict: "block", reason: "null MX: domain accepts no mail" };
}
if (hosts.some((h) => DISPOSABLE_MX.has(h))) {
return { verdict: "block", reason: `MX ${hosts[0]} serves disposable inboxes` };
}
return { verdict: "allow", reason: "no disposable signal" };
}
for (const email of process.argv.slice(2)) {
console.log(email, await checkSignupDomain(email));
}
Guárdalo como check.mjs junto a un archivo disposable_domains.txt (un dominio por línea) y ejecútalo con Node 18 o posterior. Nuestra salida del 1 de octubre de 2026:
$ node check.mjs a@mailinator.com x@foo.mailinator.com a@247chats.com b@gmail.com d@example.com f@github.io
a@mailinator.com { verdict: 'block', reason: 'domain on disposable list' }
x@foo.mailinator.com { verdict: 'block', reason: 'domain on disposable list' }
a@247chats.com { verdict: 'block', reason: 'MX generator.email serves disposable inboxes' }
b@gmail.com { verdict: 'allow', reason: 'no disposable signal' }
d@example.com { verdict: 'block', reason: 'null MX: domain accepts no mail' }
f@github.io { verdict: 'allow', reason: 'no MX, but A record (implicit MX)' }
247chats.com es uno de los 457 dominios que faltaban en nuestra lista antigua. La comprobación por nombre lo dejó pasar; la comprobación MX, no.
Dos notas para usarlo en producción. Actualiza la lista de dominios de forma programada en lugar de guardarla una sola vez en el repositorio, y mantén DISPOSABLE_MX corta y curada a mano: añade un host solo cuando todos los dominios que hayas visto en él sean desechables.
Qué mostrarle al usuario
Dile a la gente con claridad que necesitas una dirección que vaya a conservar, y déjala intentarlo de nuevo. Un registro bloqueado con un error vago parece un formulario roto.
Algo así: "No podemos aceptar direcciones de correo temporales. Usa una dirección que sigas teniendo el próximo mes". No reveles qué lista o comprobación coincidió; eso solo ayuda a alguien a pasar al siguiente dominio.
Haz la comprobación en el servidor. Una copia en el cliente sirve como pista mientras se escribe, pero cualquiera puede saltársela, y enviar una lista de 8000 líneas a cada navegador suma peso a la página sin aportar seguridad.
Dónde encaja esto con todo lo demás
Bloquear correos desechables es una capa, no una defensa del registro por sí sola:
- Los errores de escritura como
gmial.comson otro problema con otra solución (sugerir, no bloquear). Consulta cómo detectar errores de escritura en el registro. - El direccionamiento con signo más y los puntos de Gmail permiten que un solo buzón real cree muchas cuentas. Eso es cuestión de normalización, no de direcciones desechables: direccionamiento con signo más y abuso de pruebas gratuitas.
- Los bots que llenan el formulario a gran escala requieren límites de frecuencia y un desafío: cómo frenar registros falsos sin perjudicar a usuarios reales.
- Saber si el buzón existe requiere una comprobación SMTP, que el DNS no puede responder. Consulta cómo comprobar una dirección sin enviar nada.
Puedes revisar un dominio a mano con nuestro verificador de correos desechables o ver sus servidores de correo con la herramienta de búsqueda MX.
La versión corta
- Compara el dominio, y cada dominio padre, con una lista de dominios desechables que se actualice automáticamente.
- Consulta los MX. Bloquea NXDOMAIN y MX nulo. No bloquees "sin MX" sin revisar el registro A.
- Bloquea los hosts MX que solo atienden buzones temporales. Nunca bloquees proveedores compartidos como Google, Microsoft o Cloudflare.
- Ante errores de DNS deja pasar, y dale al usuario un mensaje claro y una segunda oportunidad.
La lista detecta los servicios que todos conocen. La comprobación MX detecta los dominios que registraron la semana pasada.
Preguntas frecuentes
¿Cuál es la mejor forma de bloquear direcciones de correo desechables?
Compara primero el dominio con una lista de bloqueo mantenida, luego consulta sus registros MX y compara los servidores de correo con los hosts que se sabe que solo atienden buzones temporales. La lista resuelve al instante los servicios conocidos, y la comprobación MX detecta dominios nuevos que apuntan a la misma infraestructura antes de que ninguna lista los haya añadido.
¿Puedo bloquear correos desechables revisando solo los registros MX?
No de forma segura. Muchos dominios desechables enrutan el correo a través de Cloudflare, Google o Mailgun, que también alojan millones de dominios legítimos. La coincidencia por MX solo funciona con un conjunto curado de hosts que no atienden nada más que buzones temporales, y funciona mejor junto con una lista de dominios.
¿Debo bloquear las direcciones de Ocultar mi correo de Apple, Firefox Relay o DuckDuckGo?
En general, no. Son servicios de reenvío: el correo llega al buzón real de la persona y puede responder. Son una elección de privacidad, no una dirección de usar y tirar, y la principal lista de código abierto de dominios desechables no los incluye.
¿Cada cuánto hay que actualizar una lista de dominios desechables?
Tan seguido como puedas automatizarlo. Nuestra propia lista empezó como una copia de septiembre de 2026, con 8740 dominios, de la lista de código abierto disposable-email-domains. Para el 1 de octubre, la versión en vivo de esa lista ya tenía 457 dominios que nuestra copia no tenía, así que una lista copiada una vez en tu código y nunca actualizada se queda atrás rápido. El 20 de octubre de 2026 rehicimos la nuestra a partir de la lista actual de origen, que contiene 9913 dominios.
Verifica correos por 39,00 USD/mes, sin cortes
Comprobación SMTP real del buzón. Sin créditos ni cobro por correo.
Empezar