Статьи

Как реализовать подтверждение по электронной почте для новых участников

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

Это руководство научит вас создавать сценарий проверки электронной почты с нуля, но если вы хотите что-то, что вы можете использовать на своем веб-сайте прямо сейчас, ознакомьтесь с проверкой электронной почты на Envato Market.

Email Verify — это скрипт PHP, который позволяет проверять адреса электронной почты, не сохраняя ничего в каких-либо базах данных. Он отправит пользователям электронное письмо, требующее от них щелкнуть ссылку, чтобы проверить их электронную почту, прежде чем их электронная почта будет добавлена ​​во все, что вы хотите добавить.

Email Verify on Envato Market
Подтверждение адреса электронной почты на рынке Envato

Мы собираемся создать хороший сценарий регистрации PHP, где пользователь может создать учетную запись, чтобы получить доступ к «разделу членов» веб-сайта.
После того как пользователь создаст свою учетную запись, учетная запись будет заблокирована до тех пор, пока пользователь не щелкнет ссылку подтверждения, которую он получит в своем почтовом ящике.


Сначала нам нужна простая страница, где наши посетители могут зарегистрировать свои учетные записи; так что это первое, что мы будем строить.
Я хотел бы напомнить вам, что это учебник по PHP, и, по моему мнению, вам нужно знать основы HTML, прежде чем переходить к PHP. Я добавлю комментарии к HTML и CSS, чтобы описать каждую строку кода.

index.php — это наша страница регистрации с базовой формой.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN» «https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
 
<html xmlns=»http://www.w3.org/1999/xhtml»>
<head>
    <title>NETTUTS > Sign up</title>
    <link href=»css/style.css» type=»text/css» rel=»stylesheet» />
</head>
<body>
    <!— start header div —>
    <div id=»header»>
        <h3>NETTUTS > Sign up</h3>
    </div>
    <!— end header div —>
     
    <!— start wrap div —>
    <div id=»wrap»>
         
        <!— start php code —>
         
        <!— stop php code —>
     
        <!— title and description —>
        <h3>Signup Form</h3>
        <p>Please enter your name and email addres to create your account</p>
         
        <!— start sign up form —>
        <form action=»» method=»post»>
            <label for=»name»>Name:</label>
            <input type=»text» name=»name» value=»» />
            <label for=»email»>Email:</label>
            <input type=»text» name=»email» value=»» />
             
            <input type=»submit» class=»submit_button» value=»Sign up» />
        </form>
        <!— end sign up form —>
         
    </div>
    <!— end wrap div —>
</body>
</html>

css / style.css — это таблица стилей для index.php и других страниц.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/* Global Styles */
 
*{
    padding: 0;
    margin: 0;
}
 
body{
    background: #F9F9F9;
    font: 14px «Lucida Grande»;
    color: #464646;
}
 
p{
    margin: 10px 0px 10px 0px;
}
 
/* Header */
 
#header{
    height: 45px;
    background: #464646;
}
 
#header h3{
    color: #FFFFF3;
    padding: 10px;
    font-weight: normal;
}
 
/* Wrap */
 
#wrap{
    background: #FFFFFF;
    width: 615px;
    margin: 0 auto;
    margin-top: 50px;
    padding: 10px;
    border: 1px solid #DFDFDF;
    text-align: center;
}
 
#wrap h3{
    font: italic 22px Georgia;
}
 
/* Form & Input field styles */
 
form{
    margin-top: 10px;
}
 
form .submit_button{
    background: #F9F9F9;
    border: 1px solid #DFDFDF;
    padding: 8px;
}
 
input{
    font: normal 16px Georgia;
    border: 1px solid #DFDFDF;
    padding: 8px;
}

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

1
2
3
<!— start php code —>
 
<!— stop php code —>

Мы собираемся написать наш PHP между этими двумя строками!


Первое, что мы собираемся построить, это кусок кода, который будет проверять информацию. Вот краткий список того, что нужно сделать.

  • Если поле имени не пустое.
  • Если имя не короткое.
  • Если поле электронной почты не пустое.
  • Если адрес электронной почты действителен [email protected]

Итак, наш первый шаг — проверка, отправляется ли форма и не являются ли поля пустыми.

