php - validas - verificar si cuenta existe
¿Cómo verificar si existe una dirección de correo electrónico sin enviar un correo electrónico? (13)
Me he encontrado con este código PHP para verificar la dirección de correo electrónico utilizando SMTP sin enviar un correo electrónico .
¿Alguien ha intentado algo similar o funciona para usted? ¿Puede decir si un cliente / usuario de correo electrónico entra es correcto y existe?
"¿Puedes decir si un cliente / usuario de correo electrónico entra es correcto y existe?"
En realidad, estas son dos cosas separadas. Puede existir, pero podría no ser correcto.
A veces debes tomar las entradas del usuario al valor nominal. De lo contrario, hay muchas formas de vencer al sistema.
Algunos asuntos:
- Estoy seguro de que algunos servidores SMTP le permitirán saber 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 silenciosamente las que no existen.
- Como dice el artículo, si haces esto con demasiada frecuencia con algunos servidores, te pondrán en una lista negra.
-
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.
Asumiendo que es la dirección del usuario , algunos servidores de correo permiten que el comando SMTP VRFY verifique realmente la dirección de correo electrónico contra sus buzones. La mayoría del sitio principal no le dará mucha información; la respuesta de Gmail es "si intentas enviarla por correo, intentaremos entregarla" o algo así.
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 la sintaxis antes del envío.
He estado utilizando este servicio de fuente abierta para una validación más profunda de los correos electrónicos (verificando los registros de mx en el dominio de la dirección de correo electrónico, etc.) para algunos proyectos con buenos resultados. También busca errores de tipeo comunes que son bastante útiles. Demostración here .
Creo que no se puede, hay tantos escenarios donde 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 no se puede enviar el mensaje, etc.
Esa es probablemente la razón por la que muchos sitios validan un registro después de que el usuario confirme que recibió el correo electrónico de confirmación.
Esto fallará (entre otros casos) cuando el servidor de correo de destino usa greylisting.
Lista gris : el servidor SMTP rechaza la entrega la primera vez que un cliente desconocido se conecta, permite la (s) próxima (s) vez; esto mantiene cierto porcentaje de spambots, al tiempo que permite el 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 le negará la entrega (ya que su cliente se está conectando por primera vez); a menos que vuelva a verificar dentro de poco tiempo, puede estar rechazando de manera incorrecta las direcciones de correo electrónico válidas.
Hay dos métodos que a veces puede usar para determinar si realmente existe un destinatario:
Puede conectarse al servidor y emitir un comando VRFY. Muy pocos servidores admiten este comando, pero está destinado exactamente a esto. Si el servidor responde con un DSN 2.0.0, el usuario existe.
Usuario de VRFY
Puede emitir un RCPT y ver si el correo es rechazado.
CORREO DESDE: <>
RCPT A: <usuario @ dominio>
Si el usuario no existe, obtendrá un DSN 5.1.1. Sin embargo, solo porque el correo electrónico no sea rechazado, no significa que el usuario exista. Algunos servidores descartan 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 existe una técnica antispam llamada greylisting, que hará que el servidor rechace la dirección inicialmente, esperando que un servidor SMTP real intente una nueva entrega más tarde. Esto arruinará los intentos de validación de la dirección.
Honestamente, si intenta validar una dirección, lo mejor es usar una expresión regular simple para bloquear direcciones obviamente no válidas, y luego enviar un correo electrónico real con un enlace a su sistema que validará que se recibió el correo electrónico. Esto también asegura que el usuario ingrese su correo electrónico real, no un pequeño error que pertenezca a otra persona.
La respuesta general es que no puede verificar si existe una dirección de correo electrónico si envía un correo electrónico: podría entrar en un agujero negro.
Dicho esto, el método descrito allí es bastante efectivo. Se utiliza 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 de correo no es demasiado costosa, muchos sitios prueban que el correo llegue a alguna parte enviando un número secreto que debe enviarse 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í.
No realmente ..... Algún servidor no puede verificar el "rcpt a:"
http://www.freesoft.org/CIE/RFC/1123/92.htm
Hacerlo es riesgo de seguridad .....
Si el servidor lo hace, puede escribir un bot para descubrir cada dirección en el servidor ...
Otras respuestas aquí discuten los diversos problemas al tratar de hacer esto. Pensé que mostraría cómo podrías probar 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 .com
:
C:/>nslookup -q=mx .com Non-authoritative answer: .com MX preference = 40, mail exchanger = .COM.S9B2.PSMTP.com .com MX preference = 10, mail exchanger = .COM.S9A1.PSMTP.com .com MX preference = 20, mail exchanger = .COM.S9A2.PSMTP.com .com MX preference = 30, mail exchanger = .COM.S9B1.PSMTP.com C:/>telnet .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: <[email protected]> 250 Ok rcpt to: <[email protected]> 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 con prefijos de códigos numéricos son respuestas del servidor SMTP. Agregué algunas líneas en blanco para hacerlo más legible.
Muchos servidores de correo no devolverán esta información como un medio para evitar que los spammers capturen direcciones de correo electrónico, por lo que no puede confiar en esta técnica. Sin embargo, puede tener cierto éxito al eliminar algunas direcciones de correo electrónico que son obviamente 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 ponerle una lista negra si realiza demasiadas solicitudes.
En PHP, creo que puedes usar fsockopen
, fwrite
y fread
para realizar los pasos anteriores de forma programática:
$smtp_server = fsockopen(".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");
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 manera confiable de manejar esto.
Algunos servidores pueden funcionar con el método rcpt-to donde usted 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 (¿451 creo?) 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 una verificación por correo electrónico si el registro MX existe.
<?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";
?>
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
}
}