Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 [ 163 ] 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

( Замечание

Термин "транслит" (сокращение от "транслитерация") означает такую кодировку кириллицы, при которой все "русские" буквы контекстно заменяются на записанные в соответствии с английской транскрипцией. Например, vot stroka,

В Windows параллельно ведем журнал писем ( для отладки).

if(getenv("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() (а также всех остальных почтовых функций) является то, что она умеет перекодировать текст в транслит.



Пример

Напоследок рассмотрим пример применения описанных выше функций. Предположим, в некотором текстовом файле хранится список подписчиков, каждая строка которого оформлена в следующем формате:

Имя подписчикаадресtimestamp подпискикодировка письма

Напишем сценарий, который будет посылать каждому подписчику из этой простейшей базы данных "личное" письмо с самыми последними новостями сайта. Предположим для простоты, что эти новости в программе уже сохранены в массиве $News.

Для начала создадим шаблон письма (листинг 32.3): ! Листинг 32.3. Шаблон "личного" письма:

mail.txt

Content-type: text/plain

From: Система рассылки <subscribe@ourserver.ru>

To: <?=$User[name]?>.

Subject: Свежие новости

Content-type: text/plain

~StartOfMail

Уважаемый <?=$User[name]?>!

Вы подписались на наш лист рассылки <?=date("d.m.Y",$User[time])?>. Предлагаем Вашему вниманию последние новости.

<?foreach($News as $k=>$v) {?> <?=WordWrap($v,60)?>.

<?}?>

Как видим, шаблон практически ничем не отличается от небольшого сценария на PHP. Он получает данные из переменных $User (данные пользователя) и $News (блоки новостей), которые должны устанавливаться запускающей программой. Вскоре мы рассмотрим процедуру более подробно, а пока обратите внимание на некоторые моменты при написании этого шаблона.

□ Мы указали заголовок Content-type сразу в двух местах шаблона - в начале и конце. В силу рассуждений, приведенных в главе 20, это необходимо для того, чтобы помочь некоторым "недогадливым" почтовым программам в определении кодировки письма.

zapisannaya translitom. Эта кодировка особенно полезна для пользователей Unix, которые забыли установить у себя "русскую" таблицу символов.



□ Заметьте, что в конце заголовка To стоит точка. Зачем она нужна? Дело в том, что закрывающий тэг PHP ?>, если он занимает последние символы строки, никогда не генерирует знака перевода строки \n. Это, видимо, сделано для того, чтобы уменьшить количество пустых строк в страницах, которые создает интерпретатор. В нашем случае отсутствие разделителя может сильно помешать, если не поставить после тэга ?> какой-нибудь знак. Вообще-то, лучше здесь использовать пробел, но в листинге он был бы совершенно незаметен, - вот почему я и выбрал точку.

□ Наконец, чтобы каждая строка новостей, которые получит пользователь, была не длиннее 60 символов, мы задействуем встроенную в PHP функцию WordWrap(). Подробнее о ней можно прочитать в главе 12 настоящей книги.

В листинге 32.4 приведен код, который, собственно, и занимается рассылкой писем.

1 Листинг 32.4. Код рассылки писем

<?

Подключаем библиотекаря " прямым" способом. include "$DOCUMENT ROOT/php/Librarian.phl"; Подключаем модуль с функцией PostMail()

Uses("Mail"); . . .

Здесь должна: генерировать массив $News, содержащий блоки последних новостей.

. . .

Откр1ваем базу данн1х с подписчиками. Ее формат б1л рассмотрен нами ранее.

$F=File("db.txt");

foreach($F as $s) {

$User=explode("",trim($s));

Для удобства создаем для каждого значения ключи. $User=array(

"name" => $User[0],

"email" => $User[1],

"time" => $User[2],

"encode" => $User[3]

Посылаем письмо по шаблону из файла mail.txt

очередному пользователю, переводя его в желаемую кодировку.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 [ 163 ] 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189