Cómo bloquear correos desechables en el registro
Tres formas de detectar correos temporales en tu formulario de registro, de una lista fija a una API, con código, y los errores que bloquean a usuarios reales.
Qué cuenta como correo desechable
Una dirección desechable (o temporal) viene de un servicio que entrega buzones sin registro, normalmente durante minutos u horas. Mailinator, Guerrilla Mail, 10 Minute Mail y miles de dominios menos conocidos funcionan así. Son útiles para quien quiere evitar boletines, e igual de útiles para quien crea muchas cuentas.
Tres categorías vecinas se suelen confundir con ellos y necesitan un trato distinto:
- Relays de privacidad como
privaterelay.appleid.comde Iniciar sesión con Apple,duck.comde DuckDuckGo o Firefox Relay reenvían a un buzón real y duradero. Bloquearlos perjudica a clientes preocupados por la privacidad. Trátalos, como mucho, como una señal de riesgo pequeña. - Proveedores gratuitos como Gmail, Outlook.com o Yahoo no son desechables. Su patrón de abuso es otro: alias de un mismo buzón, tratados en nuestra guía de alias de Gmail.
- Dominios que ni siquiera reciben correo — errores como
gmial.como dominios inventados. También vale la pena detectarlos, porque nadie puede confirmar una cuenta ahí.
Opción 1: una lista fija en tu código
En GitHub se mantienen listas abiertas de dominios desechables con decenas de miles de entradas. Lo más sencillo es cargar una en un conjunto y comprobar el dominio en el registro:
# Python DISPOSABLE = set(open("disposable_domains.txt").read().split()) def is_disposable(email: str) -> bool: domain = email.rsplit("@", 1)[-1].strip().lower().rstrip(".") parts = domain.split(".") # también subdominios: mail.tempdomain.com -> tempdomain.com return any(".".join(parts[i:]) in DISPOSABLE for i in range(len(parts) - 1))
No cuesta nada y no añade latencia. Los inconvenientes:
- Se queda vieja. Aparecen dominios desechables nuevos todo el tiempo, y muchos servicios rotan dominios precisamente para esquivar las listas. Una lista copiada hace seis meses no tiene los más nuevos, que son justo los que usan los abusadores.
- Las listas no coinciden. Cada lista incluye dominios distintos, y algunas tienen errores. Combinar varias da más cobertura pero más mantenimiento.
- Necesitas un proceso de actualización y un despliegue (o recarga) cada vez que cambia.
Opción 2: comprobar el servidor de correo (MX)
Una consulta DNS de los registros MX del dominio te dice si puede recibir correo. Detecta errores tipográficos y dominios inventados que ninguna lista contiene:
# Python, con dnspython import dns.resolver def can_receive_mail(domain: str) -> bool: try: return len(dns.resolver.resolve(domain, "MX", lifetime=2)) > 0 except dns.resolver.NXDOMAIN: return False except Exception: return True # un problema de DNS no es culpa del usuario: dejar pasar
Guarda el resultado en caché por dominio, usa un timeout corto y nunca rechaces un registro porque tu resolvedor DNS tuvo un mal momento. Ten en cuenta que la comprobación MX no detecta servicios desechables: reciben correo perfectamente, es su trabajo.
Opción 3: una API que hace ambas cosas y se mantiene al día
Una API saca de tu código el mantenimiento de la lista y las consultas MX. Attrelix combina varias listas públicas, las actualiza a diario, registra cuándo se vio cada dominio por primera vez, comprueba el servidor de correo y normaliza los alias de Gmail en la misma llamada — y además puntúa la red y el dispositivo, así que obtienes una decisión por registro y no solo un veredicto sobre el correo. Puedes probar la consulta de dominios gratis en el verificador de correo desechable.
curl https://attrelix.com/v1/check \ -H "Authorization: Bearer $ATTRELIX_SECRET" \ -H "Content-Type: application/json" \ -d '{"email":"someone@mailinator.com","ip":"203.0.113.9"}'
La respuesta incluye email.disposable, email.relay, email.mx y la dirección normalizada, junto con la decisión global y sus motivos.
Errores que bloquean a usuarios reales
- Bloquear relays. El relay privado de Apple lo usan muchos usuarios de iPhone que inician sesión con Apple. Bloquearlo los bloquea a ellos.
- Bloquear por errores de DNS. Un timeout no demuestra que un dominio sea falso.
- Listas demasiado amplias. Algunas listas comunitarias incluyen pequeños proveedores legítimos o dominios de empresas. Si un cliente se queja, permite el dominio en lugar de discutir.
- Un mensaje de error sin salida. “Correo no válido” confunde a una persona real que escribió una dirección real. Di que no se aceptan buzones temporales y pide otra dirección.
Lo que una comprobación de desechables no detecta
Bloquear dominios desechables sube un poco el coste del abuso: el abusador se pasa a Gmail. A partir de ahí, el abuso aparece como muchas cuentas detrás de un buzón o de un dispositivo. Ahí entra detectar cuentas múltiples.
Resumen
- Separa dominios desechables, relays de privacidad, proveedores gratuitos y dominios muertos.
- Una lista fija es un buen comienzo pero envejece; actualízala o usa una API.
- Usa comprobaciones MX para dominios muertos y deja pasar si hay problemas de DNS.
- Espera que los abusadores se pasen a alias de Gmail y normaliza las direcciones.