Общие возможности
Рано или поздно каждый владелец сайта сталкивается с
необходимостью отправки писем непосредственно с сайта через скрипт, а не через
почтовые программы. Это могут быть письма, отправляемые скриптом гостевой книги,
сообщающее владельцу сайта что у него в гостевой появилось новое сообщение, или
форумом, для оповещения о новом вопросе.
Во всех этих случаях необходима
именно автоматическая отправка писем миную разнообразные почтовые программы и
утилиты.
Сделать это можно при помощи функции mail(), которую мы сейчас и
будем изучать.
Синтаксис функции mail():
bool mail(string $to, string
$subject, string $msg [, string $header]);
Функция mail() посылает письмо
с темой $subject и содержанием $msg по адресу $to.
Если Вы хотите, чтобы
письмо ушло по нескольким адресам, разделите их пробелами.
Само сообщение
может быть многострочным. Для перехода на новую строку поставьте знак перехода
на новую строку "\n" в конце каждой строки.
mail("name@mail.ru", "my subject", "stroka1\nstroka2\nstroka3");
Или тотже самое можно записать так:
mail("name@mail.ru", "my subject", "stroka1
stroka2
stroka3");
В четвертом необязательном параметре $header можно указать заголовки
нашего сообщения.
Под заголовками я подразумеваю информацию, передаваемую
вместе с письмом почтовому клиенту, которая будет содержать некоторые
технические данные, такие как: кодировка письма, имя отправителя, обратный адрес
отправителя и т.д. Это схоже с использованием тега <META> в
HTML.
Чтобы было более понятно, что из себя представляют заголовки, и где
они находятся в письме, откройте почтовый клиент и посмотрите на любое письмо в
том виде, как оно пришло (Для Outlook это можно сделать нажав правой клавишей
мыши на сообщение->Свойства->Подробно->Исходное сообщение).
Как
мы видим, письмо представляет простой текстовой файл, состоящий из двух общих
разделов:
Вверху идут заголовки письма, затем через две строки идет само
письмо.
Заголовков письма достаточно много, но не все они используются
при написании скрипта отправки почты.
Вот некоторые наиболее часто
используемые:
From: "Имя пользователя отправителя" <Обратный адрес отправителя>
To: <Адрес, по которому отправляют письмо>
Subject: Тема письма
Решение проблемы кодировок
Я не зря выше привел пример отправки письма
со словами латинского алфавита. Их любой почтовый клиент прочтет без труда. Но
вот с русским алфавитом труднее. Русских кодировок существует огромное
множество. И от того, насколько умело Вы перекодируете письмо, будет зависеть
прочтет ли получатель его, или не будет возиться с установкой нужной кодировки и
просто удалит его в корзину.
Кодировку письма задает заголовок Content-type:
$header="From: \"Evgen\" <evgen@mail.ru>";
$header.="Content-type: text/plain; charset=\"windows-1251\"";
$subject="Тема письма";
$msg="Сторака 1\nСтрока 2\nСтрока 3";
mail("name@mail.ru", $subject, $msg, $header);
В заголовке мы указали, что тип письма будет простой текст, а кодировка -
Windows.
Теперь наше письмо придет в понятной для почтового клиента
кодировке.
Но стоит отметить, что в некоторых случаях в правильной кодировке
будет отображено только само письмо. Заголовок же так и останется нечитаемым.
Связано это с тем, где расположен заголовок Content-type относительно заголовка
Subject, который и содержит тему письма. Дело в том, что существуют почтовые
программы, которые понимают заголовок Content-type, но не понимают русский текст
в поле Subject, если это поле стоит до Content-type. В то же время, другие
почтовые программы обязывают нас задавать Content-type последним заголовком в
списке. Чтобы обойти эти препятствия, можно разместить поле Content-type сразу в
начале и в конце списка заголовков:
$subject="Тема письма";
$header="Content-type: text/plain; charset=\"windows-1251\"";
$header.="From: "\Evgen"\ <evgen@mail.ru>";
$header.="Subject: $subject";
$header.="Content-type: text/plain; charset=\"windows-1251\"";
$msg="Сторака 1\nСтрока 2\nСтрока 3";
mail("name@mail.ru", $subject, $msg, $header);
Теперь это письмо прочтет любая почтовая программа!
Отправка письма в HTML-виде
Для отправки письма в HTML-виде достаточно в
заголовке Content-type указать тип документа не text/plain (простой текст), а
text/html (html-текст). А само письмо записать в html-виде:
$subject="Тема письма";
$header="Content-type: text/html; charset=\"windows-1251\"";
$header.="From: "\Evgen"\ <evgen@mail.ru>";
$header.="Subject: $subject";
$header.="Content-type: text/html; charset=\"windows-1251\"";
$msg="<body>
<li>Сторака 1
<li>Сторака 2
<li>Сторака 3
</body>";
mail("name@mail.ru", $subject, $msg, $header);