Проверка электронной почты RFC 2821 с использованием Java
Я работаю над проверкой электронной почты, используя Java, имея в виду RFC 2821. Я использовал следующий код для проверки всех моих адресов электронной почты:
InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();
Java API говорит, что соответствует RFC-822. Есть ли большая разница между RFC 2821 и 822?
Также приведенный выше API не может проверить электронную почту в следующих случаях:
var@yahoo
- проверка возвращает true, но это неверный адрес электронной почтыvar(comment)@yahoo.com
- проверка возвращает ложь, но это действительный адрес электронной почты
Можете ли вы сказать мне какую-нибудь работу для этого, чтобы сделать это.
2 ответа
Существуют большие различия между тем, как обрабатываются современные адреса электронной почты по сравнению с адресами электронной почты в исходных стандартах.
Из того, что я испытал при настройке адресов dns & bind, вы можете указать доменное имя без точки, но при запросе распознавателя он добавит .
до конца доменного имени. Вы также можете указать прямое отображение в файле хостов. Большинство файлов hosts содержат разрешение localhost следующим образом:
127.0.0.1 localhost loopback
Это означает, что если вы находитесь на сервере с почтовым сервером, вы можете отправить действительное письмо на user@localhost
,
Согласно RFC 822:
В случае формальной регистрации организация реализует (распределенную) базу данных, которая предоставляет услугу сопоставления адреса с маршрутом для адресов в форме:
person@registry.organization
Обратите внимание, что "организация" - это логическая сущность, отдельная от любой конкретной сети связи.
Механизм доступа к "организации" универсален.
Этот механизм, в свою очередь, стремится к созданию реестра; его местоположение не указывается в спецификации адреса. Предполагается, что система, которая работает под названием "организация", знает, как найти подчиненный регистр. Затем реестр будет использовать строку "person", чтобы определить, куда отправлять почтовую спецификацию.В последнем случае, ориентированном на сеть, допускается простая, прямая спецификация адреса, связанная с вложением, например:
user@host.network
В случае user@host.network
в локальных системах, если система электронной почты настроена правильно, вы можете отправлять электронные письма user@host
, Несмотря на то, что это не полное доменное имя - полностью определенное доменное имя, к которому мы привыкли, этот стандарт появился намного позже. Почтовая система затем использует псевдоним, чтобы отправить его в правильную локальную сеть, переводя электронную почту на user@host.network
, Проблемы с подделкой электронной почты возникли лишь позже, когда ARPAnet стал общедоступным.
О комментариях в адресе, которых не было в RFC 822. Согласно более поздней спецификации электронной почты, которая допускает комментарии ( RFC 2822, раздел 3.4):
Кроме того, поскольку некоторые устаревшие реализации интерпретируют комментарий, комментарии, как правило, НЕ ДОЛЖНЫ использоваться в полях адреса, чтобы избежать путаницы в таких реализациях.
То есть старые системы не допускают комментарии в адресах. RFC 822 не упоминает комментарии в адресе электронной почты.
Техническое исправление будет состоять в том, чтобы запретить комментарии в адресе электронной почты, если вы не добавите их с помощью специального кода. Вы всегда можете обновить Javamail. Более новые реализации поддерживают обновленные RFC.
Считаю, что вы хотите проверить идентификаторы электронной почты, которые используются в настоящее время и на самом деле не соответствуют никаким RFC. Для нашего проекта мы создали собственный очень простой валидатор электронной почты. Зачем? Apache и java mail one используют regex, и есть некоторые случаи (я не знаю, которые, поскольку мы не печатали электронные письма в журнале), которые заставляют regex входить в цикл навсегда. Это означает, что поток обработчика клиента входит в цикл, и пользователь видит пустой экран!
Итак, что мы делаем, так это позволяем новым идентификаторам электронной почты выглядеть так, как они выглядят на сайтах, таких как google/ yahoo.
Значение somecahrs@xyz.com
Что мы проверяем Не более 1 @ Проверьте наличие 1 или более символов до @ После @ есть несколько символов + одна точка по крайней мере + символы после точки
Не получал никаких жалоб за последние два года. Кроме того, в большинстве случаев вам нужно отправить человеку электронное письмо, чтобы убедиться, что домен существует и т. Д., И ссылку с уникальным токеном (подтверждение регистрации), чтобы убедиться, что этот человек владеет идентификатором электронной почты (с сообщением для реального владельца только нажмите, если они пришли на ваш сайт)
/**
* minimum email l@n.co
* */
public static boolean checkEmail(final String emlId, int dbgPrint) {
// ex:ak@bv.gh
if (emlId == null){
return false;
}
final int lngth = emlId.length();
if (lngth < 6) {
if (dbgPrint > 1) {
System.out.println(" lngth < 6");
}
return false;
}
final int locationAt = emlId.indexOf('@');
if (locationAt < 1) {
if (dbgPrint > 1) {
System.out.println("locationAt < 1 : " + locationAt);
}
return false;//
}
final int postLastPeriod = emlId.lastIndexOf('.');
if (postLastPeriod < 0) {
if (dbgPrint > 1) {
System.out.println("postLastPeriod < 0, locationAt " + locationAt);
}
return false;
}
if (dbgPrint > 1) {
System.out.println(" locationAt " + locationAt + ", postLastPeriod :" + postLastPeriod + " lngth " + lngth);
}
if (lngth - postLastPeriod < 3) {
if (dbgPrint > 1) {
System.out.println(" lngth - postLastPeriod < 2");
}
return false;
}
if (postLastPeriod - locationAt < 1) {
if (dbgPrint > 1) {
System.out.println(" postLastPeriod - locationAt < 1");
}
return false;
}
return true;
}