1
2
3
4
5
6
7
8
9
<!— start PHP code —>
<?php
 
    if(isset($_POST[‘name’]) && !empty($_POST[‘name’]) AND isset($_POST[’email’]) && !empty($_POST[’email’])){
        // Form Submited
    }
             
?>
<!— stop PHP Code —>

Время поломки! Мы начинаем с оператора IF и сначала проверяем поле имени:

01
02
03
04
05
06
07
08
09
10
11
if( ){ // If statement is true run code between brackets
    
   }
    
   isset($_POST[‘name’]) // Is the name field being posted;
   && // This is the same as the AND in our statement;
   !empty($_POST[‘name’]) // Verify if the field name is not empty
    
   isset($_POST[’email’]) // Is the email field being posted;
   && // This is the same as the AND in our statement;
   !empty($_POST[’email’]) // Verify if the field email is not empty

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

1
2
3
4
if(isset($_POST[‘name’]) && !empty($_POST[‘name’]) AND isset($_POST[’email’]) && !empty($_POST[’email’])){
    $name = mysql_escape_string($_POST[‘name’]);
    $email = mysql_escape_string($_POST[’email’]);
}

Теперь мы можем получить наши данные через наши локальные переменные. Как вы можете видеть, я также добавил escape-строку MySQL для предотвращения внедрения MySQL при вставке данных в базу данных MySQL.

«Функция mysql_real_escape_string () экранирует специальные символы в строке для использования в операторе SQL».

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

1
2
3
4
5
6
7
8
9
$name = mysql_escape_string($_POST[‘name’]);
   $email = mysql_escape_string($_POST[’email’]);
                
                
   if(!eregi(«^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[az]{2,3})$», $email)){
       // Return Error — Invalid Email
   }else{
       // Return Success — Valid Email
   }

Обратите внимание, что я не писал это регулярное выражение лично, это небольшой фрагмент php.net.
По сути, он проверяет, написано ли письмо в следующем формате:

Теперь в eregi вы можете видеть, что он проверяет, содержит ли электронное письмо символы из алфавита, есть ли у него какие-либо цифры или фантомный тире (_), и, конечно, основные требования к электронному письму (электронная почта) ‘@’ и точка)’.’ Если ни один из этих символов не найден, выражение возвращает «ложь». Хорошо, теперь нам нужно добавить несколько основных сообщений об ошибках.

1
2
3
4
5
6
7
if(!eregi(«^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[az]{2,3})$», $email)){
       // Return Error — Invalid Email
       $msg = ‘The email you have entered is invalid, please try again.’;
   }else{
       // Return Success — Valid Email
       $msg = ‘Your account has been made, <br /> please verify it by clicking the activation link that has been send to your email.’;
   }

Как вы можете видеть, мы создали локальную переменную «$ msg», что позволяет нам отображать сообщение об ошибке или сообщение об успешном выполнении в любом месте страницы.
И мы собираемся отобразить его между текстом инструкции и формой.

01
02
03
04
05
06
07
08
09
10
11
<!— title and description —>
   <h3>Signup Form</h3>
   <p>Please enter your name and email address to create your account</p>
        
   <?php
       if(isset($msg)){ // Check if $msg is not empty
           echo ‘<div class=»statusmsg»>’.$msg.'</div>’;
       }
   ?>
        
   <!— start sign up form —>

Добавьте это в style.css , чтобы немного стилизовать наше статусное сообщение.

1
2
3
4
5
6
#wrap .statusmsg{
    font-size: 12px;
    padding: 3px;
    background: #EDEDED;
    border: 1px solid #DFDFDF;
}

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

Давайте создадим нашу таблицу пользователей с 5 полями:

Итак, теперь мы должны ввести данные для этих полей:

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

1
2
3
4
5
6
7
8
CREATE TABLE `users` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 32 ) NOT NULL ,
`password` VARCHAR( 32 ) NOT NULL ,
`email` TEXT NOT NULL ,
`hash` VARCHAR( 32 ) NOT NULL ,
`active` INT( 1 ) NOT NULL DEFAULT ‘0’
) ENGINE = MYISAM ;

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

1
2
3
<!— start PHP code —>
<?php
// Establish database connection

