Форма обратной связи php
В данной статье я постараюсь объяснить как создать с 0 форму обратной связи на php с защитой от спам рассылок. И так приступим к написанию кода скрипта.
1. Для начало создадим главный файл index.php и добавим в него простую форму на html:
<!DOCTYPE HTML> <html lang="ru"> <head> </head> <body>
Давайте разберём, что написано выше, чтобы потом не возникало вопросов.
action="request.php" - файл, на который мы будем пересылать данные из формы
method="POST" - метод передачи "POST" данных в форме
- input - тег, для ввода данных формы;
- type="email" - тип поля ввода, нужен для проверки вводимых данных по типу:
- email - email;
- text - любой текст;
- tel - номер телефона\факса;
- required - атрибут, для обязательного ввода формы, запрещает пустую отправку формы, если данное поле не заполнено;
- placeholder="message" - атрибут, который вводит текст внутри текстового поля и исчезает при получении фокуса.
2. Теперь создадим файл request.php в одной папке с index.php и добавим в него следующее:
<?php $name = $_POST['name']; // получаем имя из формы $email = $_POST['email']; // получаем email из формы $message = $_POST['message']; // получаем текст из формы // оформление текста, который приходит получателю $send = "Name: ".$name." Message: ".$message." Phone: ".$phone." email: ".$email; $to= "mymail@mail.com"; // кому отправляем форму $from = "no-replay@mail.com"; // от кого отправлена форма $subject = "message for your site"; // тема сообщения // заголовки, отвечающие за кодировку и тип письма, оставляем без изменений $headers = "From: $from\r\nReplay-To: $from\r\nContent-type: text/plain; charset=utf-8\r\n"; // функция php для отправки email mail(кому отправляем, тема, текст в сообщении, заголовки) mail($to, $subject, $send, $headers); // В элементе $_SERVER['HTTP_REFERER'] приводится адрес страницы, с которой посетитель пришёл на данную страницу $redir = $_SERVER['HTTP_REFERER']; // условия проверки с пересылкой на страницу с формой с добавление GET параметра, // который нужен, чтобы по нему, можно было выводить благодарственный текст if (strpos($redir, "mail=1") === false) $redir .= "?mail=1#contact"; // функция перенаправления, в данном случае на страницу с формой header("Location: $redir"); ?>
Через CSS сможете оформить форму, как захотите, об этом рассказывать не буду, приведу простой пример.
Форма готова, прежде чем идти дальше, проверьте её работоспособность, если все работает, переходим дальше.
Защита формы от спама
Самый простой и оптимальный способ защиты от спама в форме от спам-рассылок - это добавления в форму невидимых полей.
Идея такая: Спам-робот, пытается заполнить все поля(даже если их не видно), естественно пользователь не может их заполнить, так как они для него не существуют и мы этим воспользуемся, добавив простое правило - "если скрытое поле заполнено, то отправка письма отменяется, если не заполнено, то отправляется". И так приступим.
1. Добавим новое поле в нашу форму:
В нём мы убрали все лишние атрибуты, так как они нам не к чему и оставим только тип и имя поля, а так же добавим класс, чтобы через CSS мы его скрыли для пользователя.
2. Добавим правило для CSS в файле стилей:
input.hidden{ display: none; }
Или если нет файла стилей, то добавим в index.php между тегом head, следующею запись:
<head> ... </head>
3. Мы создали поле и скрыли его, теперь нужно добавить условия в файле request.php:
Получим текст из поля спам, для этого добавим строчку, в начале:
$spam = $_POST['spam']; // получим текст из поля спам
И добавим условия, для проверки на спам.
// условие проверки, если поле spam пустое, то форма обрабатывается, //иначе выходим (для роботов) if (empty($spam)){ $to= "mymail@mail.com"; $from = "no-replay@mail.com"; $subject = "message for your site"; $headers = "From: $from\r\nReplay-To: $from\r\nContent-type: text/plain; charset=utf-8\r\n"; mail($to, $subject, $send, $headers); } else exit ;
В результате получим такой request.php:
<?php $spam = $_POST['spam']; // получим текст из поля спам $name = $_POST['name']; // получаем имя из формы $email = $_POST['email']; // получаем email из формы $message = $_POST['message']; // получаем текст из формы // оформление текста, который приходит получателю $send = "Name: ".$name." Message: ".$message." Phone: ".$phone." email: ".$email; // условие проверки, если поле spam пустое, то форма обрабатывается, //иначе выходим (для роботов) if (empty($spam)){ $to= "mymail@mail.com"; // кому отправляем форму $from = "no-replay@mail.com"; // от кого отправлена форма $subject = "message for your site"; // тема сообщения // заголовки, отвечающие за кодировку и тип письма, оставляем без изменений $headers = "From: $from\r\nReplay-To: $from\r\nContent-type: text/plain; charset=utf-8\r\n"; // функция php для отправки email mail(кому отправляем, тема, текст в сообщении, заголовки) mail($to, $subject, $send, $headers); } else exit ; // В элементе $_SERVER['HTTP_REFERER'] приводится адрес страницы, с которой посетитель пришёл на данную страницу $redir = $_SERVER['HTTP_REFERER']; // условия проверки с пересылкой на страницу с формой с добавление GET параметра, // который нужен, чтобы по нему, можно было выводить благодарственный текст if (strpos($redir, "mail=1") === false) $redir .= "?mail=1#contact"; // функция перенаправления, в данном случае на страницу с формой header("Location: $redir"); ?>
Проверяем и если работает, то у вас через форму теперь не будет проходить спам.
Как бонус, покажу, как выводить благодарственный текст.
Добавление благодарственного текста
1. В файл index.php добавим следующею запись(можно в любом месте):
<?php if ($_GET['mail'] == 1) echo "Thank you for your message"; ?>
Здесь идёт проверка на Get параметр, который мы выдаём в файле request.php, если форма отправилась и если это произошло, до добавляется данный блок:
Спасибо за сообщение
2. Теперь в стилях сделаем его фиксированным, чтобы не где мешался и его было видно:
#mail-send{ position: fixed; right: 10px; top: 10px; z-index: 999; background-color: #0ACE7F; color: #fff; border: 0px; padding: 10px; }
3. Отлично, при отправке блок появляется, но остаётся висеть и хочется, чтобы через несколько секунд он пропал, для этого воспользуемся jquery.
Для начала подключим библиотеку между тегами head.
И ниже этой записи добавим следующий скрипт:
Тут довольно все просто, при загрузке страницы блок плавно исчезает с течении 5 секунд.
Если нужно, чтобы форма сохраняла введённые значения в полях формы после отправки, то немного поправим вызов полей:
<input type="text" required="" name="name" placeholder="NAME" value="<?php if(isset($_POST['name'])){echo $_POST['name'];} ?>"> <input type="email" required="" name="email" placeholder="Email adress" value="<?php if(isset($_POST['name'])){echo $_POST['email'];} ?>"> <input type="text" required="" name="message" placeholder="message" value="<?php if(isset($_POST['name'])){echo $_POST['message'];} ?>">
Читайте о создании обратной формы на Ajax и php и обратной связи на modx c защитой от спама.
Оставить комментарий