Я кодирую сайт в php, и сейчас я нахожусь на странице контактов, и мне было интересно, как лучше всего проверить адрес электронной почты?
Также вы могли бы рассказать мне, почему и руководство на моем пути к его достижению? Я не хочу, чтобы кто-то делал код для меня, потому что это не забава для меня, и я не буду учиться, а просто руководство по методам, используемым для достижения либо вышеописанных методов.
Также я буду использовать эти методы для реализации кнопки подписки на моей веб-странице. Это лучший способ сделать это? любые другие методы, которые я должен учитывать?
Я обычно делаю эти шаги
если первый шаг не удастся, он никогда не достигнет второго шага. если отправка по электронной почте не удалась, потому что письмо не существует, я удаляю учетную запись или делаю некоторые другие вещи
–редактировать
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';
Это зависит от того, действительно ли пользователь хочет получить ответ.
Если пользователь задает вопрос, он захочет получить ответ и, вероятно, даст свой действительный адрес электронной почты. В этом случае я бы использовал очень свободную проверку регулярных выражений, чтобы поймать опечатки или отсутствующий адрес. (Что-то вроде .+@.+
.)
Если пользователь не хочет, чтобы с вами связались, но вы хотите узнать их адрес, вам нужно будет работать со ссылкой для проверки. Нет другого способа гарантировать, что адрес электронной почты действителен и принадлежит пользователю.
Единственный способ узнать, действительно ли электронное письмо является действительным или нет, – это отправить ему электронное письмо. Если вам действительно нужно, используйте один из них . Технически , даже после @ для локальных доменов не должно быть никаких периодов. Все, что необходимо, – это домен, следующий за @.
Регулярное выражение действительно не подходит для определения достоверности синтаксиса адреса электронной почты, а опция 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;