Вот что у меня есть. Чтобы проверить, что адрес является допустимым форматом, вот регулярное выражение, которое проверяет, что это почти 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");
}
Это позаботится о простом синтаксисе (по большей части). Другая проверка, о которой я знаю, позволит вам проверить, есть ли в домене запись 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
Это я тоже нашел в инете. Пришло от этой ссылки .
Если они оба пройдут, у вас будет хороший шанс получить действительный адрес. Что касается адреса, который он сам (не только домен), он не заполнен и т. Д., Вы действительно не можете это проверить.
Обратите внимание, что вторая проверка требует много времени . Это может занять от миллисекунд до> 30 секунд (если DNS не отвечает и время ожидания истекло). Это не то, что можно попробовать и запустить в режиме реального времени для большого количества людей.
Надеюсь, это поможет.
EDIT
Я хотел бы отметить, что, по крайней мере, вместо регулярных выражений, есть более эффективные способы проверки базовой валидности. Дон и Майкл отмечают, что в Apache Commons есть что-то, и я недавно обнаружил, что вы можете использовать .validate () в InternetAddress, чтобы Java проверяла, что адрес действительно RFC-8222, что, безусловно, более точно, чем мое регулярное выражение.