電子メール アドレスが有効であることを Java コードで確認する方法はありますか。有効とは、単に正しい形式 (someone@domain.subdomain) であることを意味するのではなく、実際にアクティブな電子メール アドレスであることを意味します。
これを行うための 100% 信頼できる方法はないとほぼ確信しています。しかし、おそらく、アドレスが「本物」かどうかについて有用な指標を提供するテクニックがいくつかあります。
これが私の周りにあるものです。アドレスが有効な形式であることを確認するために、rfc2822 に近いことを検証する正規表現を次に示します (奇妙なコーナー ケースは検出されません)。昨年、ネットで見つけました。
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");
}
これにより、単純な構文が処理されます (ほとんどの場合)。私が知っているもう 1 つのチェックでは、ドメインに MX レコードがあるかどうかを確認できます。次のようになります。
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
これもネットで見つけました。このリンクから来ました。
これらの両方に合格すると、有効なアドレスを取得できる可能性が高くなります。アドレスが(ドメインだけでなく)自分自身であるか、完全ではないかなどについては...実際に確認することはできません。
2 番目のチェックは時間がかかることに注意してください。ミリ秒から 30 秒以上かかる場合があります (DNS が応答せず、タイムアウトした場合)。大勢の人のためにリアルタイムで実行しようとするものではありません。
お役に立てれば。
編集
少なくとも正規表現の代わりに、基本的な有効性を確認するためのより良い方法があることを指摘したいと思います。Don と Michael は、Apache Commons には何かがあると指摘しています。私は最近、InternetAddress で .validate() を使用して、アドレスが実際に RFC-8222 であることを Java に確認させることができることを発見しました。これは、私の正規表現よりも確実に正確です。
メールが存在することを実際に確認することはできません。非常によく似た質問に対する私の回答を参照してください:メール SMTP バリデーター
Apache commons には、使用できる電子メール バリデータ クラスも用意されています。メールアドレスを引数として isValid メソッドに渡すだけです。
電子メールを送信せずに 100% を取得するのは難しいかもしれませんが、ホストで DNS ルックアップを実行すると、少なくともそれが実行可能な宛先システムであることがわかるはずです.
確実にできる唯一の方法は、実際にメールを送信して読んでもらうことです。
登録プロセスに、電子メールにのみ記載されている情報への応答を必要とするステップを持たせます。これは他の人がすることです。
ホスト名で DNS ルックアップを実行して、それが存在するかどうかを確認します。理論的には、メールサーバーへの接続を開始して、受信者が存在するかどうかを確認することもできますが、多くのサーバーはアドレスを知っているふりをして、とにかくメールを拒否すると思います.
100% 確信があるわけではありませんが、RCPT SMTP コマンドをメール サーバーに送信して、受信者が有効かどうかを判断することはできませんか? 有効な MX ホストをチェックするには、上記の提案よりもさらにコストがかかりますが、最も正確でもあります。
GWT を使用している場合、InternetAddress を使用することはできず、MBCook によって提供されるパターンはかなり恐ろしいものです。
これはそれほど怖くない正規表現です (正確ではないかもしれません):
public static boolean isValidEmail(String emailAddress) {
return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+\\.[a-z]+");
}
public static boolean isValidEmail(String emailAddress) {
return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+\\.[a-z]+");
}