validacion - validar email javascript sin expresiones regulares
Verificar el correo electrónico en Java (9)
¿Hay alguna forma de verificar en el código de Java que una dirección de correo electrónico es válida? Por válido, no solo quiero decir que está en el formato correcto ([email protected]), sino que se trata de una dirección de correo electrónico real y activa.
Estoy casi seguro de que no hay una manera 100% confiable de hacer esto, porque tal técnica sería el objetivo de los sueños del spammer. Pero tal vez haya alguna técnica que brinde alguna indicación útil sobre si una dirección es "real" o no.
Apache commons también proporciona una clase de validador de correo electrónico , que puede usar. Simplemente pase su dirección de correo electrónico como argumento al método isValid.
Esto es lo que tengo alrededor. Para comprobar que la dirección es un formato válido, aquí hay una expresión regular que verifica que es casi rfc2822 (no detecta casos de esquina raros). Lo encontré en la red el año pasado.
private static final Pattern rfc2822 = Pattern.compile(
"^[a-z0-9!#$%&''*+/=?^_`{|}~-]+(?://.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?//.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
);
if (!rfc2822.matcher(email).matches()) {
throw new Exception("Invalid address");
}
Eso se encargará de la sintaxis simple (en su mayor parte). El otro cheque que conozco te permitirá verificar si el dominio tiene un registro MX. Se parece a esto:
Hashtable<String, String> env = new Hashtable<String, String>();
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
DirContext ictx = new InitialDirContext(env);
Attributes attrs = ictx.getAttributes(domainName, new String[] {"MX"});
Attribute attr = attrs.get("MX");
if (attr == null)
// No MX record
else
// If attr.size() > 0, there is an MX record
Esto, también lo encontré en la red. Vino de este enlace .
Si ambos pasan, tienes buenas posibilidades de tener una dirección válida. En cuanto a si la dirección es uno mismo (no solo el dominio), no está llena, etc ... realmente no puede verificar eso.
Tenga en cuenta que el segundo control requiere mucho tiempo . Puede demorar de milisegundos a> 30 segundos (si el DNS no responde y se agota el tiempo de espera). No es algo que se debe probar y ejecutar en tiempo real para un gran número de personas.
Espero que esto ayude.
EDITAR
Me gustaría señalar que, al menos en lugar de la expresión regular, hay mejores formas de verificar la validez básica. Don y Michael señalan que Apache Commons tiene algo, y recientemente descubrí que puedes usar .validate () en InternetAddress para que Java compruebe que la dirección es realmente RFC-8222, que sin duda es más precisa que mi expresión regular.
Haga una búsqueda de DNS en el nombre de host para ver si eso existe. En teoría, también podría iniciar una conexión con el servidor de correo y ver si le dice si el destinatario existe, pero creo que muchos servidores fingen que conocen una dirección, y luego rechazan el correo electrónico de todos modos.
La única manera de estar seguro es enviando un correo y haciéndolo leer.
Deje que su proceso de registro tenga un paso que requiera responder a la información que se encuentra solo en el correo electrónico. Esto es lo que otros hacen.
No estoy 100% seguro, pero ¿no es posible enviar un comando RCPT SMTP a un servidor de correo para determinar si el destinatario es válido? Sería incluso más costoso que la sugerencia anterior para buscar un host MX válido, pero también sería el más preciso.
Realmente no puedes verificar que exista un correo electrónico, consulta mi respuesta a una pregunta muy similar aquí: Email SMTP validator
Si está usando GWT, no puede usar InternetAddress, y el patrón proporcionado por MBCook es bastante aterrador.
Aquí hay una expresión regular menos aterradora (podría no ser tan precisa):
public static boolean isValidEmail(String emailAddress) {
return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+//.[a-z]+");
}
Sin enviar un correo electrónico, podría ser difícil obtener el 100%, pero si realiza una búsqueda de DNS en el host que al menos debería indicarle que es un sistema de destino viable.
public static boolean isValidEmail(String emailAddress) {
return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+//.[a-z]+");
}