Esta pregunta es bastante frecuente, cualquier sistema que utilice el correo electrónico debería tener algún tipo de validación para evitar errores y datos basura.
Antes que nada hay que tener por seguro que no hay forma (rápida y práctica) de comprobar que una dirección de correo existe y tiene a un usuario detrás, solamente se puede comprobar que la dirección tiene una forma válida y apunta a un dominio activo.
Hay varias formas de encarar el problema, como suele suceder. Hay sistemas que simplemente validan que la información ingresada contenga una arroba, hay otros que usan expresiones regulares complejas que fallan en cuanto la dirección ingresada no es "común" (aunque sea válida).
La forma que voy a plantear no es novedosa, y es bastante sencilla, a la vez que efectiva.
Una expresión regular permisiva
Y con "permisiva", me refiero a que debe poder validar a cualquier dirección de correo válida, esto quiere decir que debe ser también bastante genérica.
El patrón debe validar que exista una arroba, un nombre de usuario, y una parte que indique el dominio.
A pesar de que probablemente nunca se usen nombres de usuario complejos en una dirección de correo, la verdad es que se puede usar cualquier caracter en esta parte de la dirección.
Por lo que la expresión regular que debe validar esto no puede ser otra que
.+
Que simplemente indica "al menos 1 caracter".
El dominio es un poco más complicado. Muchos cometen el error de solamente permitir dos o tres partes separadas por punto, o rechazar direcciones cuya última parte contenga más de 3 caracteres. Con esto se supone que incluyen a todos los dominios de primer nivel (.com, .net, .org… y los de los países, que tienen 2 letras). Pero se olvidan que Internet cambia, y ya tenemos TLD .info (de cuatro letras) e incluso .museum.
Así que en esta parte hay que ser permisivos. Más aún si se considera que lentamente están apareciendo los dominios con "ñ" y demás letras españolas, y que quizás pronto las direcciones comiencen a aceptar más caracteres UTF-8.
Así que el patrón para validar el dominio es simple: al menos 2 secuencias de caracteres separadas por un punto. No puede haber un dominio que sea solamente una palabra, ya que se trataría de direcciones de red local. Estas direcciones son perfectamente válidas en una red local, pero no en internet.
.+\..+
Este patrón indica: "una secuencia de caracteres no vacía, seguida de un punto, y seguida de otra secuencia de caracteres no vacía".
Juntando las partes, el patrón queda:
^.+@.+\..+$
Validación del dominio
Una versión anterior de este artículo recomendaba validar el dominio con checkdnsrr(). Esta parte ha sido eliminada. El motivo es bastante simple, a decir verdad.
La función checkdnsrr solamente puede determinar si un dominio tiene un registro DNS asociado. Esto no implica que el servidor esté activo (o que haya un servidor de correo en el dominio).
Otras opciones, como gethostbyname por ejemplo, tienen sus propios problemas:
- Pueden fallar si el servidor remoto está temporalmente fuera de servicio, lo cual no es tan extraño en servidores pequeños.
- Si el host remoto no existe, la llamada a gethostbyname demora mucho en completarse, no por PHP sino por la forma en la que funciona el protocolo DNS.
- Podría haber un fallo de conectividad temporal de parte del servidor que ejecuta el programa PHP, lo cual provocaría que la función fallase.
Por estos motivos es que la validación del dominio funcionará en la mayoría de los casos pero fallará en otros. Y si no se puede saber que será exitosa en todos los casos, no se puede confiar en ella.
De todas formas se incluyen los enlaces a las páginas del manual de PHP que corresponden a estas funciones, para que cada uno decida si hacer la validación o no.
Vale recordar lo que se mencionó al principio: no existe forma práctica de comprobar con certeza que la dirección es válida aún cuando se pudiese validar el dominio, dado que la dirección podría ser válida en forma pero no existir en el servidor, o podría estar mal escrita por error.
La única manera de saber con seguridad si la dirección es válida es enviar un correo de confirmación antes de habilitar al usuario a continuar en el sitio. Pero esto tampoco es la solución en todos los casos; a veces solicitar confirmación al usuario no tiene sentido (por ejempo en un formulario de contacto).
He aquí entonces, el código de la función completa:
function validarCorreo($correo) {
return ereg('^.+@(.+\..+)$', $correo);
}
A modo de resumen: la validación de direcciones de correo es compleja y no vale la pena intentar validar más que la forma. La mayoría de los métodos más estrictos con los que uno se puede llegar a encontrar suelen rechazar direcciones perfectamente correctas (aunque relativamente raras).











25/06/2008, a las 17:49
comprobar el correo
25/06/2008, a las 17:50
comprobar si ese el correo