Я кодирую сайт в php, и я в настоящее время нахожусь на связываться нас страница, и я задавался вопросом, что лучший способ состоял в том, чтобы проверить адрес электронной почты?
Также Вы могли сказать мне почему и руководство вдоль моего пути к достижению его? Я не хочу, чтобы кто-то сделал код для меня, потому что это не забава для меня, и я не выучу лишь просто некоторое руководство на методах, используемых для достижения любого методы выше.
Также я собираюсь использовать эти методы для реализации подписать кнопки на моей веб-странице. Действительно ли это - лучший способ сделать это? какие-либо другие методы я должен condsider?
Обычно я выполняю эти шаги
, если первый шаг терпит неудачу, он никогда не достигает второго шага. если отправка электронной почты не удалась из-за того, что электронная почта не существует, я удаляю учетную запись или выполняю другие действия
- отредактируйте
3 - Если по какой-либо причине электронное письмо для активации не отправляется, электронное письмо не приходит удален, он остается неутвержденным в течение 7 дней (или как настроено вами), повторная отправка электронной почты выполняется каждые 2-3 часа, по истечении этих дней, если безуспешно, электронное письмо удаляется
4 - Если электронное письмо отправлено успешно, но не активировано остается неутвержденным, но может быть повторно активирован в любое время, сгенерировав новый код активации
Я думаю, что лучшим будет сочетание 3. и 1.
На начальном этапе вы проверяете синтаксически письмо (чтобы отловить опечатки):
filter_var($email, FILTER_VALIDATE_EMAIL)
А на втором этапе вы посылаете письмо с адресом подтверждения (чтобы отловить ошибки и намеренно неверную информацию).
Единственный способ узнать, действителен ли email, - это отправить на него письмо. Если вам действительно нужно, используйте один из этих. Технически, для локальных доменов даже не нужно ставить никаких периодов после @. Все, что необходимо, - это домен, следующий за @.
Лучший способ сделать это - отправить электронное письмо со ссылкой для подтверждения. По крайней мере, если вам не нужны электронные письма для активации, подтвердите адрес электронной почты. Лучшая функция проверки электронной почты - это RFC-совместимый валидатор адресов электронной почты от Доминика Сэйерса .
Просто включите 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 Class для проверки синтаксиса адреса электронной почты.
Я собрал несколько примеров неверных результатов, возвращаемых filter_var
(PHP версии 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. Это позволит обнаружить электронные письма, в которых используются поддельные домены (например, (скрытый)
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.
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;
Зависит от вашей цели. Если у вас должен быть действующий и активный адрес электронной почты, вы должны отправить электронное письмо, требующее подтверждения получения. В этом случае нет необходимости в проверках регулярных выражений, кроме как для удобства вашего пользователя.
Но если вы хотите помочь пользователю избежать опечаток и при этом свести к минимуму раздражение пользователя, выполните проверку с помощью регулярного выражения.