Активация email после регистрации

В этом примере реализуем верификацию регистрации по email на PHP. Для этого будем генерировать и использовать специальный код активации.

Внимание! Данный код предоставлен как пример решения поставленной задачи. Он не служит эталоном.

База данных

Создадим таблица users, в которую будем записывать данные пользователя и код активации.

CREATE TABLE IF NOT EXISTS `users` (
    `uid` int(11) NOT NULL AUTO_INCREMENT,
    `email` varchar(300) NOT NULL UNIQUE,
    `password` varchar(300) NOT NULL,
    `activation` varchar(300) NOT NULL UNIQUE,
    `status` enum('0','1') NOT NULL DEFAULT '0',
    PRIMARY KEY (`uid`)
);

HTML

Пример формы регистрации.

<form action="" method="post">
<label>Email</label>
<input type="text" name="email" class="input" autocomplete="off"/>
<label>Password </label>
<input type="password" name="password" class="input" autocomplete="off"/><br/>
<input type="submit" class="button" value="Registration" />
<span class='msg'><?php echo $msg; ?></span>
</form>

db.php

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

<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'username');
define('DB_PASSWORD', 'password');
define('DB_DATABASE', 'database');
$connection =@mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
$base_url='http://www.youwebsite.com/email_activation/';
?>

index.php

Сохраняем пользователей в таблицу users. Код активации генерируем с помощью MD5.

<?php
include 'db.php';
$msg='';
if(!empty($_POST['email']) && isset($_POST['email']) && !empty($_POST['password']) &&  isset($_POST['password']) )
{
    $email=mysql_real_escape_string($_POST['email']);
    $password=mysql_real_escape_string($_POST['password']);
// регулярное выражение для проверки email-а
    $regex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/';
 
    if(preg_match($regex, $email))
    {
        $password=md5($password); // пароль
        $activation=md5($email.time()); // email + timestamp
        $count=mysqli_query($connection,"SELECT uid FROM users WHERE email='$email'");
// проверка email-а
        if(mysqli_num_rows($count) < 1)
        {
            mysqli_query($connection,"INSERT INTO users(email,password,activation) VALUES('$email','$password','$activation')");
// отправка письма
            include 'smtp/Send_Mail.php';
            $to=$email;
            $subject="Проверка Email-а";
            $body='Hi, <br/> <br/> Активация! Пожалуйста перейдите по ссылки для активации вашего аккаунта. <br/> <br/> <a href="'.$base_url.'activation/'.$activation.'">'.$base_url.'activation/'.$activation.'</a>';
 
            Send_Mail($to,$subject,$body);
            $msg= "Регистрация прошла успешно! Пройдите активацию через email.";
        }
        else
        {
            $msg= 'Данный email уже занят.';
        }
 
    }
    else
    {
        $msg = 'Не валидный email.';
    }
 
}
// HTML Часть
?>

Send_Mail.php

Для отправки email сообщений используется библиотека PHPMailer. Но можно использовать и стандартный mail().

ПОЛЕЗНО  Не работает Яндекс.Погода через XML

Отправка email сообщения. Исправьте SMTP параметры.

<?php
function Send_Mail($to,$subject,$body)
{
    require 'class.phpmailer.php';
    $from       = "from@yourwebsite.com";
    $mail       = new PHPMailer();
    $mail->IsSMTP(true);            // use SMTP
    $mail->IsHTML(true);
    $mail->SMTPAuth   = true;                  // активируем SMTP аутентификацию
    $mail->Host       = "tls://smtp.yourwebsite.com"; // SMTP хост
    $mail->Port       =  465;                    // SMTP порт
    $mail->Username   = "SMTP_Username";  // SMTP  имя пользователя
    $mail->Password   = "SMTP_Password";  // SMTP пароль
    $mail->SetFrom($from, 'From Name');
    $mail->AddReplyTo($from,'From Name');
    $mail->Subject    = $subject;
    $mail->MsgHTML($body);
    $address = $to;
    $mail->AddAddress($address, $to);
    $mail->Send();
}
?>

activation.php

В зависимости от кода активации выставляем статус пользователю 0 или 1.

<?php
include 'db.php';
$msg='';
if(!empty($_GET['code']) && isset($_GET['code']))
{
    $code=mysql_real_escape_string($_GET['code']);
    $c=mysqli_query($connection,"SELECT uid FROM users WHERE activation='$code'");
 
    if(mysqli_num_rows($c) > 0)
    {
        $count=mysqli_query($connection,"SELECT uid FROM users WHERE activation='$code' and status='0'");
 
        if(mysqli_num_rows($count) == 1)
        {
            mysqli_query($connection,"UPDATE users SET status='1' WHERE activation='$code'");
            $msg="Ваш аккаунт активирован";
        }
        else
        {
            $msg ="Ваш аккаунт уже активирован";
        }
 
    }
    else
    {
        $msg ="Неверный код активации";
    }
 
}
?>
    //HTML часть
<?php echo $msg; ?>

.htaccess

Для соблюдения ЧПУ преобразуем URL вида:

http://website.com/activation.php?code=ACTIVATION_CODE

к виду:

http://website.com/activation/ACTIVATION_CODE

Для этого прописываем в файле .htaccess

RewriteEngine On
 
RewriteRule ^activation/([a-zA-Z0-9_-]+)$ activation.php?code=$1
RewriteRule ^activation/([a-zA-Z0-9_-]+)/$ activation.php?code=$1

Результат

После регистрации пользователя, ему на email отсылается письмо с ссылкой активацией emai адреса. При переходе по ссылке, скрипт проверяет наличие такого кода активации в базе, и в случае нахождения, изменяет статус данного email адреса на «активирован».

ПОЛЕЗНО  PHP постинг в фейсбук страницу

источник