| |
("COMSPEC")) {
if(!@is_dir("debug")) mkdir("debug",0755);
$f=fopen("debug/_debug_mail.txt","a+");
fputs($f,"> to: $to\n");
fputs($f,"$head\n--------\n");
fputs($f,"$msg\n-----------------------------------------\n\n");
fclose($f);
}
return $Result;
}
// Функция PostMail() "разворачивает" шаблон $msg, делая доступным для
// него переменные из массива $Vars (см. описание функций
// ExpandTemplate() и ExpandFile()). Затем она переводит результирующий
// текст в кодировку, заданную в $encTo (сам текст при этом
// рассматривается в кодировке $encFrom), и посылает его по электронной
// почте по адресу $to. Если строка $msg начинается с префикса
// file:, за которым следует имя файла, то шаблон письма загружается из
// этого файла при помощи ExpandFile(). В противном случае в качестве
// шаблона рассматривается сам параметр $msg.
function PostMail($to,$msg,$encTo=DefaultCode,
$Vars=false,$encFrom=DefaultCode)
{ if(eregi("^file:(.*)(\n|\$)",$msg,$P))
$Text=ExpandFile(trim($P[1]),$Vars);
else
$Text=ExpandTemplate($msg,$Vars);
// Посылаем письмо.
return SendMail($to,$Text,$encTo,$encFrom);
}
?>
Отличительной особенностью функции EncodeString() (а также всех остальных
почтовых функций) является то, что она умеет перекодировать текст в транслит.
Термин "транслит" (сокращение от "транслитерация") означает такую кодиров-
ку кириллицы, при которой все "русские" буквы контекстно заменяются на за-
писанные в соответствии с английской транскрипцией. Например, vot stroka,
Глава 32. Почтовые шаблоны 493
zapisannaya translitom. Эта кодировка особенно полезна для пользователей
Unix, которые забыли установить у себя "русскую" таблицу символов.
Пример
Напоследок рассмотрим пример применения описанных выше функций. Предполо-
жим, в некотором текстовом файле хранится список подписчиков, каждая строка ко-
торого оформлена в следующем формате:
Имя_подписчика|адрес|timestamp_подписки|кодировка_письма
Напишем сценарий, который будет посылать каждому подписчику из этой простей-
шей базы данных "личное" письмо с самыми последними новостями сайта. Предпо-
ложим для простоты, что эти новости в программе уже сохранены в массиве $News.
Для начала создадим шаблон письма (листинг 32.3):
Листинг 32.3. Шаблон "личного" письма: mail.txt
Content-type: text/plain
From: Система рассылки
To: =$User['name']?>.
Subject: Свежие новости
Content-type: text/plain
~StartOfMail
Уважаемый =$User['name']?>!
Вы подписались на наш лист рассылки =date("d.m.Y",$User['time'])?>.
Предлагаем Вашему вниманию последние новости.
---------------------------------------------------------------
$v) {?>
=WordWrap($v,60)?>.
}?>
Как видим, шаблон практически ничем не отличается от небольшого сценария на
PHP. Он получает данные из переменных $User (данные пользователя) и $News
(блоки новостей), которые должны устанавливаться запускающей программой. Вско-
ре мы рассмотрим процедуру более подробно, а пока обратите внимание на некото-
рые моменты при написании этого шаблона.
r Мы указали заголовок Content-type сразу в двух местах шаблона — в начале и
конце. В силу рассуждений, приведенных в главе 20, это необходимо для того,
чтобы помочь некоторым "недогадливым" почтовым программам в определении
кодировки письма.
Часть V. Приемы программирования на PHP 494
r Заметьте, что в конце заголовка To стоит точка. Зачем она нужна? Дело в том,
что закрывающий тэг PHP ?>, если он занимает последние символы строки, нико-
гда не генерирует знака перевода строки \n. Это, видимо, сделано для того,
чтобы
уменьшить количество пустых строк в страницах, которые создает интерпретатор.
В нашем случае отсутствие разделителя может сильно помешать, если не поста-
вить после тэга ?> какой-нибудь знак. Вообще-то, лучше здесь использовать про-
бел, но в листинге он был бы совершенно незаметен, — вот почему я и выбрал
точку.
r Наконец, чтобы каждая строка новостей, которые получит пользователь, была не
длиннее 60 символов, мы задействуем встроенную в PHP функцию WordWrap(). Под-
робнее о ней можно прочитать в главе 12 настоящей книги.
В листинге 32.4 приведен код, который, собственно, и занимается рассылкой писем.
Листинг 32.4. Код рассылки писем
// Подключаем библиотекаря "прямым" способом.
include "$DOCUMENT_ROOT/php/Librarian.phl";
// Подключаем модуль с функцией PostMail()
Uses("Mail");
// . . .
// Здесь мы должны генерировать массив $News,
// содержащий
|
|