Подтверждение адреса электронной почты на PHP

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

Ниже приведен базовый урок, объясняющий, как создать базу данных и надлежащий код активации. Реализация выполнена с помощью методов mysqli_(), так как методы mysql_() уже потеряли свои позиции.

Скачать скрипт

Демо

База данных

Примерная таблица базы данных users содержит пять столбцов: идентификатор пользователя (uid), адрес электронной почты (email), пароль (password), активация (activation) и статус (status):

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 код

Содержит простой 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

Файл конфигурации базы данных, измените имя пользователя, пароль, базу данных и основные значения URL:

<?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

Содержит 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']);
// регулярное выражение для проверки написания адреса электронной почты
 $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); // encrypted password
 $activation=md5($email.time()); // encrypted email+timestamp
 $count=mysqli_query($connection,"SELECT uid FROM users WHERE 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="Подтверждение электронной почты";
 $body='Здравствуйте! <br/> <br/> Мы должны убедиться в том, что вы человек. Пожалуйста, подтвердите адрес вашей электронной почты, и можете начать использовать ваш аккаунт на сайте. <br/> <br/> <a href="'.$base_url.'activation/'.$activation.'">'.$base_url.'activation/'.$activation.'</a>';

Send_Mail($to,$subject,$body);
 $msg= "Регистрация выполнена успешно, пожалуйста, проверьте электронную почту."; 
 }
 else
 {
 $msg= 'Данный адрес электронный почты уже занят, пожалуйста, введите другой. '; 
 }
 }
 else
 {
 $msg = 'Адрес, введенный вами, неверен. Пожалуйста, попробуйте еще раз.'; 
 }
 }
// HTML часть
?>

Send_Mail.php

В этом файле находится функция отправки сообщения, измените только SMTP хост, имя пользователя и пароль.

Здесь вы можете использовать элементы GMail SMTP для тестирования:

<?php
function Send_Mail($to,$subject,$body)
 {
require 'class.phpmailer.php';
 $from       = "from@yourwebsite.com";
 $mail       = new PHPMailer();
 $mail->IsSMTP(true);            // используем протокол 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

Содержит 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

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

CSS код

body
 {
 font-family: "Helvetica",Arial,sans-serif;
 font-weight: 500;
 color:#333;
 }
label
 {
 width:100px;
 display:block;
 font-weight:bold;
 color:#666666;
 }
#main
 {
 margin:0 auto;
 width:800px;
 }
.input
 {
 padding:10px;
 font-size:14px;
 border:1px solid #999999;
 width:200px;
 margin-bottom:10px;
 }
.button {
 padding:10px;
 background-color: #5fcf80 !important;
 border-color: #3ac162 !important;
 }
.msg
 {
 font-size:11px;
 color:#666;
 padding:10px;
 }

Сергей Бензенкоавтор-переводчик статьи «PHP Email Verification Script»