Отправка почты
Автор: | Артемьев Сергей Игоревич |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
Очень часто на сайтах возникает необходимость отправить письмо администартору или клиенту. Сделать это можно двумя способами: на стороне клиента и на стороне сервера.
Для отправки почты со стороны клиента достаточно в HTML-код страницы добавить ссылку "mailto:" с указанием необходимого адреса:
<a href="mailto:webmaster@server.com">Написать вебмастеру</a>
Когда пользователь кликает по ссылке, браузер запускает почтовый клиент по-умолчанию и помещает указанный адрес в поле "Кому", так что пользователю достаточно написать текст и отправить письмо. Этот способ никак не связан с PHP, но пользоваться им иногда стоит. Кроме того, это единственный способ вызвать почтовый клиент с сайта, не поддеживающего исполнение скриптов.
Нас же интересует второй способ - отправка почтовых сообщений средствами PHP. В общем-то, для этого в PHP предусмотреда единственная функция - mail(), но вот способов использования её несколько. Прототип функции mail() выглядит следующим образом:
bool mail( string to, string subject, string message [, string additional_headers [, string additional_parameters]] )
При отправке почты необходимо указать как-минимум три параметра: получателя, тему и текст сообщения.
В качестве адреся получателя "to" можно указывать как отдельный адрес, так и целый список, разделённый запятыми. Отдельный адрес может задаваться в следующих форматах "адрес" или "имя <адрес>":
webmaster@server.com или Site Webmaster <webmaster@server.com>
Тема сообщение "subject"- это обычная строка. Единственное ограничение - строка не должна содержать символов перевода строки или возврата каретки ("\n" и "\r").
Тело сообщения "message" - это текст, который вы хотите отправить получателю. Строки сообщения должны разделяться переводом строки в Unix-стиле (LF), а каждая строка не должна быть длиннее семидесяти символов. Если эти требования не выполняются - сервер может запретить отправку письма.
Кроме обязательных элементов можно указывать два дополнительных - расширенные заголовки и расширенные параметры. Расширенные заголовки служат для добавления к письму дополнительных аттрибутов и блоков, таких как адрес отправителя, адрес отправки копии ("cc"), адрес отправки скрытой копии ("bcc") и т.д. Расширенные заголовки так же позволяют отправлять сообщения в HTML-формате.
Расширенные данные - это блок данных, предназначенный для программы, которая будет отправлять почту. Эти данные в некоторых случаях позволяют осуществить тонкую настройку программы для конкретных нужд. Но в обычной практике этот элемент не используется.
Итак, минимальный скрипт отправки сообщения выглядит так:
<?php // текст сообщения $message = "первая строка\nвторая строка\nтретья строка"; // При помощи функции wordwrap() расставляем // переносы так, чтобы строки были не длиннее 70 символов $message = wordwrap($message, 70); // отправляем сообщение mail('webmaster@server.com', 'Тема', $message); ?>
Этот скрипт отправит письмо по указанному адресу, но в поле "от кого" будет указан скорее всего служебный адрес почтового сервера провайдера. Поэтому если вы захотите ответить на это письмо - ответ уйдёт в никуда. Чтобы корректно указать отправителя, воспользуемся расширенными заголовками:
<?php $to = 'client@server.com'; $subject = 'Тема сообщения'; $message = 'Здравствуйте, уважаемый клиент...';
// формируем расширенные заголовки $headers = 'From: robot@server.com' . "\r\n" . 'Reply-To: webmaster@server.com' . "\r\n" . 'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers); ?>
Этот скрипт отправит клиенту письмо от имени почтового робота вашего сайта (заголовок "From:"). Дополнительно, применив заголовок "Reply-To:", мы указали почтовой программе клиента, что ответы надо пересылать не почтовому роботу, а вебмастеру по указанному адресу. Третий фрагмент ("X-Mailer") не является обязательным и описывает программу, с помощью которой было отправлено сообщение. Согласно почтового протокола, разработчик может при необходимости добавлять собственные расширенные заголовки. Единственное ограничение - имена таких заголовков должны начинаться с "X-".
По-умолчанию, функция mail() отправляет сообщения в текстовом виде. Это означает, что если вы в текст добавите HTML-теги, то они будут восприняты как обычный текст без гипертекстовой разметки. Для того, чтобы отправить HTML-сообщение, снова воспользуемся расширенными заголовками:
<?php
// список получателей $to = 'client001@server.com, client002@srv.net';
// Тема сообщения
$subject = 'Новости сайта';
// Сообщение в виде HTML-формате
$message = '
<html>
<head>
<title>Новости сайта</title>
</head>
<body>
<p>Новости на сегодня:</p>
<table>
<tr>
<th>Номер</th><th>Содержание</th> <th>Автор</th><th>Опубликовано</th> </tr>
<tr>
<td>1</td><td>первая новость</td> <td>Администратор</td><td>вчера</td>
</tr>
<tr>
<td>2</td><td>вторая новость</td> <td>Администратор</td><td>сегодня</td>
</tr>
</table>
</body>
</html>
';
// Указываем правильный MIME-тип сообщения:
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
// Добавляем необходимые заголовки
$headers .= 'To: Клиент №1 <client001@server.com>, '. 'Клиент №2 <client002@srv.net>' . "\r\n";
$headers .= 'From: News Robot <news@server.com>' . "\r\n";
$headers .= 'Cc: News Archive <newsarc@server.com' . "\r\n";
$headers .= 'Bcc: newscheck@server.com' . "\r\n";
// Отправляем сообщение
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.