¿Cómo verificar si existe una dirección de correo electrónico sin enviar un correo electrónico?

123

Me he encontrado con este código PHP para verificar la dirección de correo electrónico usando SMTP sin enviar un correo electrónico .

¿Alguien ha intentado algo similar o funciona para usted? ¿Puede saber si un correo electrónico que ingresa el cliente / usuario es correcto y existe?

php-guy
fuente
2
Me pregunto, ¿por qué esto tiene la etiqueta Telnet?
Piccolo
2
Hay una biblioteca PHP que hace exactamente eso: github.com/kickboxio/kickbox-php
Dan
Kickbox no es gratis. Esta API es solo un contenedor para conectarse a su servicio.
Ashit Vora

Respuestas:

92

Hay dos métodos que a veces puedes usar para determinar si realmente existe un destinatario:

  1. Puede conectarse al servidor y emitir un VRFYcomando. Muy pocos servidores admiten este comando, pero está destinado exactamente para esto. Si el servidor responde con un 2.0.0 DSN, el usuario existe.

    VRFY user
  2. Puede emitir un RCPT, y ver si el correo es rechazado.

    MAIL FROM:<>
    RCPT TO:<user@domain>

Si el usuario no existe, obtendrá un DSN 5.1.1. Sin embargo, el hecho de que el correo electrónico no sea rechazado no significa que el usuario exista. Algunos servidores descartarán silenciosamente solicitudes como esta para evitar la enumeración de sus usuarios. Otros servidores no pueden verificar al usuario y tienen que aceptar el mensaje independientemente.

También hay una técnica antispam llamada lista gris, que hará que el servidor rechace la dirección inicialmente, esperando que un servidor SMTP real intente una nueva entrega algún tiempo después. Esto arruinará los intentos de validar la dirección.

Honestamente, si está intentando validar una dirección, el mejor enfoque es usar una expresión regular simple para bloquear direcciones obviamente inválidas, y luego enviar un correo electrónico real con un enlace a su sistema que validará la recepción del correo electrónico. Esto también asegura que el usuario ingresó su correo electrónico real, no un pequeño error tipográfico que le pertenece a otra persona.

Joseph Tary
fuente
10
Algunos servidores incluso aceptarán el mensaje pero luego enviarán un mensaje de error al remitente del sobre, especialmente si se trata de una organización grande con muchos departamentos internos con sus propios servidores de correo. Es posible que el servidor fronterizo ni siquiera conozca todas las cuentas.
David Mårtensson
3
Entonces, ¿por qué los spammers no usan este método para verificar los correos electrónicos? Me refiero al hecho de que estos métodos son compatibles con muy pocos servidores. O ellos?
Shahriyar Imanov
77
@ Shehi: En realidad, los spammers pueden usar este método, eso es difícil de decir. Sin embargo, debido a que los spammers pueden usarlo, casi todos los servidores de correo deshabilitan VRFY, por lo que en la práctica VRFY probablemente sea inútil.
sleske
2
¿Puedes dar un código de ejemplo de cómo usar un RCPT TO: <usuario @ dominio>? Gracias
Papa De Beau
44
Para VRFY, gmail responde "Envía un correo, haré lo mejor que pueda" ;-)
Armel Larcier
46

Otras respuestas aquí discuten los diversos problemas al tratar de hacer esto. Pensé en mostrarte cómo podrías intentar esto en caso de que quisieras aprender haciéndolo tú mismo.

Puede conectarse a un servidor de correo a través de telnet para preguntar si existe una dirección de correo electrónico. Aquí hay un ejemplo de prueba de una dirección de correo electrónico para stackoverflow.com:

C: \> nslookup -q = mx stackoverflow.com
Respuesta no autorizada:
stackoverflow.com Preferencia MX = 40, intercambiador de correo = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com Preferencia MX = 10, intercambiador de correo = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com Preferencia MX = 20, intercambiador de correo = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com Preferencia MX = 30, intercambiador de correo = STACKOVERFLOW.COM.S9B1.PSMTP.com

