Простая форма обратной связи на PHP

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

  • простом контролировании правильности ответа;
  • возможности написать по заявке в любое время;
  • бесплатном формировании сообщений и прочих аспектах.

Описание функций

Для отправки писем на почту задействуется функция mail();,работающая только после установки программы-почтового сервера. При использовании хостинга для сайтов, а не VPS или выделенных серверов, высока вероятность, что нужное ПО уже установлено и сконфигурировано, как нужно. Проверить это можно через DNS-записи, если они привязаны к тому же ресурсу, где размещается веб-сайт.

При управлении DNS через регистратора доменов следует запросить у хостинг-провайдера данные, которые нужно указать в A- и, возможно, NS-записи.

Проверка заполненности полей будет вестись через empty(); с установкой флага обратной обработки if-elseif-else. Он представлен восклицательным знаком и ставится после скобки, давая интерпретатору понять, что условие должно производиться наоборот указанному коду.

Чтобы пользователи не смогли создавать слишком длинные запросы, тем самым превышая лимиты по длине писем и создавая высокую нагрузку на сервер, понадобится использовать strlen();. На него потребуется «подвесить» всё ту же проверку if-elseif-else.

Текст заявки будет выводиться на экране у оператора, поэтому важно избежать XSS-атаки. Планируется, что дополнительного форматирования содержимого не будет, HTML-содержимое отображать не потребуется, однако пользователь может его вставить.

Речь идёт не только о «безобидных» вариантах в виде изменения CSS, из-за которого «слетает» оформление письма, но и об установке JS-скриптов, которые могут выполниться при просмотре текста. Многие email-сервисы сейчас вырезают подобный код из сообщений, но вместе с этим понижают уровень доверия к доменам и, тем самым, повышают вероятность попадания писем в «Спам». Избежать этого поможет функция htmlentities();.

Чтобы пользователь не смог указать ненастоящую электронную почту для обратной связи, следует провести проверку по filter_var(); с установленным флагом FILTER_VALIDATE_EMAIL. До его появления, состоявшегося в PHP 7, потребовалось бы вводить длинное регулярное выражение с огромной задержкой в выполнении – такова особенность regex, от которых постепенно отказываются в угоду «скорости языка».

Проблему в отправке письма вызовет двойная экранизация, представленная добавлением обратного слэша (\) в какой-либо части текста. Избежать её поможет функция stripslashes();. К слову, проблемой могла бы стать и кавычка, двойная или одинарная, буквально создающая «дыру» в строке и позволяющая внедрить какое-либо вредоносное содержимое через точку (например: «Всем привет, это».$virus.»мой новый скрипт»), однако эта проблема исправляется вышеупомянутым htmlentities();.

В удалении пробелов на конце сообщений поможет trim();, также убирающий пустые переносы строк. Этим он делает чтение сообщений более комфортным.

Все данные, указанные пользователем, будут записываться в переменные, чтобы их можно было отобразить в письме. Отправка информации произойдёт через POST-запросы, что связано с ограничениями по длине HTTPGET и их небезопасностью — тогда содержимое запрашиваемых параметров будет сохранено в историю и, возможно, считано какими-либо установленными в браузер расширениями в соответствии с их политиками конфиденциальности.

Достоинства фидбека

Серверная обработка и скрытие данных

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

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

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

Удобная связь с клиентами

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

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

Лёгкий поиск

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

Несложная интеграция

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

Как это работает

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

<?
$operator = «support@example.net»; # Email оператора
# Обработка заявки :: НАЧАЛО
if(isset($_POST[«submit»])) { // Если форма была отправлена
if(!empty($_POST[«name»])) {
if(trim($_POST[«name»]) == «») {
$error = true;
} else { # Если всё нормально с полем «Имя»
$name = htmlentities(trim($_POST[«name»]));
}
}
if(!empty($_POST[«email»])) {
if(trim($_POST[«email»]) == » or filter_var($_POST[«email»], FILTER_VALIDATE_EMAIL) === false or strlen($_POST[«email»]) >= 10001) {
$error = true;
} else { # Если всё нормально с полем «Email»
$email = htmlentities(trim($_POST[«email»]));
}
}
if(!empty($_POST[«message»])) {
if(trim($_POST[«message»]) == ») {
$error = true;
} else { # Если всё нормально с полем «Сообщение»
$message = stripslashes($_POST[«message»]);
$message = htmlentities(trim($message));
}
}
if(!isset($error)) { # Если нет никаких ошибок
# Заголовки письма :: НАЧАЛО
$ticket_headers = «From: Client<client@example.net>\r\n»;
$ticket_headers .= «Reply-To: client@example.net\r\n»;
$ticket_headers .= «Organization: Support Service\r\n»;
$ticket_headers .= «MIME-Version: 1.0\r\n»;
$ticket_headers .= «Content-Type: text/html; charset=UTF-8\r\n»;
# Заголовки письма :: КОНЕЦ
$ticket_subject = «Новое обращение от Пользователя»; # Название письма
$ticket_body = »
<!DOCTYPE HTML>
<html>
<head>
<meta charset=\»utf-8\» />
<style>
div {
padding-left: 1em;
}
</style>
</head>
<body>
<div>
Пользователь отправил новое сообщение. Вот всё, что нам известно:
<ul>
<li>Его имя: $name</li>
<li>Его почта: $email</li>
</ul>
</div>
<div>
$message
</div>
</body>
</html>
«; # Содержимое письма
mail($operator, $ticket_subject, $ticket_body, $ticket_headers); # Отправка сообщения
}
}
# Обработка заявки :: КОНЕЦ
# Вывод страницы и формы :: НАЧАЛО
print(«<!DOCTYPE HTML>
<html lang=\»ru\»>
<head>
<meta charset=\»utf-8\» />
<title>Обратная связь</title>
<style>
form {
margin: 2em;
}
input[type=submit] {
min-width: 60px;
min-height: 20px;
color: black;
background: cyan;
}
input,
textarea {
display: block;
width: 100%;
margin-bottom: 1em;
}
</style>
</head>
<body>
<form method=\»POST\» name=\»contact\»>
<input id=\»name\» type=\»text\» name=\»name\» placeholder=\»Ваше имя\» required />
<input id=\»email\» type=\»email\» name=\»email\» placeholder=\»Ваш email\» required />
<textarea id=\»message\» type=\»text\» name=\»message\» placeholder=\»Ваше сообщение\» rows=\»4\» required></textarea>
<input id=\submit\» type=\»submit\» name=\»submit\» value=\»Отправить\» />
</form>
</body>
</html>
«);
# Вывод страницы и формы :: КОНЕЦ
?>

Чтобы добавить капчу, следует получить публичный и приватный токены. Последний следует использовать только в back-endи не передавать другим пользователям ни в коем случае. Далее остаётся разместить JS-форму капчи на сайт и поставить на неё PHP-обработчик, который представлен сравнением со всё тем же if-elseif-else.

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

Что можно сделать ещё

Отличными дополнениями к базовой форме обратной связи станут:

  • установка счётчиков поддерживаемой длины сообщений на JS;
  • блокировка по доменным именам, осуществимая через strpos();
  • определение местоположения пользователя с помощью https://geoplugin.net или аналогичных сервисов, в том числе бесплатных.

Не будет лишним установить DKIM и SPF, чтобы понизить вероятность появления письма в «Спаме» и позволить пользователям быть уверенными в том, что ответы идут с официального адреса, а не подделаны.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *