Методы проверки адреса электронной почты (кнопка «Подписаться») - PullRequest
6 голосов
/ 15 июля 2010

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

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

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

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

Ответы [ 10 ]

16 голосов
/ 15 июля 2010

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

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

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

- редактирование

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

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

11 голосов
/ 15 июля 2010

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

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

filter_var($email, FILTER_VALIDATE_EMAIL)

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

4 голосов
/ 15 июля 2010

Лучший способ сделать это - отправить электронное письмо со ссылкой для подтверждения. По крайней мере, если вы не хотите получать письма об активации, подтвердите адрес электронной почты. Лучшая функция проверки электронной почты - это 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, если она действительна).
3 голосов
/ 15 июля 2010

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

3 голосов
/ 15 июля 2010

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

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

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

2 голосов
/ 15 июля 2010

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

2 голосов
/ 15 июля 2010

Регулярное выражение не очень подходит для определения правильности синтаксиса адреса электронной почты, а опция 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, правильный путь для получения дополнительной информации.

1 голос
/ 15 июля 2010

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

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

0 голосов
/ 15 марта 2011

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

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

Это обеспечит полное соответствие адреса RFC 5321.При желании он также может проверить, существует ли домен на самом деле.

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

0 голосов
/ 15 июля 2010
 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;
...