Обычным требованием практически на любом сайте является наличие какой-либо формы, будь то форма обратной связи или, например, калькулятор.
Простая форма
В этой статье мы создадим PHP-скрипт, который будет посылать электронное письмо при отправке веб-формы пользователем сайта, разберемся как всё работает технически.
Веб-форма состоит из двух частей:
- HTML код формы. Приведенный ниже HTML-код отображает стандартную форму в веб-браузере.
- PHP-скрипт для работы с отправкой формы. Скрипт получает отправленную форму и посылает электронное письмо.
HTML код для электронной формы:
<form method="post" name="myemailform" action="form-to-email.php">
Enter Name: <input type="text" name="name">
Enter Email Address: <input type="text" name="email">
Enter Message: <textarea name="message"></textarea>
<input type="submit" value="Send Form">
</form>
Форма содержит следующие поля:
- имя,
- адрес электронной почты,
- сообщение.
Имя и адрес электронной почты — это однострочные поля ввода текста, тогда как «сообщение» — это поле текстовой области (многострочный ввод текста). В форме могут быть разные типы полей ввода.
При нажатии кнопки отправки форма будет отправлена на «form-to-email.php» методом POST.
Доступ к данным отправленной формы в PHP-скрипте
После того, как посетитель вашего сайта отправил форму, браузер отправляет данные для заполнения формы в скрипт, упомянутый в атрибуте action
формы.Для текущей формы был указан файл — form-to-email.php.
Так как у нас есть метод отправки формы, упомянутый как POST
в форме — method='post'
, то мы можем получить доступ к данным для отправки формы через массив $_POST[]
в PHP скрипте.
Следующий код получает значения, отправленные для полей: имя, электронная почта и сообщение.
<?php
$name = $_POST['name'];
$visitor_email = $_POST['email'];
$message = $_POST['message'];
?>
Мы присваиваем переменным значения из глобального массива $_POST
после отправки данных из формы.
Составление сообщения электронной почты
Теперь мы можем использовать указанные выше переменные PHP для составления сообщения электронной почты.
Используем код:
<?php
$email_from = 'yourname@yourwebsite.com';
$email_subject = "New Form submission";
$email_body = "You have received a new message from the user $name.\n". "Here is the message:\n $message".
?>
Адрес » From «, тема и тело электронного сообщения составлены в приведенном выше коде. Обратите внимание на то, как составлено тело сообщения с использованием переменных.
Если посетитель сайта Anthony
отправит форму, электронное сообщение будет выглядеть следующим образом:
«You have received a new message from the user Anthony. Here is the message: Hi, Thanks for your great site. I love your site. Thanks and Bye. Anthony.»
Мы использовали двойные кавычки, поэтому переменная $name
заменяется своим значением, что называется интерполяцией.
Отправка электронного письма
Функция PHP для отправки электронной почты — mail()
.
mail(to,subject,message,headers)
Из документации:
mail ( string $to , string $subject , string $message , array|string $additional_headers = [] , string $additional_params = "" ) : bool
Параметр заголовков (headers) предоставляет дополнительные параметры почты (например, адрес отправителя, копия, скрытая копия и т.д.).
Код для отправки электронного письма:
<?php
$to = "yourname@yourwebsite.com";
$headers = "From: $email_from \r\n";
$headers .= "Reply-To: $visitor_email \r\n";
mail($to,$email_subject,$email_body,$headers);
?>
Обратите внимание, что мы поместили ваш адрес электронной почты в параметр ‘From‘, а адрес электронной почты посетителя — в параметр ‘Reply-To‘. В параметре ‘From‘ должно быть указано происхождение письма. Если вы поместите адрес электронной почты посетителя в параметр ‘From‘, некоторые почтовые серверы могут отклонить сообщение, думая, что вы выдаете себя за кого-то.
Отправка электронного письма более чем одному получателю
Если вы хотите отправить письмо нескольким получателям, то просто добавьте их в переменную $to
.
<?php
$to = "name1@website-name.com, name2@website-name.com,name3@website-name.com";
mail($to,$email_subject,$email_body,$headers);
?>
Вы также можете использовать параметры CC (копия) и BCC (скрытая копия). Электронные письма CC и BCC добавляются в параметр «заголовки» (headers
).
Пример кода:
<?php
$to = "name1@website-name.com, name2@website-name.com,name3@website-name.com";
$headers = "From: $email_from \r\n";
$headers .= "Reply-To: $visitor_email \r\n";
$headers .= "Cc: someone@domain.com \r\n";
$headers .= "Bcc: someoneelse@domain.com \r\n";
mail($to,$email_subject,$email_body,$headers);
?>
Защита формы от инъекций
Спамеры ищут удобные в использовании формы для рассылки спама. Они используют скрипт обработчика форм в качестве «реле». Что они делают, так это отправляют форму с манипулируемыми значениями форм.
Чтобы обезопасить нашу форму от таких атак, мы должны проверить данные отправленной формы.
Все значения, которые идут в параметре ‘headers’ должны быть проверены на наличие \r
или \n
. Хакеры вставляют эти символы и добавляют свой код, чтобы обмануть функцию.
Вот обновленный код:
<?php
function IsInjected($str)
{
$injections = array('(\n+)',
'(\r+)',
'(\t+)',
'(%0A+)',
'(%0D+)',
'(%08+)',
'(%09+)'
);
$inject = join('|', $injections);
$inject = "/$inject/i";
if(preg_match($inject,$str))
{
return true;
}
else
{
return false;
}
}
if(IsInjected($visitor_email))
{
echo "Bad email value!";
exit;
}
?>
Как правило, любое значение, используемое в заголовке, следует проверять с помощью приведенного выше кода.
Лучше, чтобы полная проверка могла быть выполнена с помощью скрипта проверки формы PHP, но об этом мы поговорим в следующих статьях.