Vérifier le courriel en Java

est-il possible de vérifier en code Java qu'une adresse e-mail est valide. Par valide, Je ne veux pas seulement dire que c'est dans le bon format (quelqu'un@domaine.subdomain), mais c'est une adresse e-mail très active.

je suis presque certain qu'il n'y a pas de façon fiable à 100% de le faire, parce qu'une telle technique serait la matière des rêves de spammer. Mais peut-être qu'il y a une technique qui donne une indication utile pour savoir si une adresse est "réelle" ou non.

33
demandé sur Tim Cooper 2008-09-30 19:59:46

9 réponses

voici ce que j'AI autour. Pour vérifier que l'adresse est un format valide, voici un regex qui vérifie qu'il est presque rfc2822 (il n'attrape pas quelques cas de coin bizarres). 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");
}

qui 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. Il 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

J'ai aussi trouvé ça sur le net. Il est venu de ce lien .

si les deux passent, vous avez de bonnes chances d'avoir une adresse valide. Si l'adresse, c'est l'auto (et pas seulement le domaine), il n'est pas plein, etc... tu ne peux vraiment pas vérifier ça.

la deuxième vérification est à forte intensité de temps . Cela peut prendre de quelques millisecondes à plus de 30 secondes (si le DNS ne répond pas). Ce n'est pas quelque chose d'essayer de courir en temps réel pour les grands nombres de personnes.

Espérons que cette aide.

MODIFIER

je tiens à souligner que, au moins au lieu de l'expression rationnelle, il y a de meilleures façons de vérifier la validité. Don et Michael font remarquer Qu'Apache Commons a quelque chose, et j'ai récemment découvert que vous pouvez l'utiliser .valider () sur InternetAddress pour que Java vérifie que l'adresse est vraiment RFC-8222, ce qui est certainement plus précis que mon regex.

51
répondu MBCook 2011-09-21 15:40:19

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
répondu WMR 2017-05-23 12:33:26

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

2
répondu Joe Skora 2008-09-30 16:02:19

Apache commons fournit un "151910920 mail" validateur trop, que vous pouvez utiliser. Il suffit de passer votre adresse e-mail comme argument à la méthode isValid.

2
répondu Ashkan Aryan 2011-09-21 15:46:57

fait une recherche DNS sur le nom d'hôte pour voir si cela existe. Vous pouvez théoriquement aussi initier une connexion au serveur de messagerie et voir si elle vous dit si le destinataire existe, mais je pense que de nombreux serveurs prétendent qu'ils connaissent une adresse, puis rejettent l'e-mail de toute façon.

1
répondu Lasar 2008-09-30 16:04:24

le seul moyen d'en être certain est d'envoyer un courrier et de le faire lire.

laissez votre processus d'inscription avoir une étape qui exige de répondre à l'information trouvée seulement dans le courriel. C'est ce que font les autres.

1
répondu Thorbjørn Ravn Andersen 2012-08-20 06:19:59

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 coûteux que la suggestion ci-dessus de vérifier la validité d'un hôte MX, mais ce serait aussi le plus précis.

0
répondu Aquarelle 2012-01-15 21:47:32

si vous utilisez GWT, vous ne pouvez pas utiliser InternetAddress, et le modèle fourni par MBCook est assez effrayant.

voici un regex moins effrayant (pourrait ne pas être aussi précis):

public static boolean isValidEmail(String emailAddress) {
    return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+\.[a-z]+");
}
-1
répondu Craigo 2012-08-20 05:11:34
public static boolean isValidEmail(String emailAddress) {
    return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+\.[a-z]+");
} 
-2
répondu asa 2012-11-08 06:42:17