Методы проверки адреса электронной почты (кнопка «Подписаться»)

Я кодирую сайт в php, и сейчас я нахожусь на странице контактов, и мне было интересно, как лучше всего проверить адрес электронной почты?

  1. Отправляя ссылку для проверки на их электронную почту?
  2. Regex
  3. Любой другой метод?

Также вы могли бы рассказать мне, почему и руководство на моем пути к его достижению? Я не хочу, чтобы кто-то делал код для меня, потому что это не забава для меня, и я не буду учиться, а просто руководство по методам, используемым для достижения либо вышеописанных методов.

Также я буду использовать эти методы для реализации кнопки подписки на моей веб-странице. Это лучший способ сделать это? любые другие методы, которые я должен учитывать?

Я обычно делаю эти шаги

  1. Regex
  2. Отправить код активации по электронной почте

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

–редактировать

3 – Если по какой-либо причине сообщение об активации не отправляется, электронная почта не удаляется, он остается неутвержденным в течение 7 дней (или настроен вами), повторное отправление электронной почты проверяется каждые 2-3 часа после этих дней если нет успеха, электронная почта удаляется

4 – Если сообщение электронной почты отправлено успешно, но не активировано, оно остается неутвержденным, но может быть активировано в любое время путем создания нового кода активации

Я думаю, что лучше всего комбинация 3. и 1.

На начальном этапе вы синтаксически проверяете электронное письмо (для опечатки):

filter_var($email, FILTER_VALIDATE_EMAIL) 

А во втором вы отправляете электронное письмо с адресом подтверждения (как для ловушек, так и для умышленно неправильной информации).

Лучший способ сделать это – отправить электронное письмо с помощью ссылки проверки. По крайней мере, если вы не хотите активировать электронные письма, подтвердите адрес электронной почты. Лучшей функцией проверки подлинности электронной почты является RFC-совместимый модуль проверки адресов электронной почты Dominic Sayers .

Просто включите php-файл в свой проект и используйте его следующим образом:

 if (is_email($email, $checkDNS, $diagnose)) //$checkDNS and $diagnose are false by default echo 'Email valid'; else echo 'Email invalid'; 
  • Если для $ checkDNS установлено значение true, он будет проверять, существует ли домен. Если домен не существует, функция возвращает false, даже если электронная почта действительна.
  • Если для параметра $ diagnose установлено значение true, функция возвращает код вместо логического, который скажет вам, почему сообщение недействительно (или 0, если оно действительно).

Это зависит от того, действительно ли пользователь хочет получить ответ.

Если пользователь задает вопрос, он захочет получить ответ и, вероятно, даст свой действительный адрес электронной почты. В этом случае я бы использовал очень свободную проверку регулярных выражений, чтобы поймать опечатки или отсутствующий адрес. (Что-то вроде .+@.+ .)

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

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

Регулярное выражение действительно не подходит для определения достоверности синтаксиса адреса электронной почты, а опция FILTER_VALIDATE_EMAIL для функции filter_var ненадежна. Я использую класс EmailAddressValidator для проверки синтаксиса адресов электронной почты.

Я собрал несколько примеров неправильных результатов, возвращаемых filter_var (PHP Version 5.3.2-1ubuntu4.2). Есть, вероятно, больше. Некоторые из них, по общему признанию, немного экстремальны, но все же стоит отметить:

RFC 1035 2.3.1. Предпочтительный синтаксис имен
http://tools.ietf.org/search/rfc1035
Подводя итог: домен состоит из меток, разделенных разделителями точек (хотя это не обязательно верно для локальных доменов).

 echo filter_var('name@example', FILTER_VALIDATE_EMAIL); // name@example 

RFC 1035 2.3.1. Предпочтительный синтаксис имен
Этикетки должны соответствовать правилам имен хостов ARPANET. Они должны начинаться с буквы и буквы или цифры и иметь в качестве внутренних символов только буквы, цифры и дефис.

 echo filter_var('name@1example.com', FILTER_VALIDATE_EMAIL); // name@1example 

RFC 2822 3.2.5. Цитированные строки
http://tools.ietf.org/html/rfc2822#section-3.2.5
Это действительно (хотя оно отклонено многими почтовыми серверами):

 echo filter_var('name"quoted"string@example', FILTER_VALIDATE_EMAIL); // FALSE 

RFC 5321 4.5.3.1.1. Локальная часть
http://tools.ietf.org/html/rfc5321#section-4.5.3.1.1
Максимальная общая длина имени пользователя или другой локальной части – 64 октета.
Тест с 70 символами:

 echo filter_var('AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com', FILTER_VALIDATE_EMAIL); // AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com 

RFC 5321 4.5.3.1.2. Домен
http://tools.ietf.org/html/rfc5321#section-4.5.3.1.2
Максимальная общая длина имени или номера домена составляет 255 октетов.
Тест с 260 символами:

 echo filter_var('name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com', FILTER_VALIDATE_EMAIL); // name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com 

Для получения дополнительной информации см. « Подтверждение адреса электронной почты с помощью PHP, правильный путь» .

Перед отправкой электронной почты проверки можно также использовать checkdnsrr() чтобы убедиться, что домен существует и имеет записи MX. Это обнаружит электронные письма, которые используют фиктивные домены (например, user@idontexist.com).

 function validateEmail($email, $field, $msg = '') { if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { return false; } list($user, $domain) = explode('@', $email); if (function_exists('checkdnsrr') && !checkdnsrr($domain, 'MX')) { return false; } return true; } 

Нам нужно использовать function_exists() чтобы проверить checkdnsrr() , доступную нам, поскольку она не была доступна в Windows до PHP 5.3.

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

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

Некоторые хорошие ответы здесь, и я согласен с выбранным, за исключением регулярного выражения. Как отмечают другие люди, трудно найти регулярное выражение, которое полностью реализует все причуды RFC 5321.

Вы можете использовать мою бесплатную функцию PHP is_email() для проверки адресов. Он доступен здесь .

Он гарантирует, что адрес полностью совместим с RFC 5321. Он также может дополнительно проверить, действительно ли домен существует.

Вы не должны полагаться на валидатор, чтобы сообщить вам, действительно ли существует адрес электронной почты пользователя: некоторые интернет-провайдеры выдают несовместимые адреса своим пользователям, особенно в странах, которые не используют латинский алфавит. Подробнее в моем эссе о проверке подлинности электронной почты здесь: http://isemail.info/about .

  function checkEmail($email) { if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-]) ↪*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email)){ list($username,$domain)=split('@',$email); if(!checkdnsrr($domain,'MX')) { return false; } return true; } return false;