web-dev-qa-db-ja.com

Java

Javaコードで電子メールアドレスが有効であることを確認する方法はありますか。有効であることは、それが正しい形式([email protected])であることを意味するだけではありません)、しかし、それは実際にアクティブな電子メールアドレスです。

このような手法はスパマーの夢のようなものであるため、これを行うための100%信頼できる方法はないと確信しています。しかし、おそらくアドレスが「本物」であるかどうかについて有用な指標を提供するいくつかのテクニックがあるでしょう。

33
Dónal

これが私の周りにあるものです。アドレスが有効な形式であることを確認するために、これがほぼ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が応答せず、タイムアウトした場合)。多数の人がリアルタイムで試して実行するものではありません。

お役に立てれば。

[〜#〜]編集[〜#〜]

少なくとも正規表現の代わりに、基本的な有効性をチェックするためのより良い方法があることを指摘したいと思います。ドンとマイケルは、Apache Commonsに何かがあることを指摘し、最近、InternetAddressで.validate()を使用してJavaアドレスが本当にRFC-8222であることを確認できることを確認しました。私の正規表現よりも正確です。

51
MBCook

電子メールが存在することを実際に確認することはできません。非常によく似た質問に対する私の回答をここで参照してください。 Email SMTP validator

3
WMR

電子メールを送信しないと100%を取得するのは難しいかもしれませんが、ホストでDNSルックアップを実行するの場合、少なくともそれが実行可能な宛先システムであることを伝えるはずです。

2
Joe Skora

Apache commonsは email validator class も提供しており、これを使用できます。 isValidメソッドの引数としてメールアドレスを渡すだけです。

2
Ashkan Aryan

ホスト名でDNSルックアップを実行して、それが存在するかどうかを確認します。理論的にはメールサーバーへの接続を開始して、受信者が存在するかどうかがわかるかどうかを確認することもできますが、多くのサーバーはアドレスを知っていると偽って、とにかくメールを拒否します。

1
Lasar

確実に確認できる唯一の方法は、実際にメールを送信して読んでもらうことです。

登録プロセスに、電子メールでのみ見つかる情報への応答を必要とするステップを持たせます。これは他の人がすることです。

100%確信はありませんが、[〜#〜] rcpt [〜#〜] SMTPコマンドをメールサーバーに送信して、受信者が有効かどうかを判断することはできませんか?有効なMXホストを確認することは、上記の提案よりもさらに費用がかかりますが、最も正確です。

0
Aquarelle