2010-07-15 15 views
6

Estoy codificando un sitio en php y actualmente estoy en la página de contacto y me preguntaba cuál era la mejor forma de validar una dirección de correo electrónico.Métodos de validación de la dirección de correo electrónico (botón Suscribir)

  1. ¿Al enviar un enlace de validación a su correo electrónico?
  2. Regex
  3. ¿Algún otro método?

También podría usted por qué y una guía a lo largo de mi camino para lograr que contar? No quiero que alguien me haga el código porque no es divertido para mí y no aprenderé, sino solo una guía sobre las técnicas utilizadas para lograr cualquiera de los métodos anteriores.

También voy a utilizar estos métodos para implementar un botón de suscripción en mi página web. ¿Es ésta la mejor manera de hacer ésto? cualquier otro método que debería condsider?

+1

Posible duplicado: http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses – Anax

+2

Regex no validará un correo electrónico, solo validará que la entrada del usuario se parece a un correo electrónico. ([email protected] validará) Si realmente necesita validar, debe enviar un correo electrónico de validación. – marvin

Respuesta

16

por lo general voy a través de estos pasos

  1. Regex
  2. Enviar un código de activación para el correo electrónico

si el primer paso falla nunca llega segundo paso. si el envío de correo electrónico falla debido a que el correo electrónico no existe elimino la cuenta o hacer algunas otras cosas

--edit

3 - Si por alguna razón el correo electrónico de activación no consigue enviado, correo electrónico doesn no se elimina, no se aprueba durante 7 días (o según lo configurado por usted), se intenta volver a enviar el correo electrónico cada 2-3 horas, después de esos días si no hay éxito, se borra el correo electrónico

4 - Si el correo electrónico se envió correctamente pero no se activa, no se aprueba, pero puede reactivarse en cualquier momento generando un nuevo código de activación

+0

También me gustaría agregar que, para comodidad del usuario, asignar al usuario no validado algún tipo de estado "preaprobado" para que cuando la entrega del correo sea lenta, el usuario aún puede hacer uso de sus servicios. Y además, no seas demasiado estricto en tu expresión regular, solo asegúrate de que 'parece una especie de dirección de correo electrónico', no quieres demasiados falsos negativos. –

+0

@Dennis: no creo que ingresar una dirección de correo electrónico plausible pero potencialmente falsa sea motivo suficiente para dar al usuario más acceso. –

+0

por favor no use una expresión regular para validar una dirección de correo electrónico. no es posible escribir una expresión regular que coincida exactamente con la especificación de RFC2822. terminará con falsos positivos y falsos negativos. Los falsos negativos son un gran problema porque impiden que las direcciones de correo electrónico válidas lleguen a su destino. Jeffrey Friedl desarrolló una expresión regular de correspondencia de correo electrónico en "Dominio de expresiones regulares". Tenía algo así como 7.000 caracteres de largo, y coincidía con el 98% de los formatos de dirección válidos. Es mejor usar una biblioteca que use esto. – bluesmoon

3

Eso depende de si el usuario realmente desea recibir una respuesta.

Si el usuario hace una pregunta, querrá una respuesta y probablemente dé su dirección de correo electrónico válida. En este caso, utilizaría una comprobación de expresiones regulares muy suelta para detectar errores tipográficos o una dirección faltante. (Algo así como [email protected]+.)

Si el usuario no desea que lo contactemos, pero usted desea saber su dirección, deberá trabajar con un enlace de validación. No hay otra manera de garantizar que la dirección de correo electrónico sea válida y pertenezca al usuario.

11

Creo que lo mejor es una combinación de 3 y 1.

En una fase inicial de comprobar sintácticamente la dirección de correo (para atrapar errores tipográficos):

filter_var($email, FILTER_VALIDATE_EMAIL) 

Y en un segundo envía un correo electrónico con una dirección de confirmación (para detectar errores e información deliberadamente incorrecta).

+5

+1 La gente necesita saber acerca de 'filter_var()', es increíble. – BoltClock

-1
function checkEmail($email) { 
    if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-]) 
    ↪*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", 
       $email)){ 
    list($username,$domain)=split('@',$email); 
    if(!checkdnsrr($domain,'MX')) { 
     return false; 
    } 
    return true; 
    } 
    return false; 
+1

Su expresión regular rechaza muchas direcciones de correo electrónico válidas. Por ejemplo *@example.com, "Hola mundo" @ example.com, alguien @ [127.0.0.1], alguien @ [2001: 1234: 1234 :: 1.2.3.4] – jcoder

+0

Mientras te dejaba salir con el ipv6 desajuste, el resto de la expresión regular es demasiado pobre para considerar. – symcbean

3

La única manera de saber realmente si un correo electrónico es válido o no es enviarle un correo electrónico. Si realmente tiene que hacerlo, use uno de these.Technically, ni siquiera tiene que haber ningún período después del @ para los dominios locales. Todo lo que es necesario es un dominio que sigue al @.

+2

Espere hasta que las personas comiencen a poner valores delimitados por dos puntos de IPV6 como su dominio. :-) –

1

Depende de su objetivo. Si debe tener un correo electrónico válido y activo, debe enviar un correo electrónico que requiera la verificación del recibo. En este caso, no hay necesidad de validaciones de expresiones regulares, excepto como una conveniencia para su usuario.

Pero si su deseo es ayudar al usuario a evitar errores tipográficos mientras minimiza la molestia del usuario, valide con expresiones regulares.

2

Un regex no es realmente adecuado para determinar la validez de la sintaxis de la dirección de correo electrónico, y la opción FILTER_VALIDATE_EMAIL para la función filter_var tampoco es confiable. Uso el EmailAddressValidator Class para probar la sintaxis de la dirección de correo electrónico.

