Отправка электронной почты через PHP-форму

Опубликовано 26 февраля 2021 в 01:11 (Обновлено 9 января 2024 в 14:13)

Время чтения: 5 мин

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

E-mail в PHP
E-mail в PHP

Простая форма

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

Веб-форма состоит из двух частей:

  1. HTML код формы. Приведенный ниже HTML-код отображает стандартную форму в веб-браузере.
  2. 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()

Из документации:

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, но об этом мы поговорим в следующих статьях.

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.