Форма обратной связи для сайта

Здравствуйте. Данная статья является ответом на вопрос, который мне задавали несколько человек в последнее время. Звучит вопрос так: «Как сделать контактную форму обратной связи для лендинга без использования сторонних онлайн-сервисов».

Форма обратной связи нужна практически для любого сайта. Если сайт работает на базе какой-то популярной системы управления контентом (WordPress, Joomla, Drupal и т.д.), то для таких CMS существуют различные плагины, установив которые, можно легко решить эту задачу, но лендинг не работает на CMS, в большинстве случаев он состоит из файла index.html и подключаемых к нему CSS-стилей и JS-скриптов.

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

Создание контактной формы

Сначала нужно определиться с необходимыми полями:

  • Имя отправителя.
  • E-mail адрес.
  • Номер телефона.
  • Текст сообщения.
  • Согласие с обработкой персональных данных.

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

Еще хотелось бы на клиенте реализовать ввод номера телефона по маске, чтобы можно было вводить только цифры в определенном формате. Для это воспользуемся jQuery-плагином maskedinput. Валидация E-mail на клиенте будет производиться встроенными средствами браузера.

Помимо этого нужно создать еще два файла, main.css — для оформления и main.js — для отправки Ajax-запроса на сервер. Еще нам понадобится лоадер (GIF-изображение, которое будет крутиться в момент отправки почты). Все файлы сгруппируем в соответствующих папках (css, js, images). Ну и, конечно, в корне создаем индексный файл index.html и обработчик handler.php, который будет принимать и обрабатывать данные из формы. Получилась следующая структура.

Структура папок и файлов

В index.html помещу HTML-код формы и подключу стили и скрипты:

<!DOCTYPE html>
<html lang="ru">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>Форма обратной связи для сайта</title>
	<link rel="stylesheet" href="css/main.css">
</head>
<body>
	<div class="container">
		<h2>Форма обратной связи</h2>
		<form id="contactForm" action="handler.php" method="post">
			<div class="field-block">
				<label for="name">Ваше имя:</label>
				<input id="name" class="field" name="name" required type="text" placeholder="Иванов Иван Иванович">
			</div>
			<div class="field-block">
				<label for="email">Ваш E-mail:</label>
				<input id="email" class="field" name="email" required type="email" placeholder="ivanov@email.com">
			</div>
			<div class="field-block">
				<label for="phone">Ваш телефон:</label>
				<input id="phone" class="field" name="phone" required type="text" placeholder="+7 (800) 000-00-00">
			</div>
			<div class="field-block">
				<label for="message">Текст сообщения:</label>
				<textarea id="message" class="field" required name="message" rows="4"></textarea>
			</div>
			<div class="field-block">
				<input id="check" name="check" checked type="checkbox">
				<span class="check-text">Я добровольно отправляю свои данные</span>
			</div>
			<button id="button" class="button" type="submit">Отправить</button>
			<div class="result">
				<span id="answer"></span>
				<span id="loader"><img src="images/loader.gif" alt=""></span>
			</div>
		</form>
	</div>
	<script src="js/jquery.min.js"></script>
	<script src="js/jquery.maskedinput.min.js"></script>
	<script src="js/main.js"></script>
</body>
</html>

В файле main.css накидаю простенькие стили для оформления:

* {
	padding: 0;
	margin: 0;
	box-sizing: border-box;
}

body {
	font-family: Arial, sans-serif;
	font-size: 16px;
	background-color: #fff;
}

.container {
	max-width: 500px;
	margin: 50px auto;
	padding: 20px;
	border-radius: 4px;
	background-color: #ebebeb;
	box-shadow: 0 0 3px #666;
}

h2, .field-block {
	margin-bottom: 20px;
}

.field-block label, .field-block .field {
	display: block;
	width: 100%;
}

.field-block label {
	margin-bottom: 8px;
	font-weight: bold;
}

.field-block .field {
	font-size: 16px;
	padding: 8px 12px;
	line-height: 1.5;
	border-radius: 4px;
	border: 1px solid #ccc;
	box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
	transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}

.field-block .field:focus {
  border-color: #66afe9;
  outline: 0;
  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
}

.field-block textarea {
	resize: vertical;
}

.check-text {
	font-size: 14px;
	vertical-align: top;
}

.button {
	cursor: pointer;
	font-size: 16px;
	padding: 6px 12px;
	margin-bottom: 5px;
}

