Проверьте электронную почту с помощью PHP - PullRequest
0 голосов
/ 07 апреля 2011

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

Ответы [ 5 ]

5 голосов
/ 07 апреля 2011

На высоком уровне вы хотите примерно следующее:

  • Когда пользователь регистрируется, создайте секретный код, который пользователь не сможет понять сам
    • Это может быть что-то, что назначается случайным образом, например, случайная строка
    • Это также может быть то, что вы можете вычислить программно (но что пользователь не может), например, MD5 адреса электронной почты пользователя, объединенного в секретную строку; это может спасти вам столбец базы данных, так как вам не придется его хранить
  • Сохраните секретный код и отправьте его пользователю в виде ссылки в электронном письме
  • Настройте прослушиватель по этой ссылке, и, если коды совпадают, «активируйте пользователя»

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

2 голосов
/ 07 апреля 2011

Создайте уникальное случайное число и сохраните его в таблице вместе с идентификатором пользователя.Отправьте им по электронной почте сообщение со ссылкой на страницу, которая принимает случайное число в качестве входных данных.Если у них правильное случайное число, пометьте их активным.

1 голос
/ 07 апреля 2011

Собираюсь пойти со следующим подходом.

Реестры пользователей. База данных обновлена ​​с их деталями и добавлен флаг для активных / не активных. Электронная почта отправляется на зарегистрированный адрес электронной почты со ссылкой. Ссылка ведет на страницу, которая может подтвердить адрес электронной почты как действительный и обновить базу данных.

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

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

$hash = substr(md5(uniqid()), 0, 5);

Чувствуете ли вы себя уверенно, создавая представление электронной почты и отправляя его с помощью phpMailer или аналогичного? Если это так, сделайте это со ссылкой, которая при попадании захватит member_id и member_hash и так что-то вроде следующего ... Здесь я снова использовал PDO, так много способов делать то, что вы хотите ... все, что лучше для вас.

// PDO Instance
$pdo = $this->actionServer->getDataSource('PDO');

$findMember = $pdo->prepare('SELECT * FROM member WHERE member.member_id = :memberId AND member.member_hash = :memberHash AND hidden = 1');
$findMember->bindParam(':memberId', $memberId);
$findMember->bindParam(':memberHash', $memberHash);
$findMember->execute();
$findMemberResult = $findMember->fetch(PDO::FETCH_ASSOC);

if (empty($findMemberResult)) {
    $this->log->error('Could not find member based on ID and Hash combination');
    throw new HTTPException(404);
}

/**
 * Could use a method like below to approve
 */

protected function approveMember($memberId, $pdo) {
    $sql = 'UPDATE member SET member.hidden = 0 WHERE member.member_id = :memberId';
    $updateMember = $pdo->prepare($sql);
    $updateMember->bindParam(':memberId', $memberId);
    $updateMember->execute();
}

Надеюсь, это поможет!

Cheerio

1 голос
/ 07 апреля 2011

Если вы используете PHP 5.2 или выше, одним из вариантов является функция filter_var ...

if (filter_var('email@example.com', FILTER_VALIDATE_EMAIL) !== FALSE)
0 голосов
/ 07 апреля 2011

В какой-то момент я делал нечто подобное, однако мне не нужно было проверять, существует ли пользователь, мне нужно было проверить форматирование и определить, является ли это реальным доменом (scrub none@none.com) , Вы можете посмотреть на мои функции и начать там.

//Verify formatting
function verify_email($email){

    if(!preg_match('/^[_A-z0-9-]+((\.|\+)[_A-z0-9-]+)*@[A-z0-9-]+(\.[A-z0-9-]+)*(\.[A-z]{2,4})$/',$email)){
        return false;
    } else {
        return $email;
    }
}

//Verify MX records exist
function verify_email_dns($email){

    // This will split the email into its front
    // and back (the domain) portions
    list($name, $domain) = split('@',$email);

    if(!(checkdnsrr($domain,'MX') || checkdnsrr($domain, 'A'))){

        // No MX record found
        return false;

    } else {

        // MX record found, return email
        return true;

    }
}

Вы также можете проверить этот вопрос о стеке

...