HTML, Excel, Word, SEOPHP курс для чайников ⇒ Отправка почты

PHP для "чайников"

Инструменты
Выбираем IDE
Выбираем Web-сервер
Выбираем СУБД
Структура языка PHP
Первый шаг
Синтаксис
Типы данных
Переменные и константы
Операторы
Выражения
Управляющие структуры
Функции
Классы
Исключения
Ошибки
Массивы
Глобальные массивы
Cookies
Сессии
Загрузка файлов
Работа с файлами
Работа с файлами на диске
Работа с данными в файле
Пример управления файлами
Работа с базами данных
Подключение
Анализ результатов
Выполнение запросов
Отключение
Пример: отслеживание пользователей
Работа в сети
Отправка почты
Безопасность
HTTP-аутентификация
Защита логином и паролем
Автоматизация
Регулярные выражения в PHP
Интеграция
PHP и JavaScript



Отправка почты


Автор: Артемьев Сергей Игоревич
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.

 



В начало страницы



В начало страницы