Проверка электронной почты 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 - проверка возвращает ложь, но это действительный адрес электронной почты

Можете ли вы сказать мне какую-нибудь работу для этого, чтобы сделать это.

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;

    }
Другие вопросы по тегам