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

StackOverflow https://stackoverflow.com/questions/565504

Pregunta

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

¿Alguien ha intentado algo similar o funciona para usted? Se puede saber si un cliente de correo electrónico / usuario ingresa es correcta y existe?

¿Fue útil?

Solución

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

  1. Puede conectarse al servidor, y emitir un comando VRFY. Muy pocos servidores soportan este comando, sino que se pretende precisamente para este. Si el servidor responde con un DSN 2.0.0, existe el usuario.

    VRFY usuario

  2. Puede emitir un RCPT, y ver si se rechaza el correo.

    MAIL FROM: <>

    RCPT TO:

Si no existe el usuario, obtendrá un DSN 5.1.1. Sin embargo, sólo porque el correo electrónico no se rechaza, no quiere decir que existe el usuario. Algunos servidor silenciosamente descartar peticiones como esta para evitar la enumeración de sus usuarios. Otros servidores no pueden verificar al usuario, y tienen que aceptar el mensaje sin tener en cuenta.

También hay una técnica antispam denominada lista gris, lo que hará que el servidor para rechazar la dirección inicialmente, esperando un servidor real SMTP podría intentar una nueva entrega algún tiempo después. Esto se hace un lío hasta intentos para validar la dirección.

Sinceramente, si usted está tratando de validar una dirección de la mejor enfoque consiste en utilizar una expresión regular sencilla para bloquear direcciones no válidas y, obviamente, a continuación, enviar un correo electrónico real con un enlace de vuelta a su sistema que validará que se recibió el correo electrónico. Esto también asegura que el usuario entró en su correo electrónico real, no un ligero error tipográfico que pasa a pertenecer a otra persona.

Otros consejos

Otras respuestas aquí discutir los diversos problemas con tratar de hacer esto. Pensé en mostrar cómo se puede probar esto en caso de que quería aprender al hacerlo usted 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í está un ejemplo de prueba de una dirección de correo electrónico para stackoverflow.com:

C:\>nslookup -q=mx stackoverflow.com
Non-authoritative answer:
stackoverflow.com       MX preference = 40, mail exchanger = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com       MX preference = 10, mail exchanger = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com       MX preference = 20, mail exchanger = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com       MX preference = 30, mail exchanger = STACKOVERFLOW.COM.S9B1.PSMTP.com

C:\>telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 ready.  CA Business and Professions Code Section 17538.45 forbids use of this system for unsolicited electronic mail advertisements.

helo hi
250 Postini says hello back

mail from: <me@myhost.com>
250 Ok

rcpt to: <fake@stackoverflow.com>
550-5.1.1 The email account that you tried to reach does not exist. Please try
550-5.1.1 double-checking the recipient's email address for typos or
550-5.1.1 unnecessary spaces. Learn more at
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

Las líneas que comienzan con los códigos numéricos son las respuestas del servidor SMTP. He añadido algunas líneas en blanco para que sea más legible.

Muchos servidores de correo no volverán esta información como medio para prevenir contra la dirección de correo electrónico de recolección por los spammers, por lo que no pueden confiar en esta técnica. Sin embargo es posible que tenga cierto éxito en la limpieza de algunas direcciones de correo electrónico, obviamente, mediante la detección de los malos servidores de correo no válidos, o tener direcciones de los destinatarios rechazados como anteriormente.

Nótese también que los servidores de correo pueden lista negra que si haces demasiadas peticiones de ellos.


En PHP Creo que se puede utilizar fsockopen, fwrite y fread para llevar a cabo 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: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");

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

Dicho el método descrito allí es bastante eficaz. Se utiliza en el código de producción en ZoneCheck excepto que se utiliza en lugar de RSET QUIT.

Cuando la interacción del usuario con su buzón de correo no está overcostly muchos sitios realmente pone a prueba que el correo llegue algún lugar mediante el envío de un número secreto que debe ser enviado de vuelta al emisor (ya sea por ir a una dirección URL secreta o devolver este número secreto por correo electrónico ). La mayoría de las listas de correo funcionan así.

En realidad, no ..... algún servidor no puede comprobar la "RCPT TO:"

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

Si lo hace, es riesgo para la seguridad .....

Si el servidor de hacer, puede escribir un bot para el descubrimiento de todas las direcciones en el servidor ....

Esto se producirá un error (entre otros casos) cuando el servidor de correo de destino utiliza la lista gris.

Greylisting : servidor SMTP niega entrega la primera vez que un cliente previamente desconocido conecta, permite la próxima vez (s); esto mantiene un porcentaje de spam a cabo, al tiempo que permite el uso legítimo -. ya que se espera que un remitente de correo legítimo volverá a intentar , que es lo que los agentes de transferencia de correo normales harán

Sin embargo, si su código sólo comprueba en el servidor una vez , un servidor con la lista gris negarán entrega (como su cliente se conecta por primera vez); A menos que marque de nuevo dentro de un rato, puede ser incorrectamente rechazar las direcciones de correo electrónico válidas.

Algunas cuestiones:

  1. Estoy seguro que algunos servidores SMTP le hará saber de inmediato si una dirección que les dan no existe, pero algunos no como una medida de privacidad. Ellos sólo aceptan las direcciones que les das y silenciosamente ignorar las que no existen.
  2. Como dice el artículo, si lo hace demasiado a menudo con algunos servidores, que será la lista negra ti.
  3. En algunos servidores SMTP (como Gmail), es necesario utilizar SSL con el fin de hacer nada. Esto sólo es cierto cuando se utiliza el servidor SMTP de Gmail a Enviar correo electrónico.
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
    }
}

"¿Se puede saber si un cliente de correo electrónico / usuario ingresa es correcta y existe?"

En realidad se trata de dos cosas separadas. Podría existe , pero podría no ser correcta.

A veces hay que tomar las entradas del usuario en el valor nominal. Hay muchas maneras de derrotar el sistema de otra manera.

Todo lo que puedes hacer es buscar DNS y asegurar el dominio que está en la dirección de correo electrónico tiene un registro MX, aparte de eso no hay manera confiable de hacer frente a esto.

Algunos servidores pueden trabajar con el RCPT-con el método en el que habla con el servidor SMTP, pero depende totalmente de la configuración del servidor. Otro problema puede ser un servidor sobrecargado puede devolver un usuario diciendo 550 código es desconocido, pero esto es un error temporal, hay un error permanente (451 creo?) Que se puede devolver. Esto depende completamente en la configuración del servidor.

Yo personalmente comprobar el registro DNS MX, a continuación, enviar un correo electrónico de verificación si existe el registro MX.

A pesar de que esta pregunta es un poco viejo, este consejo servicio puede ayudar a los usuarios que buscan una solución similar comprobación de direcciones de correo electrónico más allá de validación de la sintaxis antes de enviar.

He estado usando este abrir el servicio de origen para una validación más en profundidad de los mensajes de correo electrónico (comprobación para los registros MX del dominio de la dirección de e-mail, etc.) para algunos proyectos con buenos resultados. También comprueba para los errores tipográficos comunes bruja es bastante útil. Demostración aquí .

Si se asume que es de direcciones del usuario, algunos servidores de correo no permitir que el comando SMTP VRFY para realmente verificar la dirección de correo electrónico frente a sus buzones. La mayor parte del principal sitio no le dará mucha información; la respuesta Gmail es "si intenta enviarlo por correo, vamos a tratar de entregar" o algo inteligente como eso.

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

Eso es probablemente por qué tantos sitios validar un registro después de que el usuario ha confirmado que han recibido el correo electrónico de confirmación.

<?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";

?>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top