Мы будем использовать следующий код для подключения к серверу базы данных и выбора базы данных регистрации . (базовое соединение MySQL)

1
2
mysql_connect(«localhost», «username», «password») or die(mysql_error());
mysql_select_db(«registrations») or die(mysql_error());

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


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

1
2
// Return Success — Valid Email
$msg = ‘Your account has been made, <br /> please verify it by clicking the activation link that has been send to your email.’;

В нашей базе данных мы создали поле с именем hash, этот хэш представляет собой строку из 32 символов текста. Мы также отправляем этот код на адрес электронной почты пользователя. Затем они могут щелкнуть ссылку (которая содержит хэш), и мы проверим, совпадает ли она с той, что в базе данных. Давайте создадим локальную переменную с именем $ hash и сгенерируем случайный хэш md5.

1
2
$hash = md5( rand(0,1000) );
// Example output: f4552671f8909587cf485ea990207f3b

Что мы сделали? Итак, мы используем PHP-функцию «rand», чтобы сгенерировать случайное число от 0 до 1000. Затем наша функция MD5 превратит это число в текстовую строку из 32 символов, которую мы будем использовать в нашем письме активации. Мой выбор — использовать MD5, потому что он генерирует хеш из 32 символов, который является безопасным, и в этом случае его невозможно взломать.

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

1
2
$password = rand(1000,5000);
// Example output: 4568

Вставьте следующую информацию в нашу базу данных, используя запрос MySQL

1
2
3
4
5
mysql_query(«INSERT INTO users (username, password, email, hash) VALUES(
‘». mysql_escape_string($name) .»‘,
‘». mysql_escape_string(md5($password)) .»‘,
‘». mysql_escape_string($email) .»‘,
‘». mysql_escape_string($hash) .»‘) «) or die(mysql_error());

Как вы можете видеть, мы вставляем все данные с escape-строкой MySQL, чтобы предотвратить любое внедрение MySQL.
Вы также можете заметить, что функция MD5 меняет случайный пароль на безопасный хеш для защиты. Пример: если «злой» человек получает доступ к базе данных, он не может прочитать пароли.

Для тестирования заполните форму и проверьте, вставляются ли данные в нашу базу данных.


Сразу после того, как мы вставили информацию в нашу базу данных, нам нужно отправить электронное письмо пользователю со ссылкой для подтверждения. Так что давайте использовать функцию PHP «mail», чтобы сделать это.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
$to = $email;
$subject = ‘Signup |
$message = ‘
 
Thanks for signing up!
Your account has been created, you can login with the following credentials after you have activated your account by pressing the url below.
 
————————
Username: ‘.$name.’
Password: ‘.$password.’
————————
 
Please click this link to activate your account:
http://www.yourwebsite.com/verify.php?email=’.$email.’&hash=’.$hash.’
 
‘;
                     
$headers = ‘From:[email protected]’ .
mail($to, $subject, $message, $headers);

Теперь давайте затормозим сообщение:

1
2
3
4
5
6
7
Thanks for signing up!
Your account has been created, you can login with the following credentials after you have activated your account by pressing the url below.
 
————————
Username: ‘.$name.’
Password: ‘.$password.’
————————

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

1
2
Please click this link to activate your account:
http://www.yourwebsite.com/verify.php?email=’.$email.’&hash=’.$hash.’

В этом разделе кода мы создали динамическую ссылку. Результат этого будет выглядеть так:

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


Как вы можете видеть, наш URL ссылается на verify.php, поэтому давайте создадим его, используя тот же базовый шаблон, который мы использовали для index.php.
Однако удалите форму из шаблона.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
 
<html xmlns=»http://www.w3.org/1999/xhtml»>
<head>
    <title>NETTUTS > Sign up</title>
    <link href=»css/style.css» type=»text/css» rel=»stylesheet» />
</head>
<body>
    <!— start header div —>
    <div id=»header»>
        <h3>NETTUTS > Sign up</h3>
    </div>
    <!— end header div —>
     
    <!— start wrap div —>
    <div id=»wrap»>
        <!— start PHP code —>
        <?php
         
            mysql_connect(«localhost», «tutorial», «password») or die(mysql_error());
            mysql_select_db(«registrations») or die(mysql_error());
             
        ?>
        <!— stop PHP Code —>
 
         
    </div>
    <!— end wrap div —>
