ссылка для подтверждения по электронной почте - PullRequest
5 голосов
/ 13 июля 2010

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

так что на данный момент у меня есть

PHP:

<?php
 $to = "recipient@example.com";
 $subject = "Hi!";
 $body = "Hi,\n\nHow are you?";
 if (mail($to, $subject, $body)) {
   echo "<p>Message successfully sent!</p>";
  } else {
   echo "<p>Message delivery failed...</p>";
  }
 ?>

Думаю, я бы изменил $ body на это:

$body = "Please click the link to activate your email \n
http://www.activationlink.com?";

Как бы я сделал так, чтобы, если пользователь щелкнул эту ссылку, он добавил свои данные в базу данных Mysql, признавая, что они являются законным подписчиком?

Любая помощь или предложения приветствуются. Спасибо

Ответы [ 7 ]

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

Что мне нравится делать:

  • Создать уникальный случайный идентификатор в процессе регистрации

  • Сохранить идентификатор вместе сАдрес электронной почты, поле «подтверждено» (по умолчанию: «нет») и любые дополнительные данные в таблице базы данных

  • Отправьте электронное письмо с URL-адресом, указывающим для активацииуникальный идентификатор (например, domain.com/activate.php?id=102939505595

  • На странице активации проверяется, существует ли уникальный ключ, и изменяется поле confirmed на yes (или 1 или любое другое).

  • Дополнительно и дополнительно сохраните дату / время подтверждения, IP-адрес и пользовательский агент.

6 голосов
/ 13 июля 2010

Вставьте пользователя в таблицу с установленным флагом 'pending' (или не установлен флаг 'validated'). Они не должны ничего делать, пока флаг не будет изменен. Если вы хотите быть очень тщательным, на самом деле поместите их в таблицу users_temp. Создайте совершенно случайный ключ и свяжите его с их идентификатором пользователя. Ссылка, которую вы им отправляете, должна быть http://yourwebsite.com/?activate=totallyrandomkeyigeneratedearlier. Когда вы получите запрос на активацию, включите действительный флаг для пользователя с соответствующим случайным ключом.

5 голосов
/ 13 июля 2010

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

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

$token = sha1($time.$email.$salt).dechex(time()).dechex($user_id);
$link = "http://".$domain."/restorepass/?token=$token";

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

при получении просто разделить и декодировать обратно.
Аккуратный, ИМО.

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

Во-первых, вам нужно добавить 2 столбца в таблицу базы данных, в которой содержатся пользователи

Столбец должен называться active и activation_hash

Когда пользователь регистрируется, вам нужновставьте пользователя в БД, но установите active в 0, и activation_hash станет случайным md5 для адреса электронной почты пользователей, имени и т. д. с unique_id(), убедитесь, что он в формате MD5, а затем сохраните его вactivation_hash столбец.

В шаблоне вашей электронной почты добавьте ссылку для активации пользователем, например:

<a href="http://mydomain.registrer.php?process=activate&id=<?php echo $user_id;?>&hash=<?php echo $activation_hash;?>">Activate your account</a>

Затем внутри вашего регистрационного файла или там, где выНаправив ссылку на активацию, просто получите user_id и хэш активации через $_GET и проверьте по вашей базе данных.

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

Вот в принципе и все.

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

Создайте уникальный идентификатор и сохраните его вместе с именем пользователя / паролем в некоторой временной записи базы данных для нового пользователя.

$tmpID = uniqid();

Затем настройте ссылку в вашем электронном письме, например:

$body = "Please click the link to activate your email \n
http://www.activationlink.com/activateAccount?activate=".$tmpID;

Если пользователь запрашивает / активировать учетную запись на вашем сервере, проверьте запись в базе данных по параметру $_GET['activate'] и установите активированного пользователя (если он соответствует).

Чтобы убедиться, что ваша база данных не просто получает все больше и больше записей, вы можете использовать cron-job, который очищает записи старше, например, например. 24ч.

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

Лично я бы добавил эти данные в базу данных и имел бы поля, называемые «активными», а затем, когда они щелкают по ссылке активации, все, что вам нужно сделать, это обновить это одно поле.

У вас также может быть ссылка «Это был не я» в электронном письме, и если они нажмут эту ссылку, вы удалите все имеющиеся там данные.

0 голосов
/ 23 декабря 2016

Вот мой полный сценарий решения:

CREATE TABLE signup  (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL,
email VARCHAR(30) NOT NULL,
token VARCHAR(30) NOT NULL,
verified VARCHAR(50),
registration_date TIMESTAMP,
maxdate TIMESTAMP
);

Signup MySQL Table

Добавить страницу регистрации signup.php

Добавьте следующую форму:

    <form name="signupform" method="post" action="process.php">
    Username:
    <input type="text" name="username">
    <br> Password:
    <input type="text" name="password">
    <br> Email:
    <input type="text" name="email">
    <br>
    <input type="submit" value="Signup">
</form>

Создать process.php страница:

<?php
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
date_default_timezone_set('America/New_York');
$registration_date = date('Y-m-d H:i:s');
$verified = 0;
$maxdate = date('Y-m-d H:i:s', strtotime($registration_date . ' +1 day'));
$salt = uniqid(mt_rand() , true);
$token = msha1(registration_date . md5($salt));
$sql = "INSERT INTO signup (username, password, email, token, verified, registration_date, maxdate) VALUES ('$username', '$password', '$email', '$token', '$verified', '$registration_date', '$maxdate')";

if (mysqli_query($conn, $sql))
    {
    $msg = 'Please click this link to verify your email: http://www.yourdomain.com/verifyemail.php?token=' . $token;
    mail($email, $subject, $msg);
    }
  else
    {
    echo mysql_error();
    }

?>

впоследствии создать verifyyemail.php :

<?php
$token = $_REQUEST['token'];
date_default_timezone_set('America/New_York');
$current_time = date('Y-m-d H:i:s');
$sql = "SELECT * FROM users WHERE token='$token' AND maxtime >'$current_time' AND verified=0";
$result = mysqli_query($conn, $sql);
$notverified = mysqli_num_rows($result);

if ($notverified)
    {
    $sql = "update signup set verified=1 where token='$token'";
    $result = mysqli_query($conn, $sql);
    if ($result)
        {
        echo 'Email verified';
        }
      else
        {
        echo 'Error';
        }
    }
  else
    {
    echo 'Link expired';
    }

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...