C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 listo. La Sección 17538.45 del Código de Negocios y Profesiones de CA prohíbe el uso de este sistema para anuncios de correo electrónico no solicitados.

hola hola
250 Postini dice hola de vuelta

correo de: <[email protected]>
250 ok

rcpt a: <[email protected]>
550-5.1.1 La cuenta de correo electrónico que intentó alcanzar no existe. Por favor, inténtalo
550-5.1.1 verificar la dirección de correo electrónico del destinatario para ver si hay errores tipográficos o
550-5.1.1 espacios innecesarios. Obtenga más información en
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

Las líneas con prefijos de códigos numéricos son respuestas del servidor SMTP. Agregué algunas líneas en blanco para que sea más legible.

Muchos servidores de correo no devolverán esta información como un medio para evitar que los spammers recopilen direcciones de correo electrónico, por lo que no puede confiar en esta técnica. Sin embargo, puede tener cierto éxito en la limpieza de algunas direcciones de correo electrónico evidentemente malas al detectar servidores de correo no válidos o al rechazar las direcciones de los destinatarios como se indicó anteriormente.

Tenga en cuenta también que los servidores de correo pueden ponerlo en la lista negra si les hace demasiadas solicitudes.


En PHP, creo que puede usar fsockopen, fwritey freadpara realizar los pasos anteriores mediante programación:

$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <[email protected]>\r\n");
fwrite($smtp_server, "rcpt to: <[email protected]>\r\n");
Drew Noakes
fuente
¡felicitaciones! un problema que encontré es, ¿el puerto 25 siempre funciona con registro mx de baja prioridad?
Dhruvenkumar Shah
@DhruvenkumarShah, lo siento, no lo sé. Si se entera, por favor comente nuevamente.
Drew Noakes
Hola, solo estaba tratando de que mi propia cuenta universitaria descubriera todo sobre los registros MX, pero no funcionó durante 25 ... pero el tipo de sitio web en línea verificar-email.org funcionó ... cómo lo están haciendo ... I te lo haré saber si lo descubro
Dhruvenkumar Shah
1
@DhruvenkumarShah da pocos nombres de servidor de intercambio de correo. Vea la respuesta para los intercambiadores de correo. así que si uno falla, otro de la lista debería funcionar.
Janaka R Rajapaksha
realmente mucha ayuda completa para mí ... gracias señor ... lo probé en masilla y funciona como encantos ... gracias ...
Mohammed Sufian
8

La respuesta general es que puede no comprobar si una dirección de correo electrónico existe evento si se envía un correo electrónico a la misma: sólo podía entrar en un agujero negro.

Dicho esto, el método descrito allí es bastante efectivo. Se usa en el código de producción en ZoneCheck, excepto que usa RSET en lugar de QUIT.

Cuando la interacción del usuario con su buzón no es demasiado costosa, muchos sitios realmente prueban que el correo llega a algún lugar enviando un número secreto que debe enviarse de vuelta al emisor (ya sea yendo a una URL secreta o enviando este número secreto por correo electrónico). La mayoría de las listas de correo funcionan así.

kmkaplan
fuente
6

En realidad no ..... Es posible que algunos servidores no comprueben "rcpt to:"

http://www.freesoft.org/CIE/RFC/1123/92.htm

Hacerlo es un riesgo de seguridad .....

Si el servidor lo hace, puede escribir un bot para descubrir cada dirección en el servidor ...

l_39217_l
fuente
yo también estaba pensando en eso :)
Janaka R Rajapaksha
6

Esto fallará (entre otros casos) cuando el servidor de correo objetivo utilice listas grises.

Lista gris : el servidor SMTP rechaza la entrega la primera vez que se conecta un cliente previamente desconocido, permite la (s) próxima (s) vez (s); esto mantiene fuera un porcentaje de los robots de spam, al tiempo que permite un uso legítimo, ya que se espera que un remitente legítimo vuelva a intentarlo , que es lo que harán los agentes normales de transferencia de correo.

