Не отправляется письмо на почту при регистрации

124
12 сентября 2019, 01:50

Написал регистрацию пользователей на сайте, но при нажатии на кнопку зарегистрироваться, появляется ошибка "Ошибка при отправлении письма с сcылкой подтверждения, на почту", запись в БД добавляется. Вот код обработчика формы. Заранее спасибо за помощь.

<?php
    //Запускаем сессию
    session_start();
    //Добавляем файл подключения к БД
    require_once("dbconnect.php");
    //Объявляем ячейку для добавления ошибок, которые могут возникнуть при обработке формы.
    $_SESSION["error_messages"] = '';
    //Объявляем ячейку для добавления успешных сообщений
    $_SESSION["success_messages"] = '';
    /*
        Проверяем, была ли отправлена форма, то есть была ли нажата кнопка зарегистрироваться. Если да, то идём дальше, если нет, то выведем пользователю сообщение об ошибке, о том, что он зашёл на эту страницу напрямую.
    */
    if(isset($_POST["btn_submit_register"]) && !empty($_POST["btn_submit_register"])){
        //Проверяем полученную капчу
        //Обрезаем пробелы с начала и с конца строки
        $captcha = trim($_POST["captcha"]);
        if(isset($_POST["captcha"]) && !empty($captcha)){
            //Сравниваем полученное значение со значением из сессии. 
            if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != "")){
                // Если капча не верна, то возвращаем пользователя на страницу регистрации, и там выведем ему сообщение об ошибке что он ввёл неправильную капчу.
                $error_message = "<p class='mesage_error'><strong>Ошибка!</strong>Неправильная капча</p>";
                // Сохраняем в сессию сообщение об ошибке. 
                $_SESSION["error_messages"] = $error_message;
                //Возвращаем пользователя на страницу регистрации
                header("HTTP/1.1 301 Moved Permanently");
                header("Location: ".$address_site."form_register.php");
                //Останавливаем скрипт
                exit();
            }

            /* Проверяем, если в глобальном массиве $_POST существуют данные отправленные из формы и заключаем переданные данные в обычные переменные.*/
            if(isset($_POST["first_name"])){
                //Обрезаем пробелы с начала и с конца строки
                $first_name = trim($_POST["first_name"]);
                //Проверяем переменную на пустоту
                if(!empty($first_name)){
                    // Для безопасности, преобразуем специальные символы в HTML-сущности
                    $first_name = htmlspecialchars($first_name, ENT_QUOTES);
                }else{
                    // Сохраняем в сессию сообщение об ошибке. 
                    $_SESSION["error_messages"] .= "<p class='mesage_error'>Укажите Ваше имя</p>";
                    //Возвращаем пользователя на страницу регистрации
                    header("HTTP/1.1 301 Moved Permanently");
                    header("Location: ".$address_site."form_register.php");
                    //Останавливаем скрипт
                    exit();
                }

            }else{
                // Сохраняем в сессию сообщение об ошибке. 
                $_SESSION["error_messages"] .= "<p class='mesage_error'>Отсутствует поле с именем</p>";
                //Возвращаем пользователя на страницу регистрации
                header("HTTP/1.1 301 Moved Permanently");
                header("Location: ".$address_site."form_register.php");
                //Останавливаем скрипт
                exit();
            }

            if(isset($_POST["last_name"])){
                //Обрезаем пробелы с начала и с конца строки
                $last_name = trim($_POST["last_name"]);
                if(!empty($last_name)){
                    // Для безопасности, преобразуем специальные символы в HTML-сущности
                    $last_name = htmlspecialchars($last_name, ENT_QUOTES);
                }else{
                    // Сохраняем в сессию сообщение об ошибке. 
                    $_SESSION["error_messages"] .= "<p class='mesage_error' >Укажите Вашу фамилию</p>";
                    //Возвращаем пользователя на страницу регистрации
                    header("HTTP/1.1 301 Moved Permanently");
                    header("Location: ".$address_site."form_register.php");
                    //Останавливаем  скрипт
                    exit();
                }

            }else{
                // Сохраняем в сессию сообщение об ошибке. 
                $_SESSION["error_messages"] .= "<p class='mesage_error' >Отсутствует поле с фамилией</p>";
                //Возвращаем пользователя на страницу регистрации
                header("HTTP/1.1 301 Moved Permanently");
                header("Location: ".$address_site."form_register.php");
                //Останавливаем  скрипт
                exit();
            }

            if(isset($_POST["email"])){
                //Обрезаем пробелы с начала и с конца строки
                $email = trim($_POST["email"]);
                if(!empty($email)){

                    $email = htmlspecialchars($email, ENT_QUOTES);
                    // (3) Место кода для проверки формата почтового адреса и его уникальности
                    //Проверяем формат полученного почтового адреса с помощью регулярного выражения
                    $reg_email = "/^[a-z0-9][a-z0-9\._-]*[a-z0-9]*@([a-z0-9]+([a-z0-9-]*[a-z0-9]+)*\.)+[a-z]+/i";
                    //Если формат полученного почтового адреса не соответствует регулярному выражению
                    if( !preg_match($reg_email, $email)){
                        // Сохраняем в сессию сообщение об ошибке. 
                        $_SESSION["error_messages"] .= "<p class='mesage_error' >Вы ввели неправельный email</p>";
                        //Возвращаем пользователя на страницу регистрации
                        header("HTTP/1.1 301 Moved Permanently");
                        header("Location: ".$address_site."form_register.php");
                        //Останавливаем  скрипт
                        exit();
                    }
                    //Проверяем, нет ли уже такого адреса в БД.
                    $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`='".$email."'");
                    //Если кол-во полученных строк ровно единице, значит, пользователь с таким почтовым адресом уже зарегистрирован
                    if($result_query->num_rows == 1){
                        //Если полученный результат не равен false
                        if(($row = $result_query->fetch_assoc()) != false){
                                // Сохраняем в сессию сообщение об ошибке. 
                                $_SESSION["error_messages"] .= "<p class='mesage_error' >Пользователь с таким почтовым адресом уже зарегистрирован</p>";
                                //Возвращаем пользователя на страницу регистрации
                                header("HTTP/1.1 301 Moved Permanently");
                                header("Location: ".$address_site."form_register.php");
                        }else{
                            // Сохраняем в сессию сообщение об ошибке. 
                            $_SESSION["error_messages"] .= "<p class='mesage_error' >Ошибка в запросе к БД</p>";
                            //Возвращаем пользователя на страницу регистрации
                            header("HTTP/1.1 301 Moved Permanently");
                            header("Location: ".$address_site."form_register.php");
                        }
                        /* закрытие выборки */
                        $result_query->close();
                        //Останавливаем  скрипт
                        exit();
                    }
                    /* закрытие выборки */
                    $result_query->close();
                }else{
                    // Сохраняем в сессию сообщение об ошибке. 
                    $_SESSION["error_messages"] .= "<p class='mesage_error' >Укажите Ваш email</p>";
                    //Возвращаем пользователя на страницу регистрации
                    header("HTTP/1.1 301 Moved Permanently");
                    header("Location: ".$address_site."form_register.php");
                    //Останавливаем  скрипт
                    exit();
                }
            }else{
                // Сохраняем в сессию сообщение об ошибке. 
                $_SESSION["error_messages"] .= "<p class='mesage_error' >Отсутствует поле для ввода Email</p>";
                //Возвращаем пользователя на страницу регистрации
                header("HTTP/1.1 301 Moved Permanently");
                header("Location: ".$address_site."form_register.php");
                //Останавливаем  скрипт
                exit();
            }

            if(isset($_POST["password"])){
                //Обрезаем пробелы с начала и с конца строки
                $password = trim($_POST["password"]);
                //Проверяем, совпадают ли пароли
                if(isset($_POST["confirm_password"])){
                    //Обрезаем пробелы с начала и с конца строки
                    $confirm_password = trim($_POST["confirm_password"]);
                    if($confirm_password != $password){
                        // Сохраняем в сессию сообщение об ошибке. 
                        $_SESSION["error_messages"] .= "<p class='mesage_error' >Пароли не совпадают</p>";
                        //Возвращаем пользователя на страницу регистрации
                        header("HTTP/1.1 301 Moved Permanently");
                        header("Location: ".$address_site."form_register.php");
                        //Останавливаем  скрипт
                        exit();
                    }
                }else{
                    // Сохраняем в сессию сообщение об ошибке. 
                    $_SESSION["error_messages"] .= "<p class='mesage_error' >Отсутствует поле для повторения пароля</p>";
                    //Возвращаем пользователя на страницу регистрации
                    header("HTTP/1.1 301 Moved Permanently");
                    header("Location: ".$address_site."form_register.php");
                    //Останавливаем  скрипт
                    exit();
                }
                if(!empty($password)){
                    $password = htmlspecialchars($password, ENT_QUOTES);
                    //Шифруем папроль
                    $password = md5($password."top_secret"); 
                }else{
                    // Сохраняем в сессию сообщение об ошибке. 
                    $_SESSION["error_messages"] .= "<p class='mesage_error' >Укажите Ваш пароль</p>";
                    //Возвращаем пользователя на страницу регистрации
                    header("HTTP/1.1 301 Moved Permanently");
                    header("Location: ".$address_site."form_register.php");
                    //Останавливаем  скрипт
                    exit();
                }
            }else{
                // Сохраняем в сессию сообщение об ошибке. 
                $_SESSION["error_messages"] .= "<p class='mesage_error' >Отсутствует поле для ввода пароля</p>";
                //Возвращаем пользователя на страницу регистрации
                header("HTTP/1.1 301 Moved Permanently");
                header("Location: ".$address_site."form_register.php");
                //Останавливаем  скрипт
                exit();
            }

            // (4) Место для кода добавления пользователя в БД
            //Удаляем пользователей из таблицы users, которые не подтвердили свою почту в течении сутки

            //Запрос на добавления пользователя в БД
            $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password, date_registration) VALUES ('".$first_name."', '".$last_name."', '".$email."', '".$password."', NOW())");
            if(!$result_query_insert){
                // Сохраняем в сессию сообщение об ошибке. 
                $_SESSION["error_messages"] .= "<p class='mesage_error' >Ошибка запроса на добавления пользователя в БД</p>";
                //Возвращаем пользователя на страницу регистрации
                header("HTTP/1.1 301 Moved Permanently");
                header("Location: ".$address_site."form_register.php");
                //Останавливаем  скрипт
                exit();
            }else{
                //Удаляем пользователей из таблицы confirm_users, которые не подтвердили свою почту в течении сутки

                //Составляем зашифрованный и уникальный token
                $token=md5($email.time());
                //Добавляем данные в таблицу confirm_users
                $query_insert_confirm = $mysqli->query("INSERT INTO `confirm_users` (email, token, date_registration) VALUES ('".$email."', '".$token."', NOW()) ");
                if(!$query_insert_confirm){
                    // Сохраняем в сессию сообщение об ошибке. 
                    $_SESSION["error_messages"] .= "<p class='mesage_error' >Ошибка запроса на добавления пользователя в БД (confirm)</p>";
                    //Возвращаем пользователя на страницу регистрации
                    header("HTTP/1.1 301 Moved Permanently");
                    header("Location: ".$address_site."form_register.php");
                    //Останавливаем  скрипт
                    exit();
                }else{
                    //Составляем заголовок письма
                    $subject = "Подтверждение почты на сайте ".$_SERVER['HTTP_HOST'];
                    //Устанавливаем кодировку заголовка письма и кодируем его
                    $subject = "=?utf-8?B?".base64_encode($subject)."?=";
                    //Составляем тело сообщения
                    $message = 'Здравствуйте! <br/> <br/> Сегодня '.date("d.m.Y", time()).', неким пользователем была произведена регистрация на сайте <a href="'.$address_site.'">'.$_SERVER['HTTP_HOST'].'</a> используя Ваш email. Если это были Вы, то, пожалуйста, подтвердите адрес вашей электронной почты, перейдя по этой ссылке: <a href="'.$address_site.'activation.php?token='.$token.'&email='.$email.'">'.$address_site.'activation/'.$token.'</a> <br/> <br/> В противном случае, если это были не Вы, то, просто игнорируйте это письмо. <br/> <br/> <strong>Внимание!</strong> Ссылка действительна 24 часа. После чего Ваш аккаунт будет удален из базы.';
                    //Составляем дополнительные заголовки для почтового сервиса mail.ru
                    //Переменная $email_admin, объявлена в файле dbconnect.php
                    $headers = "FROM: $email_admin\r\nReply-to: $email_admin\r\nContent-type: text/html; charset=utf-8\r\n";
                    //Отправляем сообщение с ссылкой для подтверждения регистрации на указанную почту и проверяем отправлена ли она успешно или нет. 
                    if(mail($email, $subject, $message, $headers)){
                        $_SESSION["success_messages"] = "<h4 class='success_message'><strong>Регистрация прошла успешно!!!</strong></h4><p class='success_message'> Теперь необходимо подтвердить введенный адрес электронной почты. Для этого, перейдите по ссылке указанную в сообщение, которую получили на почту ".$email." </p>";
                        //Отправляем пользователя на страницу регистрации и убираем форму регистрации
                        header("HTTP/1.1 301 Moved Permanently");
                        header("Location: ".$address_site."form_register.php?hidden_form=1");
                        exit();
                    }else{
                        $_SESSION["error_messages"] .= "<p class='mesage_error' >Ошибка при отправлении письма с сcылкой подтверждения, на почту ".$email." </p>";
                    }
                    // Завершение запроса добавления пользователя в таблицу users

                    // Завершение запроса добавления пользователя в таблицу confirm_users
                }
            }
            //Закрываем подключение к БД
            $mysqli->close();
            //Отправляем пользователя на страницу регистрации
            header("HTTP/1.1 301 Moved Permanently");
            header("Location: ".$address_site."form_register.php");
            exit();
        }else{
            //Если капча не была передана либо оно является пустой
            exit("<p><strong>Ошибка!</strong> Отсутствует проверечный код, то есть код капчи. Вы можете перейти на <a href=".$address_site."> главную страницу </a>.</p>");
        }
    }else{
        exit("<p><strong>Ошибка!</strong> Вы зашли на эту страницу напрямую, поэтому нет данных для обработки. Вы можете перейти на <a href=".$address_site."> главную страницу </a>.</p>");
    }
?>
READ ALSO
Заменить site.ru/images/14172/1.jpg на site.ru/img/01-02-2019/1.jpg

Заменить site.ru/images/14172/1.jpg на site.ru/img/01-02-2019/1.jpg

Как заменить images/14172/ на img/01-02-2019/

117
php object to array

php object to array

Этот вопрос мусолился не раз, но все же, вот с чем столкнулся

132
Проблема с активацией почты

Проблема с активацией почты

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

152
Убрать хешбанг (#!) с URL

Убрать хешбанг (#!) с URL

Есть сайт, нужно сделать редирект со всех его страниц на главную страницу другого сайтаЭтого я легко добился с помощью редиректа в

138