Подтвердить что ты не робот

Проверка электронной почты в Java

Есть ли способ проверить в Java-коде, что адрес электронной почты действителен. Действительно, я имею в виду не только то, что он в правильном формате ([email protected]), но и является настоящим активным адресом электронной почты.

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

4b9b3361

Ответ 1

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

Надеюсь, что это поможет.

ИЗМЕНИТЬ

Я хотел бы указать, что, по крайней мере, вместо регулярного выражения есть лучшие способы проверить базовую достоверность. Дон и Майкл отмечают, что у Apache Commons есть что-то, и я недавно узнал, что вы можете использовать .validate() в InternetAddress, чтобы проверить Java, что адрес действительно RFC-8222, что, безусловно, более точно, чем мое регулярное выражение.

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

Единственный способ, которым вы можете быть уверенным, - это фактически отправить почту и прочитать ее.

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

Ответ 7

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

Ответ 8

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

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

public static boolean isValidEmail(String emailAddress) {
    return emailAddress.contains(" ") == false && emailAddress.matches("[email protected]+\\.[a-z]+");
}

Ответ 9

public static boolean isValidEmail(String emailAddress) {
    return emailAddress.contains(" ") == false && emailAddress.matches("[email protected]+\\.[a-z]+");
}