#loader {
	display: none;
}

На реальном сайте вы можете использовать абсолютно любой HTML-код формы с собственными CSS-стилями, которые подходят для дизайна вашей веб-страницы. Мой вариант внешнего вида формы сделан просто для примера.

В результате получилась вот такая форма:

Пример простой контактной формы

Наполняем main.js:

  • Включаем маску для ввода номера телефона.
  • Делаем проверку, если чекбокс согласия на обработку персональных данных не отмечен, то деактивируем кнопку и не даем отправить форму.
  • Формируем Ajax-запрос для отправки пользовательских данных на сервер и получение ответа от сервера.

Код в main.js получился такой:

jQuery(document).ready(function($) {

    // Добавляем маску для поля с номера телефона
    $('#phone').mask('+7 (999) 999-99-99');

    // Проверяет отмечен ли чекбокс согласия
    // с обработкой персональных данных
    $('#check').on('click', function() {
        if ($("#check").prop("checked")) {
            $('#button').attr('disabled', false);
        } else {
            $('#button').attr('disabled', true);
        }
    });

    // Отправляет данные из формы на сервер и получает ответ
    $('#contactForm').on('submit', function(event) {
        
        event.preventDefault();

        var form = $('#contactForm'),
            button = $('#button'),
            answer = $('#answer'),
            loader = $('#loader');

        $.ajax({
            url: 'handler.php',
            type: 'POST',
            data: form.serialize(),
            beforeSend: function() {
                answer.empty();
                button.attr('disabled', true).css('margin-bottom', '20px');
                loader.fadeIn();
            },
            success: function(result) {
                loader.fadeOut(300, function() {
                    answer.text(result);
                });
                form.find('.field').val('');
                button.attr('disabled', false);
            },
            error: function() {
                loader.fadeOut(300, function() {
                    answer.text('Произошла ошибка! Попробуйте позже.');
                });
                button.attr('disabled', false);
            }
        });
    
    });

});

На этом клиентская часть нашей формы завершена, переходим к серверной части.

Отправка почты на E-mail администратора

Для того чтобы отправка почты работала корректно и не было проблем со спам-фильтрами, отправляться письма должны с реального E-mail адреса и через SMTP-серверы популярных почтовых служб (Яндекс, Mail, Google).

Как это работает? В файле на сайте мы указываем логин и пароль от реального ящика, по этим данным перед отправкой почты происходит авторизация в системе почтовика и отправка с этого ящика на другой E-mail адрес (в данном случае E-mail администратора сайта).

Для реализации такого функционала воспользуемся одной из нескольких PHP-библиотек, например: PHPMailer, на мой взгляд она  попроще, и новичку будет легче с ней разобраться. Так как мы имеем дело с лендингом или сайт-визиткой, то у нас нет композера и вряд ли он понадобится, поэтому просто скачиваем и распаковываем архив.

Обратите внимание, что для корректной работы библиотеки PHPMailer версия PHP должна быть 5.5 или выше.

В корне нашего сайта создаем папку mailer и помещаем в нее папку с библиотекой, должно получиться так: site.ru/mailer/PHPMailer, на реальном сервере желательно запретить доступ к папке mailer.

Чтобы не пихать весь код в пока пустой ранее созданный обработчик handler.php, в папке mailer создадим два вспомогательных статических хелпера: Validator.php (валидирует данные из формы) и ContactMailer.php (отправляет почту, обертка над PHPMailer).

Код из Validator.php:

<?php
/**
 * Validator: класс-хелпер, валидацирует данные пришедшие от пользователя
 */
class Validator
{
	/**
     * Проверяет валидный ли E-mail, если да, то
     * возвращает TRUE, в противном случае FALSE.
     * @param string $email
     * @return boolean
     */
	public static function isValidEmail($email)
	{
		return filter_var($email, FILTER_VALIDATE_EMAIL);
	}

	/**
     * Проверяет валидный ли E-mail, если да, то
     * возвращает TRUE, в противном случае FALSE.
     * @param string $phone
     * @return boolean
     */
	public static function isValidPhone($phone)
	{
		return preg_match("#\+7 \(\d{3}\) \d{3}\-\d{2}-\d{2}#", $phone);
	}

	/**
     * Проверяет пришли ли данные POST-запросом, если да,
     * то возвращает TRUE, в противном случае FALSE.
     * @return boolean
     */
	public static function isPost()
	{
		return $_SERVER['REQUEST_METHOD'] === 'POST';
	}

