Проверка электронной почты RFC 2821 с использованием Java

Я работаю над проверкой электронной почты, используя java, имея в виду RFC 2821. Я использовал следующий код для проверки всех моих адресов электронной почты:

InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();

Java API говорит, что он совместим с RFC-822. Есть ли большая разница между RFC 2821 и 822?

Также вышеуказанный API не может проверить электронную почту в следующих случаях:

  1. var@yahoo - проверка возвращает true, но это неверный адрес электронной почты
  2. var(comment)@yahoo.com - проверка возвращает false, но это действующий адрес электронной почты

Можете ли вы сказать мне, как это сделать, чтобы это сделать.


person Varun Jindal    schedule 09.05.2013    source источник
comment
Вы уверены, что ar@yahoo должно быть недействительным? Я бы проверил, можно ли использовать общий домен верхнего уровня в качестве имени хоста.   -  person Matteo    schedule 09.05.2013
comment
И в документации говорится: проверьте часть адреса, поэтому я предполагаю, что все после @ игнорируется.   -  person Matteo    schedule 09.05.2013
comment
В предыдущем вопросе Apache Commons был предложен как лучший инструмент (stackoverflow.com/questions/624581/), но я только что попробовал, и он также не принимает комментарии.   -  person Matteo    schedule 09.05.2013


Ответы (2)


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

Из того, что я испытал при настройке адресов DNS и привязки, вы можете указать доменное имя без точки, но когда запрашивается распознаватель, он добавит . в конец имени домена. Вы также можете указать прямое сопоставление в файле hosts. Большинство файлов hosts содержат разрешение localhost следующим образом:

127.0.0.1 петля на локальном хосте

Это означает, что если вы находитесь на сервере с почтовым сервером, вы можете отправить действительное электронное письмо на user@localhost.

Согласно RFC 822:

В случае формальной регистрации организация реализует (распределенную) базу данных, которая предоставляет услугу сопоставления адресов с маршрутами для адресов в форме:

            [email protected]

Обратите внимание, что «организация» — это логическая сущность, отдельная от какой-либо конкретной коммуникационной сети.

Механизм доступа к «организации» общедоступен.
Этот механизм, в свою очередь, ищет экземпляр реестра; его местонахождение не указано в адресной спецификации. Предполагается, что система, работающая под названием «организация», умеет находить подчиненный реестр. Затем реестр будет использовать строку «person», чтобы определить, куда отправлять спецификацию почты.

Последний, ориентированный на сеть случай допускает простую, прямую, связанную с вложением адресную спецификацию, такую ​​как:

                 [email protected]

В случае [email protected] в локальных системах, если система электронной почты настроена правильно, вы можете отправлять электронные письма на user@host. Несмотря на то, что это не FQDN — полное доменное имя, к которому мы привыкли, этот стандарт появился намного позже. Затем почтовая система использует псевдоним для отправки в правильную локальную сеть, переводя письмо на [email protected]. Проблемы с подделкой электронной почты появились позже, когда сеть ARPAnet стала общедоступной.

О комментариях в адресе, которого не было в RFC 822. Согласно более поздней спецификации электронной почты, которая разрешает комментарии (RFC 2822, раздел 3.4):

Кроме того, поскольку некоторые устаревшие реализации интерпретируют комментарий, комментарии обычно НЕ ДОЛЖНЫ использоваться в полях адреса, чтобы избежать путаницы в таких реализациях.

Это означает, что старые системы не допускают комментариев в адресах. RFC 822 не упоминает комментарии в адресе электронной почты.

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

person AbsoluteƵERØ    schedule 09.05.2013

Мне кажется, что вы хотите проверить идентификаторы электронной почты, которые используются в настоящее время, и на самом деле не соответствуют каким-либо RFC. Для нашего проекта мы сделали собственный очень простой валидатор электронной почты. Почему ? Почта apache и java использует регулярное выражение, и в некоторых случаях (я не знаю, какие, поскольку мы не печатали электронную почту в журнале), которые заставляют регулярное выражение переходить в вечный цикл. Это означает, что поток клиентского обработчика зацикливается, и пользователь видит пустой экран!

Итак, что мы делаем, так это, по сути, разрешаем новые идентификаторы электронной почты, как если бы они выглядели на таких сайтах, как google/yahoo.

Значение [email protected]

Что мы проверяем Не более 1 @ Проверяем наличие 1 или более символов до @ После @ есть несколько символов + не менее одной точки + символы после точки

Жалоб за последние два года не поступало. Кроме того, в большинстве случаев вам нужно отправить человеку электронное письмо, чтобы убедиться, что домен существует и т. д., и ссылку с уникальным токеном (подтверждение регистрации), чтобы убедиться, что этот человек владеет идентификатором электронной почты (с сообщением для реального владельца только нажмите, если они зашли на ваш сайт)

    /**
     * minimum email [email protected]
     * */
    public static boolean checkEmail(final String emlId, int dbgPrint) {
        // ex:[email protected]
        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;

    }
person tgkprog    schedule 09.05.2013