Sin embargo, si su código solo verifica en el servidor una vez , un servidor con listas grises negará la entrega (ya que su cliente se conecta por primera vez); a menos que vuelva a verificar dentro de un tiempo, es posible que esté rechazando incorrectamente direcciones de correo electrónico válidas.

Piskvor salió del edificio
fuente
(experiencia personal: tuve que discutir de un lado a otro con mi proveedor de correo electrónico que , estoy al tanto de lo que estoy haciendo, y , necesito que aparezcan las listas grises, porque estos cheques de un servicio de terceros estaban fallando )
Piskvor salió del edificio
4

Algunos asuntos:

  1. Estoy seguro de que algunos servidores SMTP le informarán de inmediato si no existe una dirección que les proporcione, pero algunos no lo harán como medida de privacidad. Simplemente aceptarán las direcciones que les des e ignorarán en silencio las que no existen.
  2. Como dice el artículo, si hace esto con demasiada frecuencia con algunos servidores, lo incluirán en la lista negra.
  3. Para algunos servidores SMTP (como gmail), debe usar SSL para hacer cualquier cosa. Esto solo es cierto cuando se utiliza el servidor SMTP de gmail para enviar correos electrónicos.
Graeme Perrow
fuente
Con respecto al tercer punto, esto solo sucede si desea usarlo como un relé. No conozco ningún intercambiador de correo que requiera SSL. Si alguno hiciera esto, dejarían de recibir correos electrónicos de muchos usuarios.
kmkaplan
Perdón mi error. Si desea enviar un correo electrónico usando el servidor SMTP de gmail, debe usar SSL.
Graeme Perrow
3

Aunque esta pregunta es un poco antigua, esta sugerencia de servicio podría ayudar a los usuarios a buscar una solución similar que verifique las direcciones de correo electrónico más allá de la validación de sintaxis antes del envío.

He estado utilizando este servicio de código abierto para una validación más profunda de los correos electrónicos (comprobación de registros mx en el dominio de la dirección de correo electrónico, etc.) para algunos proyectos con buenos resultados. También comprueba los errores tipográficos comunes que la bruja es bastante útil. Demostración aquí .

Henkealg
fuente
Usted afirma que este servicio es de código abierto. ¿Podría proporcionar un enlace a la fuente?
amaurymartiny
Lo siento @amaurymartiny No puedo. En el momento de escribir este artículo, el proyecto Mailgun era de código abierto si recuerdo correctamente, pero no puedo encontrar un enlace a ningún repositorio que proporcione la fuente después de este momento.
Henkealg
2

"¿Puedes decir si un correo electrónico que ingresa el cliente / usuario es correcto y existe?"

En realidad, estas son dos cosas separadas. Puede existir pero puede no ser correcto.

A veces tiene que tomar las entradas del usuario al valor nominal. De lo contrario, hay muchas maneras de derrotar al sistema.

Aprendizaje
fuente
2
1 Puede no estar seguro de que es correcto sin necesidad de enviar un correo electrónico y realmente conseguir una respuesta humana para ello, tales como hacer clic en un enlace.
Daniel Daranas
puede mantener un enlace (para una imagen, etc.) en el cuerpo del correo electrónico y contar cada carga para ese enlace. no hay necesidad de esperar clics
Janaka R Rajapaksha
2

Todo lo que puede hacer es buscar DNS y asegurarse de que el dominio que está en la dirección de correo electrónico tenga un registro MX, aparte de eso no hay una forma confiable de lidiar con esto.

Algunos servidores pueden funcionar con el método rcpt-to donde se habla con el servidor SMTP, pero depende completamente de la configuración del servidor. Otro problema puede ser que un servidor sobrecargado puede devolver un código 550 que dice que el usuario es desconocido, pero este es un error temporal, hay un error permanente (¿creo que 451?) Que puede devolverse. Esto depende completamente de la configuración del servidor.

Yo personalmente verificaría el registro MX de DNS y luego enviaría un correo electrónico de verificación si existe el registro MX.

