Проверка электронной почты в Java
Есть ли способ проверить в Java-коде, что адрес электронной почты действителен. Действительно, я имею в виду не только то, что он в правильном формате ([email protected]), но и является настоящим активным адресом электронной почты.
Я почти уверен, что нет 100% надежного способа сделать это, потому что такой метод будет материалом спамерских снов. Но, возможно, есть какая-то техника, которая дает некоторые полезные указания о том, является ли адрес "реальным" или нет.
Ответы
Ответ 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]+");
}