	/**
     * Проверяет пришли ли данные Ajax-запросом, если да,
     * то возвращает TRUE, в противном случае FALSE.
     * @return boolean
     */
	public static function isAjax()
	{
		return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
	}
}

Код из ContactMailer.php:

<?php

use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

require_once __DIR__ . '/PHPMailer/src/Exception.php';
require_once __DIR__ . '/PHPMailer/src/PHPMailer.php';
require_once __DIR__ . '/PHPMailer/src/SMTP.php';
/**
 * Mailer: класс-хелпер, отправляет почту администратору
 */
class ContactMailer
{
	/**
     * E-mail отправителя
     * @var string
     */
    private static $emailFrom = 'send@yandex.ru';
    /**
     * E-mail получателя
     * @var string
     */
    private static $emailTo = 'admin@yandex.ru';

    /**
     * Отправляет писмо, если письмо отправлено,
     * возвращает TRUE, в противном случае FALSE.
     * @param string $name
     * @param string $email
     * @param string $phone
     * @param string $message
     * @return boolean
     */
    public static function send($name, $email, $phone, $message)
    {
		    // Формируем тело письма
		    $body = "Имя: " . $name . "\nE-mail: " . $email . "\nТелефон: " . $phone . "\n\nСообщение:\n" . $message;

		    // Создаем объект PHPMailer
        $mailer = new PHPMailer();
        // Настройки подключения
        $mailer->isSMTP();
        // Устанавливает хост почтового сервера (Mail.ru: smtp.mail.ru, Google: smtp.gmail.com)
        $mailer->Host = ' smtp.yandex.ru';
        // Включает SMTP-авторизацию
        $mailer->SMTPAuth = true;
        // Логин или E-mail целиком
        $mailer->Username = self::$emailFrom;
        // Пароль от почтового ящика
        $mailer->Password = 'XXXXXXXX';
        // Протокол соединения
        $mailer->SMTPSecure = 'ssl';
        // Порт для исходящаей почты
        $mailer->Port = '465';

        // Устанавливает кодировку
        $mailer->CharSet = 'UTF-8';
        // Устанавливает E-mail и имя отправителя
        $mailer->setFrom(self::$emailFrom, 'Имя отправителя');
        // Добавляет E-mail получателя
        $mailer->addAddress(self::$emailTo);
        // Настройка HTML-формата
        $mailer->isHTML(false);
        // Тема письма
        $mailer->Subject = 'Заполнена форма обратной связи';
        // Основное тело письма
        $mailer->Body = $body;
        
        // Отправляет письмо
        if ($mailer->send()) {
        	return true;
        }
    	  return false;
    }
}

Осталось лишь сформировать наш обработчик handler.php:

<?php

require_once __DIR__ . '/mailer/Validator.php';
require_once __DIR__ . '/mailer/ContactMailer.php';

if (!Validator::isAjax() || !Validator::isPost()) {
	echo 'Доступ запрещен!';
	exit;
}

$name = isset($_POST['name']) ? trim(strip_tags($_POST['name'])) : null;
$email = isset($_POST['email']) ? trim(strip_tags($_POST['email'])) : null;
$phone = isset($_POST['phone']) ? trim(strip_tags($_POST['phone'])) : null;
$message = isset($_POST['message']) ? trim(strip_tags($_POST['message'])) : null;

if (empty($name) || empty($email) || empty($phone) || empty($message)) {
	echo 'Все поля обязательны для заполнения.';
	exit;
}

if (!Validator::isValidEmail($email)) {
	echo 'E-mail не соответствует формату.';
	exit;
}

if (!Validator::isValidPhone($phone)) {
	echo 'Телефон не соответствует формату.';
	exit;
}

if (ContactMailer::send($name, $email, $phone, $message)) {
	echo htmlspecialchars($name) . ', ваше сообщение успешно отправлено.';
} else {
	echo 'Произошла ошибка! Не удалось отправить сообщение.';
}
exit;

Обратите внимание, что телефон на сервере валидируется по такой же маске, как и на клиенте. Также проверяется тип запроса, пришедшего на сервер, E-mail — на валидность, и все поля — на пустоту. Если не сработает хоть одно условие, то форма не отправится и выведется сообщение об соответствующей ошибке.

