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

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

Форма обратной связи нужна практически для любого сайта. Если сайт работает на базе какой-то популярной системы управления контентом (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);
	}

	/**
     * Проверяет валидный ли телефон, если да, то
     * возвращает 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: установка и работа с сервером
Добавлено коментариев -  193
  • Роман 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), а пароль - это собственно пароль от этого ящика. Адрес получателя - это тоже реальный  адрес электронной почты (ящик администратора), на который будет отправлять письма первый ящик.

      Ответить
  • Арт 02.10.2018 21:21

    Что-то не работает форма. Пишет "попробуйте позже", хотя я пробовал ящики на яндексе и на gmail =(

    Ответить
    • Евгений 02.10.2018 22:01

      Здравствуйте. Чтобы увидеть реальную причину и вывести ошибку, в файле ContactMailer.php при создании объекта PHPMailer передайте true. То есть было так:

      $mailer = new PHPMailer();

      А станет так:

      $mailer = new PHPMailer(true);
      Ответить
  • Николай 05.10.2018 18:27

    Здравствуйте, Евгений

    Сделал все как у вас прописано и при нажатии кнопки у меня просто открывается окно с кодом handler.php. Больше нечего.:(

    Ответить
    • Евгений 05.10.2018 21:34

      А что конкретно выводится, что за код? Скопируйте и вставьте в ответ на этот комментарий, там в поле есть специальная кнопочка для вставки кода.

      Ответить
  • Ольга 08.10.2018 07:57

    Здравствуйте! Подскажите, вот есть определенный набор номера телефона +7 (999) 999-99-99, я вчера неправильно его написала и в связи с этим форма обновилась, сообщение стерлось. Нужно заново в водить сообщение и все данные. Нельзя сделать так чтобы телефон можно было написать как угодно? Я думаю это может нервировать клиентов, если 1-2 раза они неправильно вобъют телефон (не по форме) и уйдут просто с сайта.

    // Добавляем маску для поля с номера телефона
    $('#phone').mask('+7 (999) 999-99-99');
    Ответить
    • Евгений 08.10.2018 09:07

      Здравствуйте. Да можно конечно. Удалите эту строку, которую вы привели выше, не подключайте jquery.maskedinput.min.js и все.

      Ответить
      • Ольга 08.10.2018 17:19

        Я убрала это $('#phone').mask('+7 (999) 999-99-99');
        Но сообщение после этого не получалось отправить.
        Писал что не возможно отправить запрос (или что там в настрайках, забыла точную фразу)
        не подключайте jquery.maskedinput.min.js - это я должна как-то отключить. 
        Но тогда не будет работать другие формы, проверка e-mail например.

        Ответить
        • Евгений 08.10.2018 22:40

          Помимо $('#phone').mask('+7 (999) 999-99-99') нужно убрать еще в файле Validator.php:

          public static function isValidPhone($phone)
          {
              return preg_match("#\+7 \(\d{3}\) \d{3}\-\d{2}-\d{2}#", $phone);
          }

          И еще в файле handler.php удалите это:

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

          и замените это:

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

          на это:

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

          Все, теперь по идее все должно работать.

          Ответить
  • Дмитрий 08.10.2018 12:22

    Евгений, добрый день! 

    Делаю все по инструкции, но в итоге при нажатии кнопки отправить появляются вот такие ошибки (скриншоты ниже).

    Такое тоже проделывал $mailer = new PHPMailer(true);

    После постановки "true", тоже появляется ошибка типа этой: "Возникла ошибка. Попробуйте позже."

    Помогите пожалуйста.

    Ответить
    • Евгений 08.10.2018 22:32

      Ну во-первых нужно установить кодировку, в .htaccess или как хотите, чтобы можно было прочитать выводимое сообщение, там где сейчас "кракозябры".

      Ответить
  • Альфред 11.10.2018 17:36

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

    <br /> <b>Parse error</b>: syntax error, unexpected '[' in <b>X:\OpenServer\domains\XXXXXXXXXX.ru\mailer\PHPMailer\src\PHPMailer.php</b> on line <b>288</b><br />

    В чем может быть ошибка. все вроде прописал, может быть причина в использовании PHP 5.3?

    Ответить
    • Евгений 12.10.2018 16:25

      Как убрать код, который обрабатывает телефон, я написал чуть выше. Да, версия PHP должна быть 5.5 или выше.

      Ответить
  • Григорий 11.10.2018 22:39

    Здравствуйте!
    А как предусмотреть в данной форме защиту от спама, капчу какую нибудь?

    Ответить
    • Евгений 12.10.2018 16:31

      Здравствуйте. Можо просто встроить готовую капчу, например от гугла (Google reCaptcha). У них есть документация, там весь процесс интеграции описан по шагам.

      Ответить
  • Евгений 12.10.2018 15:55

    Добрый день, тёска. У меня проблема как у двух выше: "Делаю все по инструкции, но в итоге при нажатии кнопки отправить появляются вот такие ошибки (скриншоты ниже).Такое тоже проделывал $mailer = new PHPMailer(true);После постановки "true", тоже появляется ошибка типа этой: "Возникла ошибка. Попробуйте позже."

    В службу хостинга написал у меня она на reg.ru. Пока  не заработало. В чём может быть проблема?

    Ответить
    • Евгений 12.10.2018 16:34

      Киньте ссылку, я гляну и отвечу в этом же комментарии.

      Ответить
  • Евгений 16.10.2018 16:14

    Не знаю что я сделал с формой но она работает как надо. Из того что делал. Писал в службу поддержки хостингу. Но они сказали что всё Ок. Хотя может что и поправили. На сайте просмотрел всё ещё раз и сделал пару тестов с паролем - хотя вроде ничего не поменял.

    Как заметил что всё заработало. Все письма которые отправлял для теста в течении 30 минут пришли друг за другом с интервалом около минуты.

    Ответить
    • Евгений 16.10.2018 20:02

      Если ничего сами не изменяли, значит скорее всего что-то было у хостера, ну это уже не важно, главное заработало))

      Ответить
  • Дмитрий 17.10.2018 16:21

    Добрый день!
    Большое спасибо за форму!
    Никак не могу добиться, чтобы форма работала без полей е-мэйла и сообщения. Пробовал менять код на тот, который приводили в одном из верхних сообщений - увы...

    Ответить
    • Евгений 18.10.2018 19:38

      Добрый! Если убираете ненужные поля, то не забудьте изменить функцию send() в файле ContactMailer.php.

      // В вашем случае замените это
      public static function send($name, $email, $phone, $message)
      // на это
      public static function send($name, $phone)
      
      // и это
      $body = "Имя: " . $name . "\nE-mail: " . $email . "\nТелефон: " . $phone . "\n\nСообщение:\n" . $message;
      // на это
      $body = "Имя: " . $name . "\nТелефон: " . $phone;

      Ну и в файле handler.php нужно заменить:

      // Эту строку
      if (ContactMailer::send($name, $email, $phone, $message)) {
      // на эту
      if (ContactMailer::send($name, $phone)) {
      Ответить
  • Костас 28.10.2018 15:17

    Выдает ошибку при отправке, консоль:

    jquery.min.js:2 Access to XMLHttpRequest at 'file:///C:/Users/.../Desktop/.../handler.php' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

    Поможете?

    Ответить
    • Евгений 28.10.2018 18:28

      Да тут в принципе все написано, вы должны открывать свои файлы в браузере по http протоколу используя какой-нибудь web-server, а не просто по протоколу file.

      Ответить
  • Марина 09.11.2018 17:01

    Добрый день!

    Подскажите, есть ли вариант не прописывать какую-либо почту для отправки почты (send@domain.com)? Смущает необходимость прописывать пароль. Впервые с таким встречаюсь. Я встраивала такие формы, но это было давно, сейчас я их не найду. 

    Отправка на корпоративную почту в домене сайта.

    Ответить
    • Евгений 10.11.2018 12:42

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

      Альтернативой этому может быть два варианта:

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

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

      А если переживаете поводу пароля, ну создайте новую почту специально для этой цели, в большинстве случаев именно так и делают.

      Ответить
      • Марина 14.11.2018 12:53

        Почта на собственном сервере, домен тот же, что и сайт. Можно ли использовать mail()?

        Пока разбираюсь по описанному алгоритму. Выдает ошибку "Доступ запрещен!" в адресной строке domain.ru/handler.php. В чем может быть дело?

        Ответить
        • Евгений 14.11.2018 21:37

          Попробуйте, по идее должна, но я бы не рекомендовал.

          Доступ запрещен, потому что запрос к этому файлу можно делать только постом и аякс-запросом:

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

          Просмотрите еще раз статью внимательно.

          Ответить
  • Вячеслав 11.11.2018 03:14

    Евгений, добрый день!

    Пробую разобраться в Вашей форме. Появились сложности

    Вадает следующее:

    <?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;
    Ответить
    • Евгений 11.11.2018 10:57

      Добрый. Это содержимое файла handler.php, который описан в статье. Вернулось содержимое как из обычного текстового файла, это говорит о том, что скорее всего на сервере или просто в вашем пакете услуг на хостинге, где расположен сайт, отсутствует интерпретатор PHP.

      Ответить
      • Вячеслав 11.11.2018 14:28

        Евгений, большое спасибо. Подключил php - и бракозяблы ушли с сайта.

        Теперь видимо пошли ошибки :)

        Произошла ошибка! Попробуйте позже. в Edge
        Произошла ошибка! Не удалось отправить сообщение. в Яндексбраузере.

        Ответить
        • Евгений 11.11.2018 15:22

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

          Ответить
          • Вячеслав 11.11.2018 16:02

            Сделал как вы сказали!

            Выдает следующее:

            <br /> <b>Fatal error</b>: Uncaught exception 'PHPMailer\PHPMailer\Exception' with message 'SMTP Error: data not accepted.' in /home/users/7/79094113888/domains/test.lageneral.ru/mailer/PHPMailer/src/PHPMailer.php:1789 Stack trace: #0 /home/users/7/79094113888/domains/test.lageneral.ru/mailer/PHPMailer/src/PHPMailer.php(1513): PHPMailer\PHPMailer\PHPMailer-&gt;smtpSend('Date: Sun, 11 N...', '\xD0\x98\xD0\xBC\xD1\x8F: \xD0\xA2\xD0\xB5\xD1\x81\xD1...') #1 /home/users/7/79094113888/domains/test.lageneral.ru/mailer/PHPMailer/src/PHPMailer.php(1352): PHPMailer\PHPMailer\PHPMailer-&gt;postSend() #2 /home/users/7/79094113888/domains/test.lageneral.ru/mailer/ContactMailer.php(71): PHPMailer\PHPMailer\PHPMailer-&gt;send() #3 /home/users/7/79094113888/domains/test.lageneral.ru/handler.php(31): ContactMailer::send('\xD0\xA2\xD0\xB5\xD1\x81\xD1\x82 \xD0\xA2\xD0\xB5\xD1\x81...', 'lageneral30@gma...', '+7 (909) 411-38...', '\xD0\xA2\xD0\xB5\xD1\x81\xD1\x82\xD0\xB8\xD1\x80\xD1\x83\xD0...') #4 {main} thrown in <b>/home/users/7/79094113888/domains/test.lageneral.ru/mailer/PHPMailer/src/PHPMailer.php</b> on line <b>1789</b><br /> 
            • Евгений 11.11.2018 21:55

              Ошибка или в email-адресе отпраителя или в версии PHP.

          • Вячеслав 11.11.2018 23:43

            Евгений, все получилось. Надо было просто зайти в почтовый ящик и автоматические вопросы майл.ру - видимо стоит у них защита на авторегистраторов почтовых ящиков или еще что-то...

            • Евгений 11.11.2018 23:49

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

  • Сергей 11.11.2018 22:03

    Евгений здравствуйте. Не получается запустить работу двух форм на одной странице, работает одна из них. Как вы и указали выше поменял id на class в html, но результата нет. Помогите пожалуйста разобраться, чтобы работало на странице несколько форм.

    Ответить
    • Евгений 11.11.2018 22:18

      Здравствуйте. Во-первых, нужно заменить id на class у всех элементов формы. Во-вторых, заменить id у самой формы, добавте тоже какой-нибудь класс, например, contact-form. В-третьих, в файле main.js при отправке формы заменить все эти измененные селекторы.

      Это:

      $('#contactForm').on('submit', function(event) {

      на это:

      $('.contact-form').on('submit', function(event) {

      и это:

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

      на это:

      var form = $('.contact-form'),
          button = $('.button'),
          answer = $('.answer'),
          loader = $('.loader');

      вроде как все.

      Ответить
      • Сергей 11.11.2018 22:29

        Поменял на contact-form. Т.к. на странице 2 формы, первая форма не отправляет письмо, зато вторая отправляет сразу два письма.

        Ответить
        • Евгений 11.11.2018 22:36

          А ну да извиняюсь, вот так должно быть:

          var form = $(this),
              button = form.find('.button'),
              answer = form.find('.answer'),
              loader = form.find('.loader');
          Ответить
          • Сергей 11.11.2018 23:03

            Заработало! Спасибо огромное!

            • Евгений 11.11.2018 23:04

              Пожалуйста.

  • Павел 14.11.2018 14:07

    Здравствуйте! Форма работает, письма приходят, но есть нюанс. Заголовок письма имеет вид "Имя отправителя". Пытался поменять на "$name", но так и приходит в заголовке "$name". Как то можно туда подтянуть имя из строки, которую клиент заполняет(его реальное имя)?

    Ответить
    • Евгений 14.11.2018 21:43

      Здравствуйте! Все должно приходить:

      // Устанавливает E-mail и имя отправителя
      $mailer->setFrom(self::$emailFrom, $name);
      Ответить
      • Павел 20.11.2018 07:31

        Простите, протупил. $name указал в кавычках, кавычки убрал - все работает, спасибо! Правда когда встроил в сайт 3 формы(и они работают) сломался дизайн всплывающего окна. Третий день воюю со стилями, но там чорт ногу сломит...

        Ответить
  • Николай 14.11.2018 21:21

    Здравствуйте Евгений.

    В файле Validator.php в комментарии для проверки валидности телефона вы автоматически повторили текст:

    /*** Проверяет валидный ли E-mail......*/

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

      Здравствуйте! Спасибо, исправил.

      Ответить
  • Andrey 15.11.2018 15:50

    Здравствуйте. У меня в некоторых формах нет email поля, как изменить код так, чтобы он не требовал наличие полей? Иначе выдает ошибку "Все поля обязательны для заполнения."

    Ответить
    • Евгений 15.11.2018 20:10

      Здравствуйте!

      Если нужно сделать email не обязательным, то в index.html:

      <!--Уберите атрибут `required` -->
      <input id="name" class="field" name="name" required type="text" placeholder="Иванов Иван Иванович">
      <!--Получиться так -->
      <input id="name" class="field" name="name" type="text" placeholder="Иванов Иван Иванович">

      В файле handler.php:

      // замените это 
      if (empty($name) || empty($email) || empty($phone) || empty($message)) { 
      // на это 
      if (empty($name) || empty($phone) || empty($message)) { 
      
      // и удалите это 
      if (!Validator::isValidEmail($email)) {
      	echo 'E-mail не соответствует формату.';
      	exit;
      }

      Если же нужно удалить email вообще. Тогда так.

      Убрираем поле email из формы в index.html:

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

      Удаляем этот метод в файле Validator.php:

      public static function isValidEmail($email)
      {
      	return filter_var($email, FILTER_VALIDATE_EMAIL);
      }

      В файле ContactMailer.php:

      // замените это
      public static function send($name, $email, $phone, $message)
      // на это
      public static function send($name, $phone, $message)
      
      // и это
      $body = "Имя: " . $name . "\nE-mail: " . $email . "\nТелефон: " . $phone . "\n\nСообщение:\n" . $message;
      // на это
      $body = "Имя: " . $name . "\nТелефон: " . $phone . "\n\nСообщение:\n" . $message;

      И в файле handler.php:

      // удалите это
      $email = isset($_POST['email']) ? trim(strip_tags($_POST['email'])) : null;
      
      // замените это
      if (empty($name) || empty($email) || empty($phone) || empty($message)) {
      // на это
      if (empty($name) || empty($phone) || empty($message)) {
      
      // удалите это
      if (!Validator::isValidEmail($email)) {
      	echo 'E-mail не соответствует формату.';
      	exit;
      }
      
      // и замените эту строку
      if (ContactMailer::send($name, $email, $phone, $message)) {
      // на эту
      if (ContactMailer::send($name, $phone, $messag)) {
      Ответить
    • Andrey 15.11.2018 21:49

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

      Ответить
      • Евгений 15.11.2018 22:58

        Можно конечно, самое простое будет так, сделаейте так как я вам написал выше (в самом начале первый способ), но не удаляйте вот эту проверку:

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

        а просто даполните условие:

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

        теперь если email придет, то будет проверяться.

        Ответить
      • Andrey 15.11.2018 23:46

        Работает, спасибо огромное!

        Ответить
        • Евгений 16.11.2018 08:38

          Пожалуйста!)

          Ответить
          • Andrey 16.11.2018 11:57

            Евгений, подскажите еще пожалуйста.

            Есть две формы, после отправки которых нужно скачивать pdf файлы. Все работает, но почему-то скачанный файл называется не так как лежит на сервере.

            Я сделал так. В форме добавил скрытое поле 

            <input type="hidden" name="download" value="favicon.ico">

            Чтобы не показывать весь путь до файла, я в value добавляю просто его название (favicon.ico для примера, т.к нет еще нужных файлов)

            А в handler.php уже прописываю относительный путь

            $download = isset($_POST['download']) ? trim(strip_tags($_POST['download'])) : null;
            
            if (!empty($download)) {
                $fileLink = 'favicon/' . $download;
            } else {
                $fileLink = false;
            }
            
            // тут я изменил ответ сервера
            if (ContactMailer::send($name, $phone, $email, $budget, $formSubject)) {
                $reply = [
                    'send'=> true,
                    'message' => htmlspecialchars($name) . ', ваше сообщение успешно отправлено.',
                    'file' => $fileLink
                ];
                echo json_encode($reply);
            } else {
            	echo 'Произошла ошибка! Не удалось отправить сообщение.';
            }

            И далее в аяксе уже беру ключ 'file', создаю ссылку и клик по ней.

            // ...
            
            success: function(result) {
               result = JSON.parse(result);
               var linkDownload = document.createElement('a');
            
               linkDownload.setAttribute('href', result.file);
               linkDownload.setAttribute('download','download');
               linkDownload.click();
            
               loader.fadeOut();
               form.find('input').not('[name="clientPhoneCode"], [type="hidden"]').val('');
               button.attr('disabled', false);
            },
            
            // ...

            В итоге скачивается не favicon.ico а download.ico. 

            Как правильно делать?

            • Евгений 16.11.2018 18:59

              Поменяйте:

              linkDownload.setAttribute('download','download');

              на:

              linkDownload.setAttribute('download','favicon');
  • Александр 15.11.2018 18:20

    Здравствуйте Евгений.

    Скажите пожалуйста, а отправка на несколько адресов возможна, если да то как правильно прописать несколько получателей?

    Ответить
    • Евгений 15.11.2018 20:24

      Здравствуйте. Можно, либо просто добавляйть:

      $mail->addAddress('address1@example.com');
      $mail->addAddress('address2@example.com');

      единственное, что другие будут видеть все адреса получателей, но если нужно отправить скрытую копию, то вот так:

      $mail->addBCC('address1@example.com');
      $mail->addBCC('address2@example.com');

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

      Ответить
  • Виталий 02.12.2018 17:01

    Здравствуйте, спасибо большое за Вашу форму, очень полезная
    Но возникла одна загвоздка, а именно: пытался добавить чтоб вместе с сообщением отправлялся ip адрес пользователя (в целях безопасности), но, к сожалению, ничего не получилось.
    Как реализовать данную фишку?

    Ответить
    • Евгений 06.12.2018 18:57

      Здравствуйте. Просто в момент отправки письма добавьте IP:

      // Формируем тело письма 
      $body = "Имя: " . $name . "\nIP: " . $_SERVER['REMOTE_ADDR'] . "\nE-mail: " . $email . "\nТелефон: " . $phone . "\n\nСообщение:\n" . $message;
      Ответить
  • Алёна 13.12.2018 19:01

    Здравствуйте!
    Пыталась внедрить вашу форму в свой сайт, ничегон не выходит.
    При отправке пишет: Произошла ошибка! Попробуйте позже.
    Все данные почтовых адресов верные...

    Ответить
    • Евгений 14.12.2018 00:18

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

      Ответить
  • Андрей 26.12.2018 16:23

    Добрый день! Спасибо! Всё работает, но есть одно НО! Хотел бы обратить внимание на то, что письма не будут отправляться, если на почтовом ящике отправителя включена "Двухфакторная аутентификация". Автору большое спасибо. Возможно мой комментарий приготиться )))

    Ответить
  • Даниил 15.01.2019 00:16

    Добрый вечер, возникла ошибка, после нажатия кнопки "Отправить" выдаёт содержимое handler.php. Как можно исправить данную ошибку?

    Ответить
    • Евгений 15.01.2019 10:34

      Здравствуйте. Это говорит о том, что файл не обрабатывается интерпретатором PHP, а отдается как обычный текстовый файл. Скорее всего у вас PHP вообще не установлен.

      Ответить
  • Даниил 15.01.2019 17:39

    Извините, не могли бы вы помочь с установкой php?

    Ответить
    • Евгений 15.01.2019 18:24

      1. Куда вы хотите ставить на компьютер или на сервер?
      2. Какая у вас операционная система установлена?

      Ответить
      • Даниил 17.01.2019 20:27

        На компьютер, Win 8.1

        Ответить
        • Евгений 17.01.2019 23:05

          Если у вас Windows, то просто поставьте себе Open Server и не парьтесь, в нем есть все что нужно, да и без опыта для вас будет трудновато самому все ставить. У меня есть статья по установке Open Server, по идее должна быть актуальна, если устарела поищите в поиске, думаю материала предостаточно.

          Ответить
  • Игорь 22.01.2019 23:37

    Уважаемый Евгений! Спасибо Вам за статью. А что, кроме перечисленного в описании ( майл, майл и пароль, адрес SMTP сервера), конкретно, надо менять в ContactMailer.php? В примере, как я понял, в качестве адреса SMTP указан yandex. И ещё, где на сайте должна появиться сама эта форма? Может она быть на какой-то определённой странице?

    Ответить
  • Игорь 22.01.2019 23:48

    Простите, частично нашел ответ выше. Не совсем понятно, только, на какую именно строчку писать майл. Вместо e-mail отправителя, или вместо @var string, или ещё куда. Спасибо!

    Ответить
    • Евгений 23.01.2019 00:19

      Смотрите есть строчка:

      private static $emailFrom = 'send@yandex.ru';

      вам нужно вписать свой e-mail вместо send@yandex.ru, то есть прям так в ковычках должен быть вписан 'ваш@email'.

      По поводу второго вопроса, форма будет там куда вы ее вставите!)

      Ответить
  • Игорь 23.01.2019 08:56

    Уважаемый Евгений! Спасибо за ответы. Но это мой первый сайт, и я понял, пока, только, как вставить все папки в корень сайта. И сделать изменения. Спасибо! Но, как я могу повлиять на появление самой формы заполнения на сайте, да ещё на конкретной странице, и, желательно, без поля с телефоном (как его убрать в кодах - понятно), мне самому разобраться не удалось. Простите за беспокойство.

    Ответить
    • Евгений 23.01.2019 09:15

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

      Ответить
  • Игорь 23.01.2019 09:32

    "Как это все работает" непонятно, думаю большинству создателей сайтов. Как автомеханикам, которые просто знают куда, что прикрутить, но совершенно беспомощны в изобретательстве. Так и сайтостроителям, большинству, просто кто-то показал. Зачем писать такие длинные статьи, чтобы вдруг заговниться, и не ответить на простой вопрос - для меня загадка. Или долго объяснять, как выделить правой кнопкой мыши, а потом проскочить целый этап действий. Мол мне-то понятно. В результате, вместо благодарности - раздражение.

    Ответить
    • Евгений 23.01.2019 10:10

      Да причем здесь раздражение? Ну есть просто элементарные вещи, если автомеханик не может отличить колесо от руля, какой он тогда автомеханик!? И здесь так же, любой "создатель сайтов", просто обязан знать, что такое html-код и как его вставлять, чтоб появилась форма. Это просто "букварь". Каждый человек, должен быть специалистом, в своей сфере, Если проводить аналогию с автомехаником, то мастер который ремонтирует двигатель, он его не изобретает, но прекрасно понимает, что и как в двигателе работает.

      Для того, чтобы форма появилась на странице, нужно вставить html-код формы, который указан в самом начале статьи, если вы ее читали конечно, вод код самой формы:

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

      А написал я так, не потому что как вы выразились "заговнился", а потому что понимаю, что если у вас проблемы с этим возникли, то дальше будет все еще "грустнее"!

      Ответить
  • Игорь 23.01.2019 15:06

    Спасибо за ответ! Не обязательно будет "грустнее". Во многом удаётся разобраться. В этом, благодаря вам. Ещё раз спасибо.

    Ответить
    • Евгений 23.01.2019 15:32

      Пожалуйста) Удачи вам!

      Ответить
  • Игорь 23.01.2019 20:30

    Уважаемый Евгений. Побеспокою вас последний раз. Не получится - буду искать другие решения. Всё сделал аккуратно. Форма появилась. Заполняется, реагирует на пустое поле, но при отправке появляется ошибка 404. даже с ООPS! впереди. Потом: The page can not be found. It looks like nothing was found at this location. Maybe try one of the links below or a search? 

    Ответить
    • Евгений 23.01.2019 22:23

      Вероятнее всего генерит это сообщение ваша CMS или хостинг, говорит что страница не найдена. Не находит файлы мейлера вероятно, и плюс переходит на другую страницу из-за того, что JS не срабатывает.

      Ответить
  • Александр 24.01.2019 14:38

    Евгений, добрый день. Мне понравилась "Обратная форма", спасибо.

    Можете подсказать, как всавить еще три поля для отправки  на почту: Ваша страна, Ваш горрд, Ваш район?

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

    Ответить
    • Евгений 25.01.2019 00:02

      Здравствуйте. В index.html добавляете три поля, так же как имя телефон и email:

      <div class="field-block">
          <label for="country">Ваша страна:</label>
          <input id="country" class="field" name="country" required type="text" placeholder="Россия">
      </div>
      <div class="field-block">
          <label for="city">Ваш город:</label>
          <input id="city" class="field" name="city" required type="email" placeholder="Москва">
      </div>
      <div class="field-block">
          <label for="region">Ваш район:</label>
          <input id="region" class="field" name="region" required type="text" placeholder="Царицыно">
      </div>

      Ну и дальше в том же ключе, в файле handler.php::

      // Добавляем
      $country = isset($_POST['country']) ? trim(strip_tags($_POST['country'])) : null;
      $city = isset($_POST['city']) ? trim(strip_tags($_POST['city'])) : null;
      $region = isset($_POST['region']) ? trim(strip_tags($_POST['region'])) : null;
      
      // Заменяем
      
      // это
      if (empty($name) || empty($email) || empty($phone) || empty($message)) {
      // на это
      if (empty($name) || empty($email) || empty($phone) || empty($country) || empty($city) || empty($region) || empty($message)) {
      
      // и это
      if (ContactMailer::send($name, $email, $phone, $message)) {
      // на это
      if (ContactMailer::send($name, $email, $phone, $country, $city, $region, $message)) {

      Ну и еще в файле ContactMailer.php:

      // Заменяем
      
      // это
      public static function send($name, $email, $phone, $message)
      // на это
      public static function send($name, $email, $phone, $country, $city, $region, $message)
      
      // и это
      $body = "Имя: " . $name . "\nE-mail: " . $email . "\nТелефон: " . $phone . "\n\nСообщение:\n" . $message;
      // на это
      $body = "Имя: " . $name . "\nE-mail: " . $email . "\nТелефон: " . $phone . "\nСтрана: " . $country . "\nГород: " . $city . "\nРегион: " . $region . "\n\nСообщение:\n" . $message;

      Вроде как все.

      Ответить
      • Александр 25.01.2019 00:29

        Спасибо за подсказку

        Евгений, я понимаю в "index.html" файле Вы ошиблись написав вместо типа text написали e-mail

        Ответить
        • Евгений 25.01.2019 09:34

          Пожалуйста!) Ну да, я просто скопировал, там везде должен быть type="text".

          Ответить
  • Денис 27.01.2019 23:16

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

    Ответить
    • Евгений 28.01.2019 01:05

      Здравствуйте! Да самым простым будет сделать разные обработчики для каждой формы. По поводу html и javascript кодов, этот вопрос уже поднимался несколько раз, посмотрите в комментариях выше. Например здесь.

      Ответить
  • Денис 27.01.2019 23:41

    И еще небольшой вопрос как сделать сессию, чтобы после отправки введенные данные оставались в форме. Заранее спасибо.

    Ответить
    • Евгений 28.01.2019 01:13

      Отправляется асинхронно без перезагрузки страницы, чтобы данный не удалялись, нужно просто убрать их удаление из файла main.js.
      Вот эту строку:

      form.find('.field').val('');
      Ответить
  • Денис 28.01.2019 01:22

    Благодарю все работает! Очень приятно что вы отвечаете . Полезный ресурс!

    Ответить
  • Кирилл 30.01.2019 12:55

    Добрый день, Евгений. Спасибо за столь полезный функционал, полдня убил на поиск чего-то достойного и вот, вуаля))

    Всё отлично работает. Единственный момент, не подскажете как прикрепить кнопку с вызовом формы не сверху, а справа в одном статичном месте страницы?

    Ответить
    • Евгений 30.01.2019 13:47

      Добрый! Не совсем понял, про какую кнопку речь, если про кнопку которая вызывает модальное окно с формой, так про это я в другой статье писал.)) Если все же о ней речь, то это делается стилями, позиционируете этот элемент на странице и все.

      Что-то типа такого:

      button {
          position: fixed;
          bottom: 1px;
      }

      Погуглите про CSS свойства: position, top, bottom, left, right и сделаете так как вам нужно. Статей должно быть масса в интернете.

      Ответить
      • Кирилл 30.01.2019 14:02

        Да, я и делал по той статье. Имел в виду именно эту кнопку, спасибо, займусь.

        Ответить
  • Александр 31.01.2019 19:07

    Добрый день! Подскажите пожалуйста как мне сделать все как и есть в стандартном функционале, но плюс к нему в письме чтоб еще приходил адресс страницы с которой были отправлены данные?

    Ответить
    • Евгений 31.01.2019 20:41

      Здравствуйте! В файле ContactMailer.php найдите строку:

      $body = "Имя: " . $name . "\nE-mail: " . $email . "\nТелефон: " . $phone . "\n\nСообщение:\n" . $message;

      и замените ее на эту строку:

      $body = "Имя: " . $name . "\nE-mail: " . $email . "\nТелефон: " . $phone . "\nАдрес страницы: " . $_SERVER['REQUEST_URI'] . "\n\nСообщение:\n" . $message;
      Ответить
  • Алексей 01.02.2019 10:04

    Добрый день!
    Мучаюсь второй день. Подскажите пожалуйста, как после отправки формы сделать редирект на внешнюю страницу. Например на google.com.

    Пробовал так:

    header('Location: http://www.google.com/');
    exit;

    Но то ли не туда вставляю, то ли вообще не так делается.

    Ответить
    • Евгений 01.02.2019 10:29

      Добрый! Форма работает асинхронно с использование Ajax-запросов, header здесь не подойдет, до и использовать его нужно только до вывода чего-либо в браузер. Тут все проще, делать редирект нужно в JavaScript, в файле main.js добавьте строку location = 'https://google.com'; вот так получиться:

      success: function(result) {
          loader.fadeOut(300, function() {
              answer.text(result);
          });
          form.find('.field').val('');
          button.attr('disabled', false);
          location = 'https://google.com';
      },
      Ответить
      • Алексей 01.02.2019 10:56

        Добавил, по по-прежнему просто отправляет данные формы. Никакого редиректа не происходит(

        Ответить
      • Алексей 01.02.2019 11:01

        А нет, не работает только в гугл хроме почему-то. В интернет эксплорере работает, с мобильника тоже работает.

        Ответить
      • Алексей 01.02.2019 11:06

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

        Ответить
  • Марат 02.02.2019 23:22

    Здравствуйте! Сайт пока на локальном сервере. Письма будут уходить?

    Ответить
    • Евгений 03.02.2019 03:36

      Здравствуйте! Да, будут.

      Ответить
  • Алексей 03.02.2019 22:21

    Евгений, доброго времени суток. У меня выдает такую ошибку Cannot POST /handler.php, а когда заливаю сайт на хостинг, то ошибка 404. Файл handler находится в корневой папке сайта

    Ответить
    • Евгений 03.02.2019 22:35

      Здравствуйте! Незнаю, файл handler.php должен быть на одном уровне с index.html. На хостинге, просто не показывается информация об ошибке, но смысл тот же, файла нет! Смотрите в консоле браузера, смотрите логи.

      Ответить
      • Алексей 03.02.2019 22:45

        Спасибо, разобрался) Теперь появляется ошибка Произошла ошибка! Не удалось отправить сообщение.

        Ответить
        • Евгений 03.02.2019 22:51

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

          Ответить
          • Алексей 03.02.2019 22:55

            Дело в том, что ошибка там такая вылезает 

            <br /> <b>Fatal error</b>: Uncaught PHPMailer\PHPMailer\Exception: SMTP Error: Could not authenticate. in /var/www/u0514166/data/www/grem-nn.ru/mailer/PHPMailer/src/PHPMailer.php:1911 Stack trace: #0 /var/www/u0514166/data/www/grem-nn.ru/mailer/PHPMailer/src/PHPMailer.php(1725): PHPMailer\PHPMailer\PHPMailer-&gt;smtpConnect(Array) #1 /var/www/u0514166/data/www/grem-nn.ru/mailer/PHPMailer/src/PHPMailer.php(1481): PHPMailer\PHPMailer\PHPMailer-&gt;smtpSend('Date: Sun, 3 Fe...', '\xD0\x98\xD0\xBC\xD1\x8F: \xD0\x90\xD0\xBB\xD0\xB5\xD0...') #2 /var/www/u0514166/data/www/grem-nn.ru/mailer/PHPMailer/src/PHPMailer.php(1320): PHPMailer\PHPMailer\PHPMailer-&gt;postSend() #3 /var/www/u0514166/data/www/grem-nn.ru/mailer/ContactMailer.php(70): PHPMailer\PHPMailer\PHPMailer-&gt;send() #4 /var/www/u0514166/data/www/grem-nn.ru/handler.php(31): ContactMailer::send('\xD0\x90\xD0\xBB\xD0\xB5\xD0\xBA\xD1\x81\xD0\xB5\xD0\xB9', 'stepan20049@gma...', '+7 (112) 312-31...', '123') #5 {main} thrown in <b>/var/www/u0514166/data/www/grem-nn.ru/mailer/PHPMailer/src/PHPMailer.php</b> on line <b>1911</b><br />
            • Евгений 03.02.2019 23:02

              Эта ошибка может быть по двум причинам: ошиблись с логином или паролем (не может авторизоваться в почтовике) или хостинг не поддерживает сторонний SMTP.

  • Сергей 08.02.2019 11:41

    Спасибо огромное за труды! 

    Вставляю сей код в лэндинк собсвенной придумки, и при нажатии на кнопку "отправить" выдаёт "Доступ запрещен!"...Насколько я понял проблема я понял проблема с Ajax запросом.

    А что с этим делать не могу понять, хоть убей...:(

    Ответить
    • Евгений 08.02.2019 11:49

      Вы не подключили скрипты:

      <script src="js/jquery.maskedinput.min.js"></script>
      <script src="js/main.js"></script>

      Посмотрите внимательно демонстрационный файл index.html.

      Ответить
      • Сергей 08.02.2019 13:56

        Да вроде перед закрывающим тегом 'body" всё имеется..:(

        А откуда сами эти файлы нужно брать, их наполнение? Я вставил из ваших исходников...

        Ответить
        • Евгений 08.02.2019 16:20

          В исходниках обработчик формы вешается на #contactForm, вот строка из main.js:

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

          А вы зачем-то исправили на #contact, при этом в html-коде у формы оставили id="contactForm". Вот поэтому Ajax и не отрабатывает.

          Ответить
  • Даниил 11.02.2019 17:34

    Огромно спасибо! Очень помогло при создании сайта для диплома))

    Ответить
    • Евгений 11.02.2019 17:36

      Пожалуйста!)

      Ответить
  • Илья 20.02.2019 04:45

    Евгений, добрый день! Огромное спасибо за отличную форму! Но после заполнения всех полей выходит ошибка:

    <br /> <b>Parse error</b>: syntax error, unexpected '[' in <b>/home/shkola-int/shk***********.ru/docs/mailer/PHPMailer/src/PHPMailer.php</b> on line <b>288</b><br />

    Что это обозначает и как с этим бороться? Подскажите, спасибо еще раз!

    Ответить
    • Евгений 20.02.2019 10:12

      Добрый! Какая версия PHP используется?

      Ответить
      • Илья 21.02.2019 01:55

        Скажите, а как узнать, какая версия PHP используется? У нас сайт образовательной организации и используется хостинг компании RU-CENTER (nic.ru). Получается, что версия PHP должна быть актуальной на самом хостинге провайдера или именно на моем рабочем месте? Извините за глупые вопросы, просто немного не понимаю в этом.

        Ответить
        • Евгений 21.02.2019 21:38

          Понятно.) Для вас, наверное, проще будет так, создайте файл, например info.php, хоть на локадьном сервере, хоть на реальном хостинге, это не важно. Поместите в файл вот эти строки:

          <?php 
          header("Content-Type: text/html; charset=utf-8");
          phpinfo();

          И обратитесь к этому файлу в браузере. Ну то есть если файл поместили в корень сайта, то перейдите по адресу site.ru/info.php.

          Ответить
          • Илья 22.02.2019 03:18

            Спасибо, сделал, как вы сказали. При обращении к файлу info.php просто открывается код содержимого файла. Я так понимаю, что должна показываться версия PHP? Значит, что-то не работает:)

            • Евгений 22.02.2019 09:53

              А вы по htttp протоколу открывали, то есть в адресной строке браузера http://ваш_сайт/info.php, вот так?

        • Илья 25.02.2019 01:49

          Евгений, добрый день! Да, неправильно обращался к PHP-файлу. Страница открылась, версия PHP - 5.3.29. Обратился в техподдержку провайдера, будем разбираться. Спасибо огромное еще раз!

          Ответить
  • Илья 25.02.2019 09:34

    Евгений, с провайдером разобрался, версию PHP повысил. Все работает, письма отправляются и приходят. Осталась одна проблемка: после нажатия кнопкт "Отправить" ниже кнопки выходит сообщение в виде кракозябр (а должно выводится сообщение об успешной отправке, как я понимаю). Где поправить кодировку, чтобы кракозябры превратились в великий могучий?:)

    Ответить
    • Евгений 25.02.2019 11:13

      Самый простой выход, наверное будет такой. Переименуйте index.html в index.php и в самом верху файла (выше имеющегося кода на 1 строке без отступов) поместите следующую строчку:

      <?php header ("Content-Type: text/html; charset=utf-8"); ?>
      Ответить
      • Илья 27.02.2019 01:55

        Еще раз спасибо! Все отлично! Удачи и хорошего дня!

        Ответить
  • Илья 14.03.2019 06:38

    Здравствуйте.
    А подскажите пожалуйста, как в этой форме добавить обработку данных и вывод ошибок на английском языке?
    Я перевел саму форму на английский, а проверка данных выходит по-русски.
    Спасибо.

    Ответить
    • Евгений 14.03.2019 09:46

      Здравствуйте. Смотрите файлы, которые в статье рассматриваются и меняйте в них текст.

      Ответить
  • Нурс 14.03.2019 19:57

    Добрый вечер. Очень полезная статья, благодарю вас за неё. Я пытался вставить ваш код в свой лендинг, посмотрел ваши комментарии, и выбрал при заполнении только имя и номер телефона. Вы отвечали как и зачем надо делать для этого. Всё это проделал, загрузил на платный хостинг (до этого стояла другая форма обратной связи и она работала) и решил протестировать.
    В итоге выдаёт ошибку: Произошла ошибка! Не удалось отправить сообщение

    Код 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 = 'sosarlye@gmail.com';
        /**
         * E-mail получателя
         * @var string
         */
        private static $emailTo = 'sosarlye@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.gmail.com';
            // Включает SMTP-авторизацию
            $mailer->SMTPAuth = true;
            // Логин или E-mail целиком
            $mailer->Username = 'sosarlye@gmail.com';
            // Пароль от почтового ящика
            $mailer->Password = 'не буду палить пароль';
            // Протокол соединения
            $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;
        }
    }
    Ответить
    • Евгений 14.03.2019 21:46

      Добрый. У вас одинаковый E-mail отправителя и получателя. Укажите другой ящик, куда будет приходить письмо, вот здесь:

      /**
       * E-mail получателя
       * @var string
       */
      private static $emailTo = 'Другой E-mail';
      Ответить
  • Игорь 21.03.2019 11:55

    Спасибо ОГРОМНОЕ автору данной статьи. Очень помог. Пусть всё, что Вы делаете (Уважаемый Евгений) получается у Вас также прекрасно, как подобные мануалы. Еще раз СПАСИБО!

    Ответить
    • Евгений 21.03.2019 22:42

      Пожалуйста. Спасибо вам, за добрые слова.

      Ответить
  • Ринат 27.03.2019 05:34

    Здравствуйте!

    Вставил форму на лендинг при отправки долго крутит loader. затем выдает ошибку

    <b>Warning</b>: stream_select(): You MUST recompile PHP with a larger value of FD_SETSIZE. It is set to 1024, but you have descriptors numbered at least as high as 3160. --enable-fd-setsize=4096 is recommended, but you may want to set it to equal the maximum number of open files supported by your system, in order to avoid seeing this error again at a later date. in <b>/home/host1275049/printa0.ru/htdocs/www/mailer/PHPMailer/src/SMTP.php</b> on line <b>1124</b><br /> Произошла ошибка! Не удалось отправить сообщение.
    Ответить
    • Евгений 27.03.2019 12:37

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

      Ответить
  • Кирилл 29.03.2019 21:02

    Можно ли сделать отправку не через smtp, а как то иначе?

    Ответить
    • Евгений 30.03.2019 12:03

      Можно конечно, отправляйте хоть через mail(), но эта статья про отправку через SMTP, поищите в поиске другие варианты.

      Ответить
  • Jienshakh 01.04.2019 06:52

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

    Ответить
    • Евгений 02.04.2019 00:35

      Здравствуйте! У вас синтаксическая ошибка в файле main.js, поэтому не отрабатывает JavaScript код.

      Ответить
  • Сергей 01.04.2019 07:00

    Подскажите как сделать этот участок кода для работы без id для нескольких форм, читал выше сообщения со всем разобрался кроме этого:

    $('#check').on('click', function() {
    	//if ($(".check").prop("checked")) {
        if ($("#check").prop("checked")) {
            $('#button').attr('disabled', false);
        } else {
            $('#button').attr('disabled', true);
        }
    });

    Спасибо заранее

    Ответить
    • Евгений 02.04.2019 00:30

      В index.html вместо ID прописваете классы:

      <div class="field-block">
          <input class="check" name="check" checked type="checkbox">
          <span class="check-text">Я добровольно отправляю свои данные</span>
      </div>
      <button class="button" type="submit">Отправить</button>

      А js для нескольких форм лучше сделать вот так:

      $('.check').on('click', function() {
          if ($(this).prop("checked")) {
              $(this).parent('.field-block').next('.button').attr('disabled', false);
          } else {
              $(this).parent('.field-block').next('.button').attr('disabled', true);
          }
      });

      По идее все.

      Ответить
  • Иван 04.04.2019 13:03

    Добрый день. Спасибо за великолепную работу. Все настроил, как написано, но все же вылетает "доступ запрещен.

    Подскажите, пожалуйста, где мог натупить))) Спасибо и Вселенских лучей добра Вам.

    Ответить
    • Евгений 05.04.2019 09:57

      Добрый. У вас проблема в JS, вы два раза подключаете файл main.js, уберите первое подключение, оставьте только одно в самом конце.

      Ответить
  • Даниил 04.04.2019 20:52

    Здравствуте, код полность сделан как у вас, все папки созданы, я в коде ввел свой email, парол, хост (gmail, yandex, mail) НО...

    У меня высвечиваеться надпись Доступ Запрещен! И что бы я не делал ничего не работает. Заранее Спасибо!

    Ответить
    • Евгений 05.04.2019 10:02

      Здравствуйте. Надпись «Доступ Запрещен!» выскакивает если происходит переход по ссылке на прямую, у вас не отрабатывает JavaScript код.

      Ответить
      • Иван 05.04.2019 10:09

        Спасибо за ответ. Буду искать причину, по которой не отрабатывает JavaScript код.

        Ответить
        • Евгений 05.04.2019 10:19

          Пожалуйста!) Смотрите в консоли браузера, там должны быть ошибки.

          Ответить
  • Сергей 08.04.2019 17:02

    Здравствуйте! Понравилась ваша форма. Сделал как у вас и на локальном сервере все замечательно работает, все письма отправляются. Но перенеся сайт на хостинг выводится сообщение "Произошла ошибка! Не удалось отправить сообщение." По вашему совету делал:

    $mailer = new PHPMailer(true);

    ошибки ни какой нет на экране выводится "Произошла ошибка! Попробуйте позже."

    Писал в службу поддержки прислали ответ:

    В логах видим следующее сообщение:

    auth_cram_md5 authenticator failed for : 535 Incorrect authentication data (set_id=info@domen.ru)

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

    Я копирую почту из скрипта, копирую пароль и спокойно захожу в почту.

    Помогите пожалуйста с решением возникшей проблемы. Заранее благодарен.

    Ответить
    • Евгений 08.04.2019 17:44

      Здравствуйте! Проверьте в настройках почтового ящика (у почтовика где создан ящик) разрешены ли доступы к POP и  IMAP, если же все включено и вы уверены, что логин и пароль вводите правильно, то возможно ошибка на хостинга.

      Ответить
  • Александр 09.04.2019 07:51

    Здравствуйте! Спасибо за фомру. Работало всё нормально до вчерашнего дня. Появилась ошибка:

    <strong>Warning</strong>: stream_select(): You MUST recompile PHP with a larger value of FD_SETSIZE. It is set to 1024, but you have descriptors numbered at least as high as 1141. --enable-fd-setsize=2048 is recommended, but you may want to set it to equal the maximum number of open files supported by your system, in order to avoid seeing this error again at a later date. in <strong>/home/host1736128/prom-avtonomgaz.ru/htdocs/www/mailer/PHPMailer/src/SMTP.php</strong> on line <strong>1124</strong>

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

    Ответить
    • Евгений 09.04.2019 10:16

      Здравствуйте! В принципе в ошибке все написано, скорее всего изменили настройки на вашем хостинге, нужно обращатся в тех. поддержку хостинга.

      Ответить
      • Александр 09.04.2019 12:04

        А при добавлении

        $mailer = new PHPMailer(true);

        Выдаёт

        <p><strong>Fatal error</strong>: Uncaught PHPMailer\PHPMailer\Exception: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting in ..................... thrown in <strong>/mailer/PHPMailer/src/PHPMailer.php</strong> on line <strong>1726</strong></p>
        Ответить
        • Евгений 09.04.2019 12:14

          Все правильно, пишет, что не может установить соединение по SMTP.

          Ответить
          • Александр 09.04.2019 12:34

            Это связано с настройками почты или настройками хостинга?

            • Евгений 09.04.2019 12:38

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

  • Андрей 10.04.2019 21:40

    Спасибо, за статью все работает отлично. Вот только с оформление пришлось повозится, чтоб заменить в Bitrix обратную форму

    Ответить
  • Константи 17.04.2019 15:32

    Добрый день, уж очень понравилась Ваша форма! Хочу ее установить но она не работает. Ошибка в консоле 500 (internal server error) и доступ запрещён.

    Ответить
    • Евгений 17.04.2019 16:28

      Добрый. 500 (internal server error) это не о чем, тут может быть все что угодно. Посмотрите, что в самом ответе в консоли.

      Ответить
  • Олег 23.04.2019 07:17

    Евгений, здравствуйте!

    Спасибо, Вам, за проделанную работу и статьи. Грамотно и толково.

    Установил разаботанную Вами форму, в сокращенном варианте, все работает.

    Подскажите, пожалуйста, после сообщения об отправке письма, она автоматически должна закрываться, т.е. переходить в первоначальное положение?

    Ответить
    • Евгений 23.04.2019 09:13

      Здравствуйте. Честно говоря не совсем понял вопрос.

      Ответить
    • Олег 23.04.2019 09:56

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

      Ответить
      • Евгений 23.04.2019 10:11

        Так и задумано, если вам нужно какие-то дополнительные действия с формой делать, просто допишите в файл main.js, свой код и все.

        success: function(result) {
            loader.fadeOut(300, function() {
                answer.text(result);
            });
            form.find('.field').val('');
            button.attr('disabled', false);
        
            // Вот здесь
        },
        Ответить
      • Олег 23.04.2019 10:15

        Спасибо, понял.

        Ответить
  • Олег 23.04.2019 08:51

    Евгений, приветствую!

    Как и писал ранее установил сокращенную форму обратной связи.

    Но происходит следущее:

    на первой странице лейдинга все хорошо, отправляется и т.д.

    на остальных я вижу, что не подгружается проверка формы ввода телефона, после отправки, идет обращение к handler.php и выдает ошибку - Доступ запрещен!

    Подскажите, пожалуйста, где я ошибся.

    Ответить
    • Евгений 23.04.2019 09:13

      Скорее всего не подлючился скрипт main.js.

      Ответить
  • Олег 23.04.2019 10:14

    Прописан перед </body> и соответственно находится в папке "JS".

    Страница одна, навигация по якорям.

    Ответить
    • Евгений 23.04.2019 10:19

      Все дело в том, что вы поместили на одной странице пять форм с одним ID, любой элемент с ID должен быть только один на странице. Это касается и полей формы тоже. Присваивайте разные ID и для каждой свой обработчик или переделывайте на классы и изменяйте обработчик (смотрите в комментариях, там этот вопрос не раз поднимался), но самым простым решением и наверное самым правильным в вашем случае, это оставить одну форму на странице, так все пять форм обсолютно одинаковые, просто фиксируйте ее стилями в одном месте и все. И еще у вас два раза подключается скрипт маски номера телефона js/jquery.maskedinput.min.js и js/jquery.maskedinput.js, оставте какой-нибудь один и поднимите его выше main.js.

      Ответить
      • Олег 23.04.2019 11:38

        Евгений, спасибо. Прочитал ваши оветы выше и начал понимать.)))

        Еще раз огромное спасибо за содержательные пояснения.

        Извините за тупизм.

        Ответить
        • Евгений 23.04.2019 11:39

          Пожалуйста! Удачи в этом не легком деле)

          Ответить
  • Олег 23.04.2019 14:08

    Ок, Евгений, пока все склалось.)))

    Ответить
  • Сакен 26.04.2019 23:17

    Спасибо, Евгений, разобрался в своих ошибках сам. Все заработало! Очень помог Ваш урок и комментарии!!! По созданию сайтов есть еще много вопросов, можно к Вам обращаться?

    Ответить
    • Евгений 26.04.2019 23:22

      Здравствуйте! Пожалуйста! Если честно, то совершенно нет времени, ни на то чтобы писать, ни на то чтобы отвечать!) Отвечаю по возможности на комментарии, когда руки доходят.

      Ответить
  • Сакен 26.04.2019 23:28

    Но все-равно спасибо! Я как-то скачал один лендинг, там много форм, но php файлов нет. Объясните, пожалуйста, как они работают, через скрипты?

    Ответить
    • Евгений 26.04.2019 23:37

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

      Ответить
  • Сакен 27.04.2019 18:49

    Евгений, еще один вопрос, можно ли эту форму сделать с базой данных, чтобы все данные оставались в базе по датам?

    Ответить
    • Евгений 29.04.2019 11:57

      Конечно можно, просто нужно сделать реализацию записи в БД.

      Ответить
  • Сергей 11.05.2019 15:55

    Отличная, рабочая форма! Спасибо, Евгений!

    Ответить
  • Андрей 15.05.2019 19:24

    Добрый вечер. Скажите пожалуйста а как изменить номер телефона с +7(***)***-**-** на +375(**)***-**-** ?

    Ответить
    • Евгений 15.05.2019 21:08

      Добрый. В main.js найдите строку:

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

      и замените ее на эту:

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

      ну и placeholder у инпута поменяйте, все.

      Ответить
      • Андрей 16.05.2019 00:15

        Большое спасибо, разобрался. Отличная форма.

        Ответить

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

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