Очень часто на сайтах возникает необходимость отправить письмо администартору или клиенту. Сделать это можно двумя способами: на стороне клиента и на стороне сервера.
Для отправки почты со стороны клиента достаточно в HTML-код страницы добавить ссылку "mailto:" с указанием необходимого адреса:
Написать вебмастеру
Когда пользователь кликает по ссылке, браузер запускает почтовый клиент по-умолчанию и помещает указанный адрес в поле "Кому", так что пользователю достаточно написать текст и отправить письмо. Этот способ никак не связан с PHP, но пользоваться им иногда стоит. Кроме того, это единственный способ вызвать почтовый клиент с сайта, не поддеживающего исполнение скриптов.
Нас же интересует второй способ - отправка почтовых сообщений средствами PHP. В общем-то, для этого в PHP предусмотреда единственная функция - mail() , но вот способов использования её несколько. Прототип функции mail() выглядит следующим образом:
Bool mail(string to, string subject, string message [, string additional_headers [, string additional_parameters]])
При отправке почты необходимо указать как-минимум три параметра: получателя, тему и текст сообщения.
В качестве адреся получателя "to" можно указывать как отдельный адрес, так и целый список, разделённый запятыми. Отдельный адрес может задаваться в следующих форматах "адрес" или "имя <адрес>" :
[email protected]
или
Site Webmaster
Тема сообщение "subject" - это обычная строка. Единственное ограничение - строка не должна содержать символов перевода строки или возврата каретки ("\n" и "\r").
Тело сообщения "message" - это текст, который вы хотите отправить получателю. Строки сообщения должны разделяться переводом строки в Unix-стиле (LF), а каждая строка не должна быть длиннее семидесяти символов. Если эти требования не выполняются - сервер может запретить отправку письма.
Кроме обязательных элементов можно указывать два дополнительных - расширенные заголовки и расширенные параметры. Расширенные заголовки служат для добавления к письму дополнительных аттрибутов и блоков, таких как адрес отправителя, адрес отправки копии ("cc" ), адрес отправки скрытой копии ("bcc" ) и т.д. Расширенные заголовки так же позволяют отправлять сообщения в HTML-формате.
Расширенные данные - это блок данных, предназначенный для программы, которая будет отправлять почту. Эти данные в некоторых случаях позволяют осуществить тонкую настройку программы для конкретных нужд. Но в обычной практике этот элемент не используется.
Итак, минимальный скрипт отправки сообщения выглядит так:
Этот скрипт отправит письмо по указанному адресу, но в поле "от кого" будет указан скорее всего служебный адрес почтового сервера провайдера. Поэтому если вы захотите ответить на это письмо - ответ уйдёт в никуда. Чтобы корректно указать отправителя, воспользуемся расширенными заголовками:
// формируем расширенные заголовки
$headers = "From: [email protected]" . "\r\n" .
"Reply-To: [email protected]" . "\r\n" .
"X-Mailer: PHP/" . phpversion();
mail($to, $subject, $message, $headers);
?>
Этот скрипт отправит клиенту письмо от имени почтового робота вашего сайта (заголовок "From:" ). Дополнительно, применив заголовок "Reply-To:" , мы указали почтовой программе клиента, что ответы надо пересылать не почтовому роботу, а вебмастеру по указанному адресу. Третий фрагмент ("X-Mailer" ) не является обязательным и описывает программу, с помощью которой было отправлено сообщение. Согласно почтового протокола, разработчик может при необходимости добавлять собственные расширенные заголовки. Единственное ограничение - имена таких заголовков должны начинаться с "X- ".
По-умолчанию, функция mail() отправляет сообщения в текстовом виде. Это означает, что если вы в текст добавите HTML-теги, то они будут восприняты как обычный текст без гипертекстовой разметки. Для того, чтобы отправить HTML-сообщение, снова воспользуемся расширенными заголовками:
// список получателей $to = "[email protected], [email protected]";
// Тема сообщения
$subject = "Новости сайта";
// Сообщение в виде HTML-формате
$message = "
Новости на сегодня:
Номер | Содержание | Автор | Опубликовано |
---|---|---|---|
1 | первая новость | Администратор | вчера |
2 | вторая новость | Администратор | сегодня |
";
// Указываем правильный MIME-тип сообщения:
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html;
charset=iso-8859-1" . "\r\n";
// Добавляем необходимые заголовки
$headers .=
"To: Клиент №1
$headers .=
"From: News Robot
$headers .=
"Cc: News Archive
// Отправляем сообщение
mail($to, $subject, $message, $headers);
?>
Этот скрипт отправит письмо в HTML-формате двум получателям, а так же вышлет копии в архив и в контрольный ящик.
Запустить отправку писем можно двумя способами - в результате действий пользователя (например, после обработки данных формы), либо посредством запланированного задания. Первый случай очевиден - пользователь отсылает форму на сервер, там происходит обработка данных и на указанный почтовый ящик отправляются результаты обработки формы (подтверждение регистрации, счета к оплате, содержимое заказа или что-то еще).
Второй способ чаще всего используется, когда скрипт необходимо выполнять периодически (например, ежедневная рассылка новостей). Организация планирования выполнения задачи средствами PHP - задача нетривиальная. Более простой путь - воспользоваться готовыми интсрументами, например crontab. Этот инструмент доступен на большинстве платных Unix-хостингов. Более подробно мы рассмотрим crontab в отдельном уроке.
Дополнительно можно отметить, что попробовать отправку почты с вашего локального сервера у вас не получится. В большинстве случаев в целях безопасности функции почты не настроены и их надо прописать вручную. Указать параметры можно либо в файле php.ini, либо непосредственно в коде перед вызовом функции mail() :
// в php.ini SMTP = localhost sptp_port = 25 // в коде ini_set("SMTP", "localhost"); ini_set("smtp_port", "25");
Кроме того, настоятельно рекомендую поставить локальный SMTP-сервер, например, PersonalSMTP. Эта утилита распространяется бесплатно, проста в установке и настройке, но при этом позволяет отлаживать отправку писем даже при отсутствии подключения к Интернет. При использовании PersonalSMTP в конфигурации по-умолчанию используется сервер "localhost" и порт 15025, следовательно перед вызовом функции mail() необходимо добавить строки:
// не забудьте закомментировать их // перед публикацией скрипта на сайте. ini_set("SMTP", "localhost"); ini_set("smtp_port", "15025");
Для работы с электронной почтой уже создано множество классов, поэтому вам нет острой нужды писать весь код самостоятельно. Достаточно посетить соответствующий сайт и скачать одну из бесплатных библиотек, например libmail2008.
Одной из самых востребованных функций на сайте является форма заявки или заказа, данные из которой отправляются на почту владельцу сайта. Как правило такие формы являются простыми и состоят из двух трех полей для ввода данных. Как же создать такую форму заказа? Здесь потребуется использование языка разметки HTML и языка программирования PHP.
Язык разметки HTML сам по себе несложен, нужно всего лишь разобраться в том как и где ставить те или иные теги. С языком программирования PHP все немного сложнее.
Для программиста создать такую форму не составит труда, а вот HTML верстальщику может показаться сложным некоторые действия.
Создаем форму отправки данных в html
Первая строка будет следующей
Теперь соберем все вместе.
Теперь сделаем так, чтобы поля в форме стали обязательными для заполнения. Имеем следующий код:
Создаем файл, принимающий данные из HTML формы
Это будет файл с именем send.php
В файле на первом этапе нужно принять данные из пост массива. Для этого создаем две переменные:
$fio = $_POST["fio"];
$email = $_POST["email"];
Перед названиями переменных в php ставиться знак $, в конце каждой строки ставиться точка с запятой. $_POST это массив в который передаются данный из формы. В форме html при этом указан метод отправки method="post". Так, приняты две переменные из формы html. Для целей защиты своего сайта нужно провести эти переменные через несколько фильтров - функций php.
Первая функция преобразует все символы, которые пользователь попытается добавить в форму:
При этом новые переменные в php не создаются, а используются уже имеющиеся. Что сделает фильтр, он преобразует символ "<" в "<". Также он поступить с другими символами, встречающимися в html коде.
Вторая функция декодирует url, если пользователь попытается его добавить в форму.
$fio = urldecode($fio);
$email = urldecode($email);
Третей функцией мы удалим пробелы с начала и конца строки, если таковые имеются:
$fio = trim($fio);
$email = trim($email);
Существуют и другие функции, позволяющие отфильтровать переменные php. Их использование зависит от того, насколько вы опасаетесь того, что злоумышленник попытается добавить программный код в данную форму отправки данных на почту html.
Проверка данных, передаваемых от HTML формы в файл PHP
Для того, чтобы проверить, работает ли этот код, передаются ли данные можно просто их вывести на экран при помощи функции echo:
echo $fio;
echo "
";
echo $fio;
Вторая строка здесь нужна для того, чтобы разделить вывод переменных php на разные строки.
Отправляем полученные данные из формы HTML на почту при помощи PHP
Для отправки данных на почту нужно воспользоваться функцией mail в PHP.
mail("на какой адрес отправить", "тема письма", "Сообщение (тело письма)","From: с какого email отправляется письмо \r\n");
Например, нужно отправить данные на email владельца сайта или менеджера [email protected].
Тема письма должна быть понятной, а сообщение письма должно содержать то, что указал пользователь в HTML форме.
mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n");
Необходимо добавить условие, которе проверит отправилась ли форма при помощи PHP на указанные адрес электронной почты.
if (mail("[email protected]", "Заказ с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
{
echo "сообщение успешно отправлено";
} else {
}
Таким образом программный код файла send.php, который отправит данные HTML формы на почту будет выглядеть следующим образом:
$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$fio = trim($fio);
$email = trim($email);
//echo $fio;
//echo "
";
//echo $email;
if (mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
{ echo "сообщение успешно отправлено";
} else {
echo "при отправке сообщения возникли ошибки";
}?>
Три строки для проверки, передаются ли данные в файл закомментированы. При необходимости их можно удалить, так как они нужны были только для отладки.
Помещаем HTML и PHP код отправки формы в один файл
В комментариях к этой статье многие задают вопрос о том, как сделать, чтобы и HTML форма и PHP код отправки данных на почту находились в одном файле, а не двух.
Для реализации такой работы нужно поместить HTML код формы в файл send.php и добавить условие, которое будет проверять наличие переменных в массиве POST (этот массив передается из формы). То есть, если переменные в массиве не существуют, то нужно показать пользователю форму. Иначе нужно принять данные из массива и отправить их адресату.
Давайте посмотрим как изменить PHP код в файле send.php:
//проверяем, существуют ли переменные в массиве POST
if(!isset($_POST["fio"]) and !isset($_POST["email"])){
?> } else {
//показываем форму
$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$fio = trim($fio);
$email = trim($email);
if (mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n")){
echo "Сообщение успешно отправлено";
} else {
echo "При отправке сообщения возникли ошибки";
}
}
?>
Существование переменной в POST массиве мы проверяем PHP функцией isset(). Восклицательный знак перед этой функцией в условии означает отрицание. То есть, если переменной не существует, то нужно показать нашу форму. Если бы я не поставил восклицательный знак, то условие дословно означало бы - "если существует, то показать форму". А это неправильно в нашем случае. Естественно, что вы можете переименовать его в index.php. Если будуту переименовывать файл, то не забудьте переименовать название файла и в строке