Не забудьте изменить данные в настройках ContactMailer.php: E-mail получателя, E-mail и пароль отправителя, адрес вашего SMTP-сервера и т.д. Ко всем используемым настройкам я написал пояснение в коде. Если будите применять данное решение на реальном сайте, внимательно смотрите все пути к файлам и сделайте бекап, прежде чем вносить изменения.

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

На этом все. Надеюсь, все понятно изложил. Если остались вопросы, пишите в комментариях. В следующей статье рассмотрим как реализовать форму обратной связи во всплывающем модальном окне, используя Bootstrap 4.

Похожие записи: Axios: библиотека для работы с Ajax без использования jQuery Всплывающая форма обратной связи используя Bootstrap 4 Open Server: установка и работа с сервером
Добавлено коментариев -  20
  • Роман 15.08.2018 23:19

    Здравствуйте! Необходимо убрать email и текст сообщения, вроде все убрал, но все равно не работает.

    Заранее спасибо.

    handler.php

    <?php
    
    require_once __DIR__ . '/mailer/Validator.php';
    require_once __DIR__ . '/mailer/ContactMailer.php';
    
    if (!Validator::isAjax() || !Validator::isPost()) {
        echo 'Доступ запрещен!';
        exit;
    }
    
    $name = isset($_POST['name']) ? trim(strip_tags($_POST['name'])) : null;
    $phone = isset($_POST['phone']) ? trim(strip_tags($_POST['phone'])) : null;
    
    if (empty($name) || empty($phone)) {
        echo 'Все поля обязательны для заполнения.';
        exit;
    }
    
    if (!Validator::isValidPhone($phone)) {
        echo 'Телефон не соответствует формату.';
        exit;
    }
    
    if (ContactMailer::send($name, $phone)) {
        echo htmlspecialchars($name) . ', ваше сообщение успешно отправлено.';
    } else {
        echo 'Произошла ошибка! Не удалось отправить сообщение.';
    }
    exit;
    

    Validator.php

    <?php
    /**
     * Validator: класс-хелпер, валидацирует данные пришедшие от пользователя
     */
    class Validator
    {
    
        /**
         * Проверяет валидный ли E-mail, если да, то
         * возвращает TRUE, в противном случае FALSE.
         * @param string $phone
         * @return boolean
         */
        public static function isValidPhone($phone)
        {
            return preg_match("#\+7 \(\d{3}\) \d{3}\-\d{2}-\d{2}#", $phone);
        }
    
        /**
         * Проверяет пришли ли данные Ajax-запросом, если да,
         * то возвращает TRUE, в противном случае FALSE.
         * @return boolean
         */
        public static function isAjax()
        {
            return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
        }
    }

    ContactMailer.php

    <?php
    
    use PHPMailer\PHPMailer\Exception;
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\SMTP;
    
    require_once __DIR__ . '/PHPMailer/src/Exception.php';
    require_once __DIR__ . '/PHPMailer/src/PHPMailer.php';
    require_once __DIR__ . '/PHPMailer/src/SMTP.php';
    /**
     * Mailer: класс-хелпер, отправляет почту администратору
     */
    class ContactMailer
    {
        /**
         * E-mail отправителя
         * @var string
         */
        private static $emailFrom = 'email_from@yandex.ru';
        /**
         * E-mail получателя
         * @var string
         */
        private static $emailTo = 'email_to@gmail.com';
    
        /**
         * Отправляет писмо, если письмо отправлено,
         * возвращает TRUE, в противном случае FALSE.
         * @param string $name
         * @param string $email
         * @param string $phone
         * @param string $message
         * @return boolean
         */
        public static function send($name, $phone)
        {
            // Формируем тело письма
            $body = "Имя: " . $name . "\nТелефон: " . $phone;
    
            // Создаем объект PHPMailer
            $mailer = new PHPMailer();
            // Настройки подключения
            $mailer->isSMTP();
            // Устанавливает хост почтового сервера (Mail.ru: smtp.mail.ru, Google: smtp.gmail.com)
            $mailer->Host = ' smtp.yandex.ru';
            // Включает SMTP-авторизацию
            $mailer->SMTPAuth = true;
            // Логин или E-mail целиком
            $mailer->Username = 'email_from@yandex.ru';
            // Пароль от почтового ящика
            $mailer->Password = 'XXXXXXXX';
            // Протокол соединения
            $mailer->SMTPSecure = 'ssl';
            // Порт для исходящаей почты
            $mailer->Port = '465';
    
            // Устанавливает кодировку
            $mailer->CharSet = 'UTF-8';
            // Устанавливает E-mail и имя отправителя
            $mailer->setFrom(self::$emailFrom, 'Имя отправителя');
            // Добавляет E-mail получателя
            $mailer->addAddress(self::$emailTo);
            // Настройка HTML-формата
            $mailer->isHTML(false);
            // Тема письма
            $mailer->Subject = 'Заполнена форма обратной связи';
            // Основное тело письма
            $mailer->Body = $body;
           
            // Отправляет письмо
            if ($mailer->send()) {
                return true;
            }
            return false;
        }
    }
    Ответить
    • Евгений 15.08.2018 23:47

      Здравствуйте. В классе Validator.php вы убрали метод isPost(), который вызывается в обработчике handler.php.

      Класс Validator.php должен быть таким:

      <?php
      /**
       * Validator: класс-хелпер, валидацирует данные пришедшие от пользователя
       */
      class Validator
      {
      
          /**
           * Проверяет валидный ли E-mail, если да, то
           * возвращает TRUE, в противном случае FALSE.
           * @param string $phone
           * @return boolean
           */
          public static function isValidPhone($phone)
          {
              return preg_match("#\+7 \(\d{3}\) \d{3}\-\d{2}-\d{2}#", $phone);
          }
      
          /**
           * Проверяет пришли ли данные POST-запросом, если да,
           * то возвращает TRUE, в противном случае FALSE.
           * @return boolean
           */
      	public static function isPost()
      	{
      		return $_SERVER['REQUEST_METHOD'] === 'POST';
      	}
      
          /**
           * Проверяет пришли ли данные Ajax-запросом, если да,
           * то возвращает TRUE, в противном случае FALSE.
           * @return boolean
           */
          public static function isAjax()
          {
              return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
          }
      }

      Да, и на будущее. Никогда не светите свои е-мейлы с паролями от них! ;-)

      Ответить
      • Роман 16.08.2018 00:06

        Спасибо! Работает!

        Да с логином, паролем поторопился, спасибо, что убрали в сообщении.

        Ответить
        • Евгений 16.08.2018 00:07

          Пожалуйста)

          Ответить
  • Роман 16.08.2018 09:34

    Здравствуйте! Подскажите пожалуйста если добавляю на одну страницу более чем одну форму обратной связи, первая форма перестает корректно работать, а именно маска ввода телефона, в последующих маска не появляется, формы перестают работать. Формы добаляю в index.html следующим кодом, ничего не меняя в последующих, возможно дело в ява скриптах, пробовал вставить их в head, первая форма работает нормально, последующие две нет.

    <div class="container">
        <form id="contactForm" action="handler.php" method="post">
            <div class="field-block">
                <input id="name" class="field" name="name" required type="text" placeholder="Ваше имя">
            </div>
            <div class="field-block">
                <input id="phone" class="field" name="phone" required type="text" placeholder="+7 (800) 000-00-00">
            </div>
            <div class="field-block">
                <input id="check" name="check" checked type="checkbox">
                <span class="check-text">Я добровольно отправляю свои данные</span>
            </div>
            <button id="button" class="button" type="submit">Отправить</button>
            <div class="result">
                <span id="answer"></span>
                <span id="loader"><img src="images/loader.gif" alt=""></span>
            </div>
        </form>
    </div>
    <script src="js/jquery.min.js"></script>
    <script src="js/jquery.maskedinput.min.js"></script>
    <script src="js/main.js"></script>
    Ответить
    • Евгений 16.08.2018 12:35

      Все дело в том, что любой идентификатор (id="...") может быть только один на страницу.

      Решение простое, уберите id="phone" и добавте класс phone, ко всем полям для ввода телефона, вместо:

      <input id="phone" class="field" name="phone" required type="text" placeholder="+7 (800) 000-00-00">

      у вас получиться вот так:

      <input class="field phone" name="phone" required type="text" placeholder="+7 (800) 000-00-00">

      и еще измените в main.js вызов маски, с этого:

      $('#phone').mask('+7 (999) 999-99-99');

      на этот:

      $('.phone').mask('+7 (999) 999-99-99');

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

      Ответить
  • Роман 18.08.2018 10:46

    Здарвствуйте! Спасибо! Все работает в трех формах на одной странице, подключаемые скрипты ява записал в head. Теперь будем пробовать сделать всплывающую форму на сайте)

    Ответить
    • Евгений 18.08.2018 13:53

      Пожалуйста, удачи!)

      Ответить
  • Mikhail 19.08.2018 08:51

    Здравствуйте! Не могли бы Вы подробнее рассказать, что именно нужно менять  в ContactMailer.php? Например, email отправителя должен быть заполнен мной, или он подставляется автоматически? То же самое с получателем, тот же вопрос. И что нужно менять в этой части?

    $mailer->Host = ' smtp.gmail.com';
    
    // Включает SMTP-авторизацию
    
    $mailer->SMTPAuth = true;
    
    // Логин или E-mail целиком
    
    $mailer->Username = self::$emailFrom;
    
    // Пароль от почтового ящика
    
    $mailer->Password = 'XXXXXXXX';
    
    // Протокол соединения
    
    $mailer->SMTPSecure = 'ssl';
    
    // Порт для исходящаей почты
    
    $mailer->Port = '465';

    Прошу прощения, если вопросы глупые, но самому разобраться не получается :(

    Ответить
    • Евгений 19.08.2018 12:06

      Здравствуйте. В начале файла объявляются два статических свойства:

      /**
      * E-mail отправителя
      * @var string
      */
      private static $emailFrom = 'send@yandex.ru';
      /**
      * E-mail получателя
      * @var string
      */
      private static $emailTo = 'admin@yandex.ru';

      сюда вписываете свои «е-мелы», а ниже они подставляются автоматически. Далее в свойство $mailer->Password вписываете пароль от ящика, который будет отправлять письмо, а в свойстве $mailer->Host указываете хост ящика отправителя (smtp.mail.ru, smtp.gmail.com, smtp.yandex.ru и т.д.), т.е. хост сервиса где расположен ящик отправителя. В принципе, все.

      Ответить
      • Mikhail 19.08.2018 15:34

        Евгений, сделал все, как Вы сказали, но почему-то при отправке всегда выскакивает ошибка "попробуйте позже". С чем это может быть связано?

        Ответить
        • Евгений 19.08.2018 22:50

          Скореее всего проблема в вашем сервере, так как прилюбом нормалном раскладе этот код будет радотать! Напишите мне в личку объяснив проблему подробнее и мы решим эту проблему.

          Ответить
  • Максим 30.08.2018 14:08

    Добрый день Евгений, вставил форму на сайт, и после заполнения формы и нажатия "отправить" пояаляется абра кадабра по середине страници , где может быть ошибка?

    Ответить
    • Евгений 01.09.2018 18:32

      Здравствуйте! Перешел по ссылке, которую вы дали, отправил форму, все выводится коррекно.

      Ответить
  • Иван 30.08.2018 21:30

    Евгений, у меня такая же проблема как и у последнего, человека

    Я даже вам в личку не могу написать

    Ответить
    • Евгений 01.09.2018 18:35

      Злравствуйте. Почему не можете написать? Заполните и отправте форму на этой странице.

      Ответить
  • Виктор 20.09.2018 15:00

    Спасибо за статью, для своего сайта необходимо было добавить еще несколько полей в форму. Попробовал сделать это самостоятельно, но так и не получилось. Да и письма на почту не приходят. В чем может быть дело? Пока собрал себе форму в конструкторе FormDesigner.ru, но хотелось бы разобраться с вашей формой.

    Ответить
    • Евгений 20.09.2018 21:50

      Здравствуйте. В классе ContactMailer при создании объекта PHPMailer добавьте true, т.е. было так:

      $mailer = new PHPMailer();

      а станет так:

      $mailer = new PHPMailer(true);

      это включит режим отладки и выведет ошибку на экран.

      Ответить
  • Анатолий 20.09.2018 20:16

    Евгений, День добрый. Спасибо за ваш труд. 

    Если не сложно, то объясните для тех, кто с бронепоезда, что такое адрес отправителя, адрес получателя и  пароль.

    Еще раз спасибо!

    Ответить
    • Евгений 20.09.2018 22:05

      Добрый. Адрес отправителя  - это реальный адрес электронной почты (ЯндексПочта, Gmail, Mail), а пароль - это собственно пароль от этого ящика. Адрес получателя - это тоже реальный  адрес электронной почты (ящик администратора), на который будет отправлять письма первый ящик.

      Ответить

Добавить комментарийОтменить ответ

Нажимая на кнопку «Добавить», я даю согласие на обработку своих персональных данных в соответствии с политикой конфиденциальности