Una guía práctica para probar un servidor de correo a mano. Aprende qué hace cada comando SMTP, cómo responde el servidor y cómo ejecutar una sesión de verificación completa con telnet u openssl.
SMTP (Simple Mail Transfer Protocol) es un protocolo de texto plano, basado en líneas. Eso significa que puedes hablar directamente con un servidor de correo desde un terminal y leer exactamente lo que responde — sin necesidad de software especial. Esta es la forma más transparente de comprobar si un buzón existe, si un servidor es accesible y cómo está configurado.
Primero encuentra el servidor de correo (host MX) del dominio, luego abre una conexión TCP a su puerto SMTP. El puerto clásico es el 25. Los puertos de envío 587 y 2525 se usan con STARTTLS; el puerto 465 es TLS implícito (SMTPS).
Conexión sin cifrar (puerto 25):
telnet mail.example.com 25
Puerto STARTTLS (587 o 25) — telnet no puede hacer TLS, usa openssl:
openssl s_client -connect mail.example.com:587 -starttls smtp -crlf
Puerto TLS implícito (465):
openssl s_client -connect mail.example.com:465 -crlf
Nota: muchos ISP domésticos y móviles bloquean el puerto 25 saliente para combatir el spam. Si telnet ... 25 simplemente se queda colgado, normalmente es por tu proveedor, no por el servidor de correo. Prueba desde un servidor/VPS donde el puerto 25 esté abierto, o usa los puertos de envío.
Tú escribes comandos (no distinguen mayúsculas de minúsculas); el servidor responde con un código de 3 dígitos y texto. Termina cada comando con Enter (CRLF).
| Comando | Qué hace |
|---|---|
HELO domain | Saludo heredado. Identifica por nombre al host que se conecta. El servidor responde 250. |
EHLO domain | Saludo moderno (HELO Extendido). Igual que HELO, pero el servidor también enumera las extensiones admitidas (STARTTLS, AUTH, SIZE, PIPELINING…). |
MAIL FROM:<addr> | Inicia un nuevo mensaje y establece el remitente del sobre (la “ruta de retorno”). Responde 250 si se acepta. |
RCPT TO:<addr> | El comando clave para la verificación. Pide al servidor que acepte un destinatario. 250 = el buzón se acepta; 550 = no existe tal usuario; 4xx = intenta más tarde (p. ej. lista gris). |
DATA | Comienza el cuerpo del mensaje. El servidor responde 354; envías las cabeceras + el cuerpo y finalizas con un único punto . en su propia línea. (Para una comprobación de verificación nunca llegas a este paso.) |
RSET | Reinicia la transacción actual (olvida MAIL FROM / RCPT TO) sin cerrar la conexión. |
VRFY user | Pide al servidor que verifique un nombre de usuario/dirección. Diseñado precisamente para esto, pero casi siempre deshabilitado hoy en día (devuelve 252 o 502) porque revela direcciones válidas a los spammers. |
EXPN list | Pide al servidor que expanda una lista de correo en sus miembros. Al igual que VRFY, deshabilitado en casi todas partes por la misma razón de privacidad. |
STARTTLS | Actualiza una conexión sin cifrar a TLS cifrado (en los puertos 25/587). Se ofrece solo si aparece en la respuesta EHLO. |
AUTH LOGIN / PLAIN | Autentica a un usuario (necesario para enviar correo a través de los puertos de envío, no para la verificación). |
NOOP | No hace nada; el servidor responde 250. Útil para mantener viva una conexión o probar la capacidad de respuesta. |
HELP | Pide al servidor que enumere los comandos que admite. |
QUIT | Finaliza educadamente la sesión. El servidor responde 221 y cierra la conexión. |
El primer dígito te indica la categoría, de modo que puedes interpretar cualquier respuesta aunque no conozcas el código exacto:
354 tras DATA).| Código | Significado |
|---|---|
220 | Servicio listo (el banner de saludo). |
221 | Cerrando la conexión (respuesta a QUIT). |
250 | OK — comando aceptado (la respuesta que quieres tras RCPT TO). |
251 / 252 | El usuario no es local pero se reenviará / no se puede verificar pero se intentará la entrega. |
354 | Empieza a enviar el cuerpo del mensaje (tras DATA). |
421 | Servicio no disponible, cerrando — a menudo por limitación de tasa. |
450 / 451 / 452 | Problema temporal (buzón ocupado, error local, poco almacenamiento). La lista gris aparece frecuentemente aquí. |
502 | Comando no implementado (respuesta típica a VRFY / EXPN). |
550 | Buzón no disponible / no existe tal usuario — la dirección no existe. |
551 / 552 / 553 / 554 | El usuario no es local / supera la cuota / nombre de buzón incorrecto / transacción fallida. |
Comprobando si john@example.com existe. Las líneas que escribes están marcadas con >; todo lo demás es el servidor:
$ telnet mail.example.com 25 220 mail.example.com ESMTP ready > EHLO checkemail.test 250-mail.example.com Hello checkemail.test 250-STARTTLS 250-SIZE 52428800 250 PIPELINING > MAIL FROM:<probe@checkemail.test> 250 2.1.0 Ok > RCPT TO:<john@example.com> 250 2.1.5 Ok ← el buzón EXISTE > RSET 250 2.0.0 Ok > QUIT 221 2.0.0 Bye
Si, en cambio, el destinatario no existe, verías algo como:
> RCPT TO:<nosuchuser@example.com> 550 5.1.1 <nosuchuser@example.com>: Recipient address rejected: User unknown
4xx temporal en el primer intento a propósito, pidiéndote que vuelvas más tarde. Un 4xx no significa que la dirección no sea válida.250 y lo resuelven más tarde. Entonces RCPT TO no puede demostrar que un buzón concreto exista. Para detectar un catch-all, prueba con una dirección claramente aleatoria: si también se acepta, el dominio es catch-all.¿Quieres que esto se haga automáticamente, incluyendo la consulta MX, la detección de catch-all y un veredicto claro? Usa nuestro Verificador de Correo en la página de inicio.