Verificar que un email existe sin enviarle un mensaje parece magia, pero es solo abusar del protocolo SMTP como lo diseñó RFC 5321 hace 20 años. El servidor del dominio destino está obligado a decirnos si acepta o rechaza un destinatario antes de que mandemos el cuerpo del mensaje. Nosotros nos vamos antes de mandar nada.
El handshake, paso a paso
Cuando un servidor de correo quiere entregar un mensaje a maria@empresa.com, hace exactamente estos pasos:
- Resuelve DNS/MX de
empresa.compara encontrar el servidor de correo. - Abre una conexión TCP al puerto 25 (o 587) de ese servidor.
- Lee el banner (
220 mail.empresa.com ESMTP). - Dice
EHLOy recibe las extensiones soportadas. - Dice
MAIL FROM:<noreply@byebouncer.com>y el servidor acepta. - Dice
RCPT TO:<maria@empresa.com>. Acá está la clave: el servidor responde si ese buzón existe y acepta correo. - Normalmente seguiría con
DATAy el cuerpo del mensaje. Nosotros cortamos conQUIT.
El servidor nunca vio un mensaje, nunca lo guardó en el buzón, nunca lo marcó como spam. Para él fue una conexión que se cerró antes de empezar. Para nosotros, su respuesta al RCPT TO fue toda la información que necesitábamos.
Las respuestas que importan
Los códigos SMTP son de 3 dígitos. Los que leemos en el RCPT TO:
250: aceptado. El buzón existe (o el dominio es catch-all; ver abajo).550: rechazado. El buzón no existe o fue borrado.452: buzón lleno. Existe pero no acepta más mensajes ahora.450: greylisting. Pide reintentar más tarde.421: límite temporal del servidor. Reintentar más tarde.
Las trampas
El protocolo asume un mundo ideal; la realidad tiene matices.
Catch-all
Muchos dominios configuran su servidor para aceptar cualquier dirección y después, internamente, decidir qué hacer. Un 250 en un catch-all no significa que el buzón exista — significa que el servidor no te va a decir si existe o no. Lo detectamos probando una dirección aleatoria del mismo dominio al principio: si también la acepta, el dominio es catch-all y marcamos el resultado como unknown.
Proveedores grandes que no colaboran
Yahoo, por ejemplo, aceptó durante años cualquier RCPT TO y hacía la validación real durante elDATA para no filtrar información a scrapers. Microsoft tiene reglas similares con bloqueos por reputación. Cuando pasa, devolvemos provider_blocked como señal neutra: no es evidencia de que el email sea inválido, es evidencia de que el proveedor no colaboró.
Greylisting y timeouts
Un servidor con greylisting activo responde 450 la primera vez y acepta en el reintento, para filtrar spam que no reintenta. Nosotros no reintentamos infinitamente — devolvemos el estado como unknowncon la señal greylisting. En producción eso te deja decidir si tratás como review o reintentás más tarde.
Rate-limiting por dominio
Si consultás 10.000 emails de gmail.com en 30 segundos, Google te banea tu IP. Nosotros limitamos las consultas que mandamos a cada dominio para proteger nuestra reputación de IP (que es compartida entre todos nuestros clientes). Cuando se activa el límite devolvemos smtp_domain_rate_limited y el resultado se basa en las capas previas (sintaxis, MX, clasificación de dominio).
Por qué esto importa para tus bounces
Mandar un mensaje a un buzón que ya probaste con SMTP probing y que respondió 550 es la forma más rápida de arruinar la reputación de tu dominio. ESP como SendGrid, Postmark o Resend miden tu bounce rate y pueden suspender la cuenta a partir del 5%. Verificar antes de enviar baja ese número a 0 hasta en listas viejas.