Вы находитесь на странице: 1из 4

Лекции курса PHP7 + MySQL с нуля

(краткое содержание)

ЛЕКЦИЯ 41. РАБОТА С СЕТЬЮ. ОТПРАВКА ЭЛЕКТРОННЫХ ПИСЕМ

Формат email
Перед рассмотрением возможностей отправки email с помощью средств PHP,
стоит понять, что такое электронное письмо.
Структура любого электронного письма представляет собой следующий вид:
Заголовок_1\r\n
Заголовок_2\r\n

Заголовок_N\r\n
Тело_письма\r\n
Символы \r\n, как Вы помните из предыдущих лекций – символы переноса на
новую строку. Сейчас большинство почтовых программ поддерживают как двойной
символ \r\n, так и одинарный \n, но все же стандарты рекомендуют использовать
именно сочетание \r\n.
Таким образом, сочетая ряд заголовков и текст в теле письма, который, к
слову, может содержать не только непосредственно текст, но и HTML-разметку,
сценарии PHP, JS и многое другое, можно создать красивые интерактивные
письма, которые будут нести в себе массу полезной для получателя информации.
Рассмотрим некоторые заголовки, которые могут встретиться в электронном
письме:
- Date: - дата и время отправки сообщения, пример формата “Mon, 15 Jan 2019
21:20:32 +0300 (MSK/MSD)”;
- From: - адрес отправителя письма;
- To: - адрес получателя (может содержать несколько адресов);
- Content-type: - MIME-тип тела письма (чаще всего указывается text/plain);
- Cc: - адресация копий, которая указывает дополнительных получателей
письма (разница между To и Cc в восприятии некоторыми почтовыми программами,
добавляющими в тело сообщения текст о том, что пересылаемое письмо является
копией);
- Received: – штамп прохождения письма через почтовый сервер, который
позволяет отследить реальный путь письма в случаях, когда отправитель хочет
скрыть источник отправки (спаммеры, мошенники и др.);
- Message-Id: - уникальный идентификатор почтового сообщения,
присваиваемый сообщению после прохождения через первый из почтовых
серверов;
- Bcc: - скрытая копия (другие получатели не видят в теле письма получателей
из этого заголовка;
- Subject: - тема письма (наличие символов Re: подразумевает факт пересылки
данного сообщения от изначально другого отправителя);
- Reply-To: - адрес для ответов (в случаях рассылки спама, часто указывается
ложный почтовый адрес для отсылки ответов на него);
- In-Reply-To: - указывает на тип сообщения «ответ на ответ»;
- Comments: - комментарий, который может содержать различную
дополнительную информацию (часто используется в недобросовестных
намерениях отправителями спама, мошенниками и др.);
- Status: - статус письма (новое, прочитанное и др.).

1
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

Отправка письма
Для отправки писем в PHP используется функция mail():
bool mail(string $to, string $subject, string $message [, mixed $headers, string
$parameters])
Функция содержит следующие параметры:
- $to – адрес получателя;
- $subject – тема сообщения;
- $message – текст сообщения;
- $headers – дополнительные заголовки почтовых сообщений, рассмотренные
в этой лекции;
- $parameters – дополнительные параметры почтовых сообщений, которые
могут использоваться для передачи дополнительных аргументов командной строки
для почтовых программ.
Рассмотрим возможности отправки почтовых сообщений в листинге 41.1.
Листинг 41.1. Отправка электронной почты функцией mail()

<!--Создадим интерактивную форму отправки почтового сообщения в службу


технической поддержки-->
<!--Дополнительные условия:
1. Обработка данных внутри файла Listing_41.1.php
2. Наличие интерактивной формы, которая работает в двух режимах:
2.1. При первичном входе на страницу формы или при обновлении страницы
показывает форму отправки письма.
2.2. При отправке письма показывает сообщение об успешно отправленном
сообщении.-->
<!DOCTYPE html>
<html lang="ru">

<head>
<meta charset="UTF-8">
<title>Форма отправки email</title>
</head>

<body>
<?php

if($_POST['submit']) {
echo "
<b>Уважаемый {$_POST['name']}, благодарим Вас за обращение в службу
технической поддержки нашего сервиса!</b>
<p>Наши специалисты свяжутся с Вами по указанному email:
{$_POST['email']} в ближайшее время</p>";
} elseif($_POST['submit'] && (!$_POST['name'] || !$_POST['email'] ||
!$_POST['subject'] || !$_POST['message'])) {
echo "
<b>Вы не заполнили, либо заполнили некорректно поля отправки
сообщения!</b>

2
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

<p>Пожалуйста проверьте правильность заполнения формы и отправьте


сообщение повторно.</p>";
} else {
echo "
<h1>Отправка сообщения в техническую поддержку</h1>
<form action=\"Listing_41.1.php\" method=\"post\" style=\"display: flex; flex-
direction: column; justify-content: center; align-items: center; width: 300px;\">
<div>
<input type=\"text\" name=\"name\" placeholder=\"Как к Вам
обращаться?\" style=\"margin: 10px 0; width: 220px; height: 25px; border: 1px solid
rgb(30,30,30); border-radius: 3px; font-family: Arial, sans-serif; color: rgb(30,30,30); padding: 3px
5px;\">
</div>
<div>
<input type=\"email\" name=\"email\" placeholder=\"Ваш email\"
style=\"margin: 10px 0; width: 220px; height: 25px; border: 1px solid rgb(30,30,30); border-
radius: 3px; font-family: Arial, sans-serif; color: rgb(30,30,30); padding: 3px 5px;\">
</div>
<div>
<input type=\"text\" name=\"subject\" placeholder=\"Тема
сообщения\" style=\"margin: 10px 0; width: 220px; height: 25px; border: 1px solid
rgb(30,30,30); border-radius: 3px; font-family: Arial, sans-serif; color: rgb(30,30,30); padding: 3px
5px;\">
</div>
<div>
<textarea name=\" message\" cols=\"30\" rows=\"10\"
placeholder=\"Текст сообщения\" style=\"margin: 10px 0; width: 220px; height: 200px; border:
1px solid rgb(30,30,30); border-radius: 3px; font-family: Arial, sans-serif; color: rgb(30,30,30);
resize: none; padding: 3px 5px;\"></textarea>
</div>
<div>
<input type=\"submit\" name=\"submit\" value=\"Отправить\"
style=\"border: none; border-radius: 3px; height: 30px; width: 220px; color: rgb(245,245,245);
background-color: rgb(150,150,150); cursor: pointer;\">
</div>
</form>
";
}

?>

<?php

$email = "support@support.com";
$subject = "Отправитель: ".$_POST['name'].". Обращение в службу
тех.поддержки по теме: ".$_POST['subject'];
$headers = "From: ".$_POST['email']."\r\n";

3
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

if ($_POST['name'] && $subject && $_POST['message']) {


mail($email, $subject, $_POST['message'], $headers);
}
?>

</body>
</html>
В данном листинге Вы видите подробное рассмотрение принципов действия
функции mail(). Учитывая, что работа производится на локальном сервере, письмо
отправляется не на почтовый адрес, а помещается в текстовом виде в папке
userdata\temp\email папки размещения OpenServer и может принимать следующий
вид:
To: support@support.com
Subject: Отправитель: Иван Иванов. Обращение в службу тех.поддержки по теме:
Тема сообщения
X-PHP-Originating-Script: 0:Listing_41.1.php
From: example@exam.com

Текст сообщения в службу поддержки


В условиях размещения данного сценария на веб-сервере отправка письма
произойдет в обычном режиме и письмо будет получено на адрес
support@support.com, в случае, если адрес отправителя и адрес получателя не
внесено в спам-листы почтовых серверов.

Безопасность сообщений
В этой лекции Вы рассмотрели листинг, который показывает способ отправки
сообщения электронной почтой.
Стоит остановиться на некоторых моментах, связанных с безопасностью
отправки сообщений и обработкой пользовательских данных в целом.
Настоятельно не рекомендуется применять вышеуказанный листинг в
качестве практического примера, т. к. он не учитывает ряда особенностей, а
именно, не обрабатывает входящие пользовательские данные.
Для этого существуют способы, называемые фильтрацией данных, которые
будут рассмотрены в разделе 5 настоящего курса, посвященного фильтрации. Так,
для примера из листинга 41.1 стоит использовать такие функции, как, например,
htmlsecialchars(), которая обрабатывает входящую строку и форматирует символы,
подобные «<», «>» и другие, используемые в скриптах. Это необходимо, чтобы
исключить так называемые инъекции, когда недобросовестный пользователь
может в теле сообщения передать скрипт, который может нанести вред серверу и
другим пользователям.