web-dev-qa-db-fra.com

Vérifiez l'e-mail en Java

Existe-t-il un moyen de vérifier dans Java qu'une adresse e-mail est valide. Par valide, je ne veux pas seulement dire qu'elle est au format correct (quelqu'[email protected]), mais c'est une véritable adresse e-mail active.

Je suis presque certain qu'il n'y a pas de moyen 100% fiable de le faire, car une telle technique ferait rêver les spammeurs. Mais peut-être y a-t-il une technique qui donne une indication utile pour savoir si une adresse est "réelle" ou non.

33
Dónal

Voici ce que j'ai autour. Pour vérifier que l'adresse est un format valide, voici une expression régulière qui vérifie qu'elle est presque rfc2822 (elle n'attrape pas certains cas de coin étranges). Je l'ai trouvé sur le net l'année dernière.

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

Cela prendra soin de la syntaxe simple (pour la plupart). L'autre vérification que je connais vous permettra de vérifier si le domaine a un enregistrement MX. Cela ressemble à ceci:

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

Cela, je l'ai aussi trouvé sur le net. Cela venait de ce lien .

Si ces deux réussissent, vous avez une bonne chance d'avoir une adresse valide. Quant à savoir si l'adresse elle-même (pas seulement le domaine), elle n'est pas complète, etc ... vous ne pouvez vraiment pas vérifier cela.

Notez que la deuxième vérification est longue . Cela peut prendre de quelques millisecondes à> 30 secondes (si le DNS ne répond pas et expire). Ce n'est pas quelque chose d'essayer de fonctionner en temps réel pour un grand nombre de personnes.

J'espère que cela t'aides.

[~ # ~] modifier [~ # ~]

Je voudrais souligner qu'au moins au lieu de l'expression régulière, il existe de meilleures façons de vérifier la validité de base. Don et Michael soulignent qu'Apache Commons a quelque chose, et j'ai récemment découvert que vous pouvez utiliser .validate () sur InternetAddress pour avoir Java vérifier que l'adresse est vraiment RFC-8222, ce qui est certainement plus précis que mon regex.

51
MBCook

Vous ne pouvez pas vraiment vérifier qu'un email existe, voir ma réponse à une question très similaire ici: Email SMTP validator

3
WMR

Sans envoyer un e-mail, il pourrait être difficile d'obtenir 100%, mais si vous faites une recherche DNS sur l'hôte cela devrait au moins vous dire qu'il s'agit d'un système de destination viable.

2
Joe Skora

Apache commons fournit également une classe de validation d'email , que vous pouvez utiliser. Passez simplement votre adresse e-mail comme argument à la méthode isValid.

2
Ashkan Aryan

Effectuez une recherche DNS sur le nom d'hôte pour voir s'il existe. Vous pourriez théoriquement également établir une connexion au serveur de messagerie et voir si cela vous indique si le destinataire existe, mais je pense que de nombreux serveurs prétendent connaître une adresse, puis rejettent le courrier électronique de toute façon.

1
Lasar

La seule façon d'être sûr est d'envoyer un courrier et de le lire.

Laissez votre processus d'inscription avoir une étape qui nécessite de répondre aux informations trouvées uniquement dans l'e-mail. C'est ce que font les autres.

1

Je ne suis pas sûr à 100%, mais n'est-il pas possible d'envoyer une commande RCPT SMTP à un serveur de messagerie pour déterminer si le destinataire est valide? Il serait encore plus cher que la suggestion ci-dessus de rechercher un hôte MX valide, mais ce serait aussi le plus précis.

0
Aquarelle