Вопрос по java, email, verify – Проверить электронную почту на Java

33

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

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

Этот вопрос также будет полезен при ответе на этот вопрос:как-далеко должен-один-бери электронной почты адрес валидация David

Ваш Ответ

9   ответов
1

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

Я думаю, что некоторые / большинство серверов заносят вас в черный список, если вы делаете это (спрашивая почтовый сервер, существует ли получатель). opyate
-2
public static boolean isValidEmail(String emailAddress) {
    return emailAddress.contains(" ") == false && emailAddress.matches("[email protected]+\\.[a-z]+");
} 
Да нет Если вы хотите проверять адреса электронной почты с помощью регулярных выражений, вам нужно использовать этого зверя (чтобы увеличить для комментария):ex-parrot.com/~pdw/Mail-RFC822-Address.html 0x89
Добро пожаловать в ТАК. Пожалуйста, объясните код, когда вы отвечаете. Tim
Вы, кажется, не читали вопрос вообще. ОП специально сказал, что онине ищем, если формат адреса был действительным, но если адрес является «реальным, живым» адресом. Andrew Barber
Голосование за удаление как дубликатstackoverflow.com/a/12032525/581205. maaartinus
-1

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

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

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

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

1

что отправите письмо и прочитаете его.

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

Лично я все время пользуюсь услугами временной почты. подобноGuerrillamail например. Таким образом, даже если вы «анализируете» действующий адрес электронной почты .. действительно ли он действителен? Пока пользователь нажимает на ссылку - Да. Через неделю? Может быть. Как я вижу, вы должны переделать свой дизайн. Не просите о электронной почте все время, позвольте пользователям анонимно пользоваться вашими услугами и попросите их зарегистрировать новую личную учетную запись только для дополнительных преимуществ, которые они действительно ищут. Martin Andersson
3

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

0

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

Возможно, да. Скорее всего, на работу, нет. Thorbjørn Ravn Andersen
2

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

Поиск DNS не обязательно является хорошей идеей, потому что запись DNS может иметь запись MX, но не запись для хоста. FelixM
51

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

FWIW регулярное выражение, кажется, не позволяет периоды "." в именной части адреса Scott
Да:commons.apache.org/validator/apidocs/org/apache/commons/... Michael Myers♦
Это не отвечает на вопрос. Thorbjørn Ravn Andersen
Я думаю, что у Apache commons есть валидатор электронной почты, который вы могли бы использовать вместо этого регулярного выражения. Dónal
Ну, что ты знаешь? Апач имеет так много хороших вещей в общем достоянии. Я согласен, что регулярное выражение отвратительно. Я рад, что мне не пришлось это писать. MBCook

Похожие вопросы