Проверить электронную почту на Java - PullRequest
33 голосов
/ 30 сентября 2008

Есть ли способ проверить в коде Java, что адрес электронной почты действителен. Под действительным я не просто имею в виду, что он в правильном формате (somebody@domain.subdomain), но это реальный активный адрес электронной почты.

Я почти уверен, что нет 100% надежного способа сделать это, потому что такая техника была бы мечтой спаммера. Но, возможно, есть какая-то техника, которая дает полезную информацию о том, является ли адрес «реальным» или нет.

Ответы [ 9 ]

51 голосов
/ 30 сентября 2008

Вот что у меня есть. Чтобы проверить, что адрес является допустимым форматом, вот регулярное выражение, которое проверяет, что это почти 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, что, безусловно, более точно, чем мое регулярное выражение.

3 голосов
/ 01 октября 2008

Вы не можете реально проверить, существует ли электронная почта, см. Мой ответ на очень похожий вопрос здесь: Email SMTP validator

2 голосов
/ 21 сентября 2011

Apache commons предоставляет класс валидатора электронной почты , который вы можете использовать. Просто передайте свой адрес электронной почты в качестве аргумента методу isValid.

2 голосов
/ 30 сентября 2008

Без отправки электронного письма может быть сложно получить 100%, но если вы выполните поиск DNS на хосте , который должен по крайней мере сказать вам, что это жизнеспособная система назначения.

1 голос
/ 20 августа 2012

Вы можете быть уверены только в том, что отправите письмо и прочитаете его.

Пусть ваш процесс регистрации имеет шаг, который требует ответа на информацию, найденную только в электронном письме. Это то, что делают другие.

1 голос
/ 30 сентября 2008

Выполните поиск DNS по имени хоста, чтобы увидеть, существует ли он. Вы также можете теоретически инициировать соединение с почтовым сервером и посмотреть, говорит ли он вам, существует ли получатель, но я думаю, что многие серверы делают вид, что знают адрес, а затем отклоняют письмо в любом случае.

0 голосов
/ 08 ноября 2012
public static boolean isValidEmail(String emailAddress) {
    return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+\\.[a-z]+");
} 
0 голосов
/ 20 августа 2012

Если вы используете GWT, вы не можете использовать InternetAddress, и шаблон, предоставленный MBCook, довольно страшен.

Вот менее страшное регулярное выражение (может быть, не так точно):

public static boolean isValidEmail(String emailAddress) {
    return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+\\.[a-z]+");
}
0 голосов
/ 16 января 2012

Я не уверен на 100%, но нельзя ли отправить SMTP-команду RCPT на почтовый сервер, чтобы определить, является ли получатель действительным? Проверить правильность хоста MX будет даже дороже, чем приведенное выше предложение, но оно также будет наиболее точным.

...