Bryan Rehbein
fuente
2
function EmailValidation($email)
{
    $email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits
    if (eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)) {
        //checks to make sure the email address is in a valid format
        $domain = explode( "@", $email ); //get the domain name
        if (@fsockopen ($domain[1],80,$errno,$errstr,3)) {
            //if the connection can be established, the email address is probably valid
            echo "Domain Name is valid ";
            return true;
        } else {
            echo "Con not a email domian";
            return false; //if a connection cannot be established return false
        }
        return false; //if email address is an invalid format return false
    }
}
Sachin
fuente
1
el puerto 80 no tiene sentido
jrosell
55
Creo que eso es solo verificar que el nombre de dominio existe en lugar de verificar el correo electrónico en sí.
The Angry Saxon
Esto podría ser más útil:getmxrr
jchook
1

Suponiendo que es la dirección del usuario , algunos servidores de correo permiten que el comando SMTP VRFY realmente verifique la dirección de correo electrónico en sus buzones. La mayor parte del sitio principal no le dará mucha información; la respuesta de gmail es "si intentas enviarlo por correo, intentaremos enviarlo" o algo así como inteligente.

Austin Salonen
fuente
1

Creo que no puedes, hay tantos escenarios en los que incluso el envío de un correo electrónico puede fallar. P.ej. el servidor de correo del lado del usuario está temporalmente inactivo, el buzón existe pero está lleno, por lo que el mensaje no se puede entregar, etc.

Esa es probablemente la razón por la que tantos sitios validan un registro después de que el usuario confirmó que ha recibido el correo electrónico de confirmación.

PhiLho
fuente
0

Puedo confirmar las respuestas de Joseph y Drew para usar RCTP TO: <address_to_check>. Me gustaría agregar algunas pequeñas adiciones sobre esas respuestas.

Proveedores generales

Algunos proveedores de correo implementan una política general, lo que significa que *@mydomain.comdevolverá positivo al RCTP TO:comando. Pero esto no significa necesariamente que el buzón "exista", como en "pertenece a un humano". Aquí no se puede hacer mucho, solo ten en cuenta.

IP Greylisting / Blacklisting

Lista gris: la primera conexión de IP desconocida está bloqueada. Solución: vuelva a intentarlo al menos 2 veces.

Lista negra: si envía demasiadas solicitudes desde la misma IP, esta IP se bloquea. Solución: utilice la rotación de IP; Reacher usa Tor.

Solicitudes HTTP en formularios de registro

Esto es muy específico del proveedor, pero a veces puede usar solicitudes HTTP bien diseñadas y analizar las respuestas de estas solicitudes para ver si un nombre de usuario ya está registrado o no con este proveedor.

Aquí está la función relevante de una biblioteca de código abierto que escribí para verificar *@yahoo.comdirecciones usando solicitudes HTTP: check-if-email-exist . Sé que mi código es Rust y este hilo está etiquetado como PHP, pero se aplican las mismas ideas.

Bandeja de entrada completa

Este podría ser un caso extremo, pero cuando el usuario tiene una bandeja de entrada llena, RCTP TO:devolverá un 5.1.1 DSNmensaje de error que dice que está lleno. ¡Esto significa que la cuenta realmente existe!

Divulgar

Corro Reacher , una API de verificación de correo electrónico en tiempo real. Mi código está escrito en Rust y es 100% de código abierto. Compruébalo si quieres una solución más robusta:

Github: https://github.com/amaurymartiny/check-if-email-exists

Con una combinación de varias técnicas para saltar a través de los aros, logro verificar alrededor del 80% de los correos electrónicos que revisan mis clientes.

amaurymartiny
fuente
-8
<?php

   $email = "someone@exa mple.com";

   if(!filter_var($email, FILTER_VALIDATE_EMAIL))
      echo "E-mail is not valid";
   else
      echo "E-mail is valid";

?>
usuario4314333
fuente
El usuario está pidiendo una solución .Net no php.