validar validacion texto regulares para nombre expresiones expresion existe electronico correo comprobar codigo cajas java email verify

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.



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]+"); }