</body>
</html>

Первое, что нам нужно сделать, это проверить, есть ли у нас переменные $ _GET (email & hash)

1
2
3
4
5
if(isset($_GET[’email’]) && !empty($_GET[’email’]) AND isset($_GET[‘hash’]) && !empty($_GET[‘hash’])){
    // Verify data
}else{
    // Invalid approach
}

Чтобы упростить задачу, давайте назначим наши локальные переменные и добавим некоторые средства предотвращения инъекций MySQL, снова используя escape-строку MySQL.

1
2
3
4
5
if(isset($_GET[’email’]) && !empty($_GET[’email’]) AND isset($_GET[‘hash’]) && !empty($_GET[‘hash’])){
    // Verify data
    $email = mysql_escape_string($_GET[’email’]);
    $hash = mysql_escape_string($_GET[‘hash’]);
}

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

1
2
$search = mysql_query(«SELECT email, hash, active FROM users WHERE email='».$email.»‘ AND hash='».$hash.»‘ AND active=’0′») or die(mysql_error());
$match = mysql_num_rows($search);

В приведенном выше коде мы использовали оператор выбора MySQL и проверили, совпадают ли адрес электронной почты и хеш. Но помимо этого мы проверили, является ли статус учетной записи «неактивным». Наконец, мы используем mysql_num_rows, чтобы определить, сколько совпадений было найдено. Итак, давайте попробуем это. Просто используйте простое эхо, чтобы вернуть результаты.

1
2
3
4
$search = mysql_query(«SELECT email, hash, active FROM users WHERE email='».$email.»‘ AND hash='».$hash.»‘ AND active=’0′») or die(mysql_error());
$match = mysql_num_rows($search);
 
echo $match;

У нас МАТЧ ! Чтобы изменить результат, просто измените адрес электронной почты, и вы увидите, что возвращаемое число равно 0 .
Мы можем использовать нашу переменную $ match, чтобы либо активировать учетную запись, либо вернуть ошибку, если совпадение не найдено.

1
2
3
4
5
if($match > 0){
    // We have a match, activate the account
}else{
    // No match -> invalid url or account has already been activated.
}

Чтобы активировать учетную запись, мы должны обновить активное поле до 1, используя запрос MySQL.

1
2
3
// We have a match, activate the account
mysql_query(«UPDATE users SET active=’1′ WHERE email='».$email.»‘ AND hash='».$hash.»‘ AND active=’0′») or die(mysql_error());
echo ‘<div class=»statusmsg»>Your account has been activated, you can now login</div>’;

Таким образом, мы используем те же условия поиска для обновления, которые мы использовали в нашем запросе выбора MySQL. Мы изменяем значение active на 1, где адрес электронной почты, хэш и поле active = 0 совпадают. Мы также возвращаем сообщение о том, что его аккаунт активирован. Вы можете добавить сообщение, как мы сделали здесь, к части «нет совпадения». Таким образом, окончательный код должен выглядеть примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql_connect(«localhost», «tutorial», «password») or die(mysql_error());
mysql_select_db(«registrations») or die(mysql_error());
             
if(isset($_GET[’email’]) && !empty($_GET[’email’]) AND isset($_GET[‘hash’]) && !empty($_GET[‘hash’])){
    // Verify data
    $email = mysql_escape_string($_GET[’email’]);
    $hash = mysql_escape_string($_GET[‘hash’]);
                 
    $search = mysql_query(«SELECT email, hash, active FROM users WHERE email='».$email.»‘ AND hash='».$hash.»‘ AND active=’0′») or die(mysql_error());
    $match = mysql_num_rows($search);
                 
    if($match > 0){
        // We have a match, activate the account
        mysql_query(«UPDATE users SET active=’1′ WHERE email='».$email.»‘ AND hash='».$hash.»‘ AND active=’0′») or die(mysql_error());
        echo ‘<div class=»statusmsg»>Your account has been activated, you can now login</div>’;
    }else{
        // No match -> invalid url or account has already been activated.
        echo ‘<div class=»statusmsg»>The url is either invalid or you already have activated your account.</div>’;
    }
                 
}else{
    // Invalid approach
    echo ‘<div class=»statusmsg»>Invalid approach, please use the link that has been send to your email.</div>’;
}

