| |
удно
// восстанавливать текст из транслита (хотя эта задача и разрешима).
// Функция полезна и сама по себе, но все-таки чаще всего ее
// применяют для работы с почтой. Именно поэтому я включаю
// ее в этот модуль.
function EncodeString($st,$to,$from=DefaultCode)
{ // Оставляем только первые буквы названий кодировок
$from=strtolower(substr($from,0,1));
$to =strtolower(substr($to,0,1));
// Пытаемся воспользоваться встроенной в PHP функцией
if($to!="t") return convert_cyr_string($st,$from,$to);
// Иначе нужно преобразовать строку в Translit, что придется
// делать "вручную" — при помощи strtr().
// Сначала заменяем "односимвольные" фонемы.
$st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ",
"abvgdeeziyklmnoprstufh'ie");
$st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ",
"ABVGDEEZIYKLMNOPRSTUFH'IE");
// Затем — "многосимвольные".
$st=strtr($st,array(
"ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh",
"щ"=>"shch","ь"=>"", "ю"=>"yu", "я"=>"ya",
"Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH",
Часть V. Приемы программирования на PHP 490
"Щ"=>"SHCH","Ь"=>"", "Ю"=>"YU", "Я"=>"YA"
));
// Возвращаем результат.
return $st;
}
// Значения параметра Content-tyep charset в зависимости от
// односимвольного названия кодировки.
global $CoderCharset;
$CoderCharset["w"]="windows-1251";
$CoderCharset["i"]="iso-8859-5";
$CoderCharset["k"]="koi8-r";
$CoderCharset["m"]="x-mac-cyrillic";
$CoderCharset["t"]="koi8-r";
// Разделитель тела и заголовков (таких как From: и т. д.) в письме.
define("MailDivider","~StartOfMail");
// Посылает письмо $msg по заданному адресу $to, перед этим
// преобразовав его в кодировку $encTo. Проставляет поле
// charset и правильно обрабатывает имя получателя (если
// в теле письма уже указано "To: Вася", то в результате
// получается "To: Вася "). Если работа происходит
// в Win32, то письмо не посылается, а создается отладочный файл,
// в котором будет содержаться текст письма.
// Письмо должно состоять из заголовков и тела, разделенных
// маркером ~StartOfMail.
function SendMail($to,$msg,$encTo=DefaultCode,$encFrom=DefaultCode)
{ global $CoderCharset;
// Перекодируем
$msg=EncodeString($msg,$encTo,$encFrom); // тело письма
$head=""; // заголовки
// Если есть заголовки, выделяем их.
if(strpos($msg,MailDivider)!==false) {
$regs=split(MailDivider."\r?\n?",$msg,2); // тело и заголовки
$head=trim($regs[0]);
$msg=$regs[1];
}
Глава 32. Почтовые шаблоны 491
// Работаем с заголовками. Разбиваем их на строки.
if($head) $Lines=split("[\r\n]+",$head); else $Lines=array();
$HasContType=0; // число найденных заголовков Content-type
$chs="charset=$CoderCharset[$encTo]";
$subject="";
for($i=0; $i";
$l="";
}
// Проверяем заголовок Subject. В некоторых верcиях PHP
// передача пустого второго параметра в функцию mail()
// приводит к нежелательным последствиям. Указывая в заголовке
// значение Subject из письма, мы решаем проблему.
if(eregi("^subject:([^\r\n]*)",$l,$regs)) {
$subject=trim($regs[1]);
}
}
// Нет заголовка Content-type — добавляем его в конец.
if(!$HasContType) $Lines[]="Content-type: text/plain; $chs";
// Соединяем строки опять вместе.
$head=ereg_Replace("\n\n+","\n",join("\n",$Lines));
// Посылаем письмо.
$Result=@mail($to,$subject,$msg,$head)!=0;
Часть V. Приемы программирования на PHP 492
// В Windows параллельно ведем журнал писем (для отладки).
if(geten
|
|