He reunido algunos ejemplos de resultados incorrectos devueltos por filter_var (PHP Version 5.3.2-1ubuntu4.2). Probablemente hay más. Algunos son un poco extremos, pero vale la pena señalar:

RFC 1035 2.3.1. Sintaxis de nombre preferido
http://tools.ietf.org/search/rfc1035
Resumido como: un dominio consta de etiquetas separadas por separadores de puntos (no necesariamente cierto para dominios locales).

echo filter_var('[email protected]', FILTER_VALIDATE_EMAIL); 
// [email protected] 

RFC 1035 2.3.1. Sintaxis de nombre preferido
Las etiquetas deben seguir las reglas para los nombres de host ARPANET. Deben comenzar con una letra, y con una letra o un dígito, y tener como caracteres interiores solo letras, dígitos y guiones.

echo filter_var('[email protected]', FILTER_VALIDATE_EMAIL); 
// [email protected] 

RFC 2822 3.2.5. cadenas entre comillas
http://tools.ietf.org/html/rfc2822#section-3.2.5
Esto es válido (aunque es rechazada por muchos servidores de correo):

echo filter_var('name"quoted"[email protected]', FILTER_VALIDATE_EMAIL); 
// FALSE 

RFC 5321 4.5.3.1.1. Parte local
http://tools.ietf.org/html/rfc5321#section-4.5.3.1.1
La longitud total máxima de un nombre de usuario u otra parte local es de 64 octetos.
prueba con 70 caracteres:

echo filter_var('Abcdefg[email protected]example.com', FILTER_VALIDATE_EMAIL); 
// Abcdefg[email protected]example.com 

RFC 5321 4.5.3.1.2. Dominio
http://tools.ietf.org/html/rfc5321#section-4.5.3.1.2
La longitud total máxima de un nombre de dominio o número es de 255 octetos.
de prueba con 260 caracteres:

echo filter_var('[email protected]jAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com', FILTER_VALIDATE_EMAIL); 
// [email protected]jAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com 

Para consultar todas Validate an E-Mail Address with PHP, the Right Way para más información.

+1

El artículo de Doug Lovell de Linux Journal es erróneo en muchos casos. Repite los errores originales en RFC 3696 que ahora se han corregido en la errata. Desafortunadamente, Linux Journal no ha considerado apropiado corregir este artículo engañoso y todavía se lo cita como autoridad. –

2

Antes de enviar un correo electrónico de validación, también puede usar checkdnsrr() para verificar que el dominio exista y tenga configurados los registros MX. Esto detectará los correos electrónicos que usan dominios falsos (como [email protected]).

function validateEmail($email, $field, $msg = '') 
{ 
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) 
    { 
     return false; 
    } 
    list($user, $domain) = explode('@', $email); 
    if (function_exists('checkdnsrr') && !checkdnsrr($domain, 'MX')) 
    { 
     return false; 
    } 
    return true; 
} 

tenemos que utilizar para verificar function_exists()checkdnsrr() está disponible para nosotros, ya que no estaba disponible en Windows antes de PHP 5.3.

+1

¿Por qué crees que se requieren registros MX para enviar el correo electrónico? "Si no hay registros MX presentes, el servidor vuelve a A, es decir, realiza una solicitud para el registro A del mismo dominio". – sanmai

+0

@sanmai Aunque eso puede ser cierto en teoría, rara vez, o nunca, ves que eso suceda en la práctica. Además, cuando se trata de validar la dirección de correo electrónico, con la excepción de enviar un correo electrónico a la dirección y esperar una respuesta, ningún proceso automatizado será perfecto. Este método incluido Pero si las malas direcciones de correo electrónico que se proporcionan son un problema, esto ayudará a mitigar eso. –

+0

@ john-conde He visto esto suceder al menos un par de veces. Imagine que describe a un gerente por qué su cliente valioso no puede registrarse usando su dirección de correo electrónico que funciona (revisaron). – sanmai

4

La mejor manera de hacerlo es enviar un correo electrónico con un enlace de validación. Por lo menos, si no desea los correos electrónicos de activación, valide la dirección de correo electrónico. La mejor función de validación de correo electrónico es RFC-compliant email address validator by Dominic Sayers.

basta con incluir el archivo php en su proyecto y utilizar de esta manera:

if (is_email($email, $checkDNS, $diagnose)) //$checkDNS and $diagnose are false by default 
    echo 'Email valid'; 
else 
    echo 'Email invalid'; 
  • Si $ checkDNS se establece en true, se validará que existe el dominio. Si el dominio no existe, la función devuelve falso incluso si el correo electrónico es válido.
  • Si $ diagnostose está establecido en verdadero, la función devuelve un código en lugar de un booleano que le dirá por qué el correo electrónico no es válido (o 0 si es válido).
0

Algunas buenas respuestas aquí, y estoy de acuerdo con la elegida a excepción de la parte de expresiones regulares. Como otras personas han señalado, es difícil, si no imposible, encontrar una expresión regular que implemente por completo todas las peculiaridades de RFC 5321.

Le invitamos a utilizar mi función gratuita de PHP is_email() para validar las direcciones. Está disponible here.

Se asegurará de que una dirección sea totalmente compatible con RFC 5321. Opcionalmente, también puede verificar si el dominio existe realmente.

No debe confiar en un validador para decirle si realmente existe la dirección de correo electrónico de un usuario: algunos ISP entregan direcciones no compatibles a sus usuarios, particularmente en países que no usan el alfabeto latino. Más en mi ensayo sobre validación de correo electrónico aquí: http://isemail.info/about.

Cuestiones relacionadas