Отправка писем с сайта. Рассылка писем по E-mail-адресам из файла
Отправить письма с сайта позволяет функция mail(). Функция имеет сле-
дующий формат:
mail(<E-mail получателя>, <Тема>, <Сообщение>, [<Заголовки>]);
Функция возвращает true, если письмо отправлено. Если PHP работает в ре- жиме Safe Mode, то функция mail() всегда возвращает false, даже если письмо отправлено.
В параметре <Заголовки> обычно указываются следующие заголовки:
? From — имя и обратный адрес отправителя:
From: Nik <[email protected]>
? Content-Type — MIME-тип и кодовая таблица:
Content-Type: text/html; charset=windows-1251
Заголовки должны быть разделены комбинацией символов \r\n. Если в тек- сте заголовков присутствуют русские буквы, то текст следует зашифровать с помощью метода base64 следующим образом:
=?<Кодировка>?B?<Зашифрованный текст>?=
Зашифровать текст с помощью метода base64 позволяет функция
base64_encode().
$tema = "Сообщение";
$tema = "=?windows-1251?B?" . base64_encode($tema) . "?=";
Зашифровать текст в кодировке UTF-8 позволяет функция
mb_encode_mimeheader(). Функция имеет следующий формат:
mb_encode_mimeheader(<Строка>, [<Кодировка>], [<Метод кодирования>], [<Символ переноса строк>]);
Если параметр <Кодировка> не указан, то используется значение, указанное в функции mb_internal_encoding(). Как показывает практика, указывать ко- дировку в функции mb_internal_encoding() нужно обязательно. Параметр
<Метод кодирования> может принимать значения "B" (Base64) или "Q" (Quoted-Printable). Если параметр не указан, то используется значение "B". Параметр <Символ переноса строк> задает символ для разделения строк. По умолчанию предполагается комбинация "\r\n". Пример:
mb_internal_encoding(‘UTF-8′);
$tema = ‘Сообщение’;
echo mb_encode_mimeheader($tema);
// Выведет: =?UTF-8?B?0KHQvtC+0LHRidC10L3QuNC1?=
Текст сообщения шифровать необязательно. А вот кодовую таблицу симво- лов следует указать в заголовке Content-Type. Также следует учитывать, что длина одной строки не должна превышать 70 символов. Строки отделяются друг от друга символом перевода строки (\n).
Любое письмо может быть отправлено в виде обычного текста (лис- тинг 5.57), а также в формате HTML (листинг 5.58). В первом случае указы- вается MIME-тип text/plain, а во втором — text/html.
В качестве примера отправим письмо с подтверждением регистрации.
Листинг 5.57. Пример отправки письма в виде обычного текста
<?php
$msg = "Добрый день!\n\n";
$msg .= "Вы успешно зарегистрированы.\n\n";
$msg .= "http://www.site.ru/\n";
$msg .= "[email protected]";
$Ot = "Суппорт";
$Ot = "=?windows-1251?B?" . base64_encode($Ot) . "?=";
$header = "Content-Type: text/plain; charset=windows-1251\r\n";
$header .= "From: " . $Ot . " <[email protected]>";
$tema = "Сообщение";
$tema = "=?windows-1251?B?" . base64_encode($tema) . "?=";
mail("[email protected]", $tema, $msg, $header);
?>
Отправленное письмо (с заголовками) будет выглядеть следующим образом:
Subject: =?windows-1251?B?0e7u4fnl7ejl?= Content-Type: text/plain; charset=windows-1251
From: =?windows-1251?B?0fPv7+7w8g==?= <[email protected]>
Добрый день!
Вы успешно зарегистрированы. http://www.site.ru/
Листинг 5.58. Пример отправки письма в формате HTML
<?php
$msg = "Добрый день!<br><br>\n";
$msg .= "Вы успешно зарегистрированы.<br><br>\n";
$msg .= "<a href=\"http://www.site.ru/\">http://www.site.ru/</a><br>\n";
$msg .= "[email protected]";
$Ot = "Суппорт";
$Ot = "=?windows-1251?B?" . base64_encode($Ot) . "?=";
$header = "Content-Type: text/html; charset=windows-1251\r\n";
$header .= "From: " . $Ot . " <[email protected]>";
$tema = "Сообщение";
$tema = "=?windows-1251?B?" . base64_encode($tema) . "?=";
mail("[email protected]", $tema, $msg, $header);
?>
При изучении работы с файлами мы создали файл file.txt со списком рассыл- ки и механизм работы с ним (см. разд. 5.25.4). Теперь рассмотрим возмож- ность рассылки писем по E-mail-адресам из этого файла (листинг 5.59).
Листинг 5.59. Рассылка писем
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
<input type="hidden" name="send" value="1">
<input type="submit" value="Разослать">
</form>
<?php
if (isset($_GET["send"])) {
$email = file(‘file.txt’) or die(‘Файл не найден’);
$msg = "Добрый день!\n\n";
$msg .= "Новости нашего сайта.\n\n";
$msg .= "http://www.site.ru/\n";
$msg .= "[email protected]";
$header = "Content-Type: text/plain; charset=windows-1251\r\n";
$header.="From: news <[email protected]>";
$tema = "Новости сайта";
$tema = "=?windows-1251?B?" . base64_encode($tema) . "?=";
for ($i=0, $c=count($email); $i<$c; $i++) {
$email[$i] = trim($email[$i]);
if (preg_match(‘/^([a-z0-9_.-]+)@([a-z0-9-]+\.)+[a-z]{2,6}$/is’,
$email[$i])) {
@mail($email[$i], $tema, $msg, $header);
}
}
echo "Сообщения разосланы";
}
?>
При нажатии кнопки Разослать на все E-mail из файла будет отправлено письмо.
Обратите внимание, на локальной машине письма отправлены не будут, так как мы не устанавливали программу отправки писем — sendmail. На серве- ре хостинг-провайдера данная программа практически всегда установлена и настроена. Правда, количество одновременно отправленных писем часто ог- раничено.
При рассылке в письме обязательно должна быть предусмотрена возмож- ность отписаться от рассылки. И запомните — рассылка спама в Интернете запрещена. Под спамом понимаются письма, не запрошенные явным образом получателем.
Источник: Прохоренок Н. А. HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера. — 3-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2010. — 912 с.: ил. + Видеокурс (на CD-ROM) — (Профессиональное программирование)