Если вы посещаете verify.php без каких-либо строк, будет показана следующая ошибка:


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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
 
<html xmlns=»http://www.w3.org/1999/xhtml»>
<head>
    <title>NETTUTS > Sign up</title>
    <link href=»css/style.css» type=»text/css» rel=»stylesheet» />
</head>
<body>
    <!— start header div —>
    <div id=»header»>
        <h3>NETTUTS > Sign up</h3>
    </div>
    <!— end header div —>
     
    <!— start wrap div —>
    <div id=»wrap»>
        <!— start PHP code —>
        <?php
         
            mysql_connect(«localhost», «tutorial», «password») or die(mysql_error());
            mysql_select_db(«registrations») or die(mysql_error());
                 
             
        ?>
        <!— stop PHP Code —>
     
        <!— title and description —>
        <h3>Login Form</h3>
        <p>Please enter your name and password to login</p>
         
        <?php
            if(isset($msg)){ // Check if $msg is not empty
                echo ‘<div class=»statusmsg»>’.$msg.'</div>’;
            } ?>
         
        <!— start sign up form —>
        <form action=»» method=»post»>
            <label for=»name»>Name:</label>
            <input type=»text» name=»name» value=»» />
            <label for=»password»>Password:</label>
            <input type=»password» name=»password» value=»» />
             
            <input type=»submit» class=»submit_button» value=»Sign up» />
        </form>
        <!— end sign up form —>
         
    </div>
    <!— end wrap div —>
</body>
</html>

Форма является основной HTML и почти такой же, как форма регистрации, дальнейшее объяснение не требуется. Теперь пришло время написать код для сценария входа, который мы напишем чуть ниже кода подключения MySQL. Мы начнем с того, что мы также сделали в форме регистрации.

1
2
3
if(isset($_POST[‘name’]) && !empty($_POST[‘name’]) AND isset($_POST[‘password’]) && !empty($_POST[‘password’])){
    // Both fields are being posted and there not empty
}

Поэтому мы сначала проверяем, публикуются ли данные, и проверяем, чтобы они не были пустыми.
Далее необходимо создать несколько локальных переменных для данных поста:

1
2
3
4
if(isset($_POST[‘name’]) && !empty($_POST[‘name’]) AND isset($_POST[‘password’]) && !empty($_POST[‘password’])){
    $username = mysql_escape_string($_POST[‘name’]);
    $password = mysql_escape_string(md5($_POST[‘password’]));
}

Мы создали локальные переменные и изменили пароль в хеш md5, чтобы сопоставить его с хэшем пароля, который мы сохранили в базе данных.
Теперь пришло время создать соединение с нашей таблицей «пользователи» и проверить правильность введенных данных.

1
2
3
4
5
6
7
if(isset($_POST[‘name’]) && !empty($_POST[‘name’]) AND isset($_POST[‘password’]) && !empty($_POST[‘password’])){
   $username = mysql_escape_string($_POST[‘name’]);
   $password = mysql_escape_string(md5($_POST[‘password’]));
                
   $search = mysql_query(«SELECT username, password, active FROM users WHERE username='».$username.»‘ AND password='».$password.»‘ AND active=’1′») or die(mysql_error());
   $match = mysql_num_rows($search);
           }

Мы написали запрос MySQL, который выберет имя пользователя, пароль и активную информацию из нашей базы данных, если имя пользователя и пароль совпадают.
И active = ‘1’ — это! ВАЖНО !, это гарантирует, что вы сможете войти в систему только в том случае, если ваша учетная запись активирована. Мы снова используем строки MySQL num, чтобы увидеть, сколько совпадений найдено.

1
2
3
4
5
6
if($match > 0){
    $msg = ‘Login Complete!
    // Set cookie / Start Session / Start Download etc…
}else{
    $msg = ‘Login Failed!
}

В приведенном выше коде мы проверяем, был ли вход успешным или нет.


И это конец этого урока! Я надеюсь, вам понравилось, и если вы сделали, пожалуйста, оставьте комментарий ниже!