![]() |
![]() |
| http://kurepin.ru/php/slang.ru/11/ |
|
Строим сайт Глава 11. почтовые функции, первое тестирование Раз уж мы вызываем функцию err_to_support(), то давайте сразу и распишем ее. Очевидно, что отправка почтовых сообщений нам понадобится в разных ситуациях, поэтому желательно сразу продумать всю структуру функций отправки электронных писем. Я предлагаю следующие функции: highlight_string(' // отправка собщения function sendmail($from, $to, $subj=\'\', $body=\'\', $header=\'\', $convert=true) { // замена стандартных данных $body=str_replace(\'{date}\',date(\'d.m.Y\'), $body); $body=str_replace(\'{time}\',date(\'H.i.s\'), $body); // подготовительные работы if(!strlen($header)) $header="Content-Type: text/plain; charset=\"koi8-r\"\nContent-Transfer-Encoding: 8bit"; $from=\'From: \'.$from."\nReply-To: ".$from."\n".$header; if($convert) list($from,$to,$subj,$body)=explode(chr(7),convert_cyr_string(implode(chr(7),array($from,$to,$subj,$body)),"w","k")); // отправка сообщения if(!mail($to,$subj,$body,$from)) return(302); return(0); } function mail_to_user($user,$from,$subj=\'\',$text=\'\') { // подготовительные работы // ... // отправка сообщения $err=$this->sendmail($from,$to,$subj,$text); if($err) return($err); return(0); } // отправка письма в support (администраторам) function mail_to_support($from, $subj, $text) { // информация из сессии пользователя (если есть) global $session; if(isset($session)) { $sesdump=var_dump($session); } else { $sesdump=\'none\'; } // замена стандартных данных в text $text=str_replace(\'{user_ip}\',$_SERVER[\'REMOTE_ADDR\'],$text); $text=str_replace(\'{user_id}\',$this->user_id,$text); $text=str_replace(\'{user_info}\',$sesdump,$text); $text=str_replace(\'{sql_query}\',$this->sql_query,$text); $text=str_replace(\'{sql_error}\',$this->sql_err,$text); $text=str_replace(\'{sql_errno}\',$this->sql_errno,$text); $text=str_replace(\'{URL}\',\'http://\'.$_SERVER["HTTP_HOST"].\'/\'.$_SERVER[\'REQUEST_URI\'],$text); $text=str_replace(\'{script}\',$_SERVER[\'SCRIPT_NAME\'],$text); $err=$this->sendmail($from,implode(\',\',$this->email_support),$subj,$text); if($err) return($err); return(0); } // отправка информации об ошибке в support function err_to_support($err=0, $text=\'\') { // загружаем темплейт письма if(!$temp=@file($this->path_blank.\'/mail/err_to_support.txt\')) return(201); // заменяем в темплейте переменные на данные $temp=str_replace(\'{err_num}\',$err,$temp); $temp=str_replace(\'{err_text}\',$text,$temp); // отрезаем subj (первую строку темплейта) $subj=trim($temp[0]); unset($temp[0]); // собираем текст собщения в одну строку $text=implode(\'\',$temp); // отправка сообщения $err=$this->mail_to_support($this->email_robot,$subj,$text); if($err) return($err); return(0); } ?>');?> А теперь пройдемся по тому, что я тут накропал (интересно, это вообще работает или нет?). Функция sendmail() занимается оправкой сообщений, пристегивая нужный header к письму и переворачивая текст из win в koi (если на это указывает переменная-флаг $convert). К данной функции, в итоге, стекаются любые попытки отправить электронное письмо, поэтому в нее можно добавить и механизм регистрации исходящей корреспонденции, записывая в базу данных или в файл такие данные как: кому, когда и что было отправлено. Функция mail_to_user(), как это видно из названия, отвечает за отправку сообщений пользователям. Мы пока оставим ее недоделанной, но вполне работоспособной. Функция mail_to_support() - отправка сообщений по адресам, перечисленным в глобальном массиве электронных адресов службы поддержки $this->email_support. В этой функции мы выводим информацию из глобального массива session функцией PHP var_dump(). Мы пока этот массив нигде не объявляли, но я планирую использовать его для работы с пользователем, поэтому включаю его содержимое в информацию о пользователе. Функция err_to_support() подготавливает все необходимые данные и передает их в mail_to_support() для отправки по адресам службы поддержки. Эта функция интересна тем, что в ней мы впервые обращаемся к темплейту - заранее подготовленному тексту письма, который расположен в папке /blank/mail нашего проекта. Файл err_to_support.txt может иметь, например, такой вид:
Сообщение об ошибке #{err_num}
Уважаемый системный администратор проекта slang.ru,
во время выполнения скрипта возникла ошибка!
> основная информация
Номер : {err_num}
Описание: {err_text}
URL : {URL}
файл : {script}
> SQL
запрос : {sql_query}
ошибка : #{sql_errno}
описание: {sql_error}
> пользователь
ID : {user_id}
IP : {user_ip}
info : {user_info}
Дата : {date}
Время: {time}
Это информационное сообщение создано автоматической системой
и ответа не требует!
--
http://kurepin.ru/php/slang.ru/11/
http://slang.ru/
Первая строка - subj письма. В этом файле содержится текстовое оформление и метки вида {текст} которые перед оправкой письма должны быть заменены актуальными данными. Обратите внимание - каждая метка обрабатывается в разных почтовых функциях. Должна быть понятна причина такого разнесения: какие-то данные относятся почти ко всем письмам (присутствуют во всех темплейтах), а какие-то присутствуют в отдельных специализированных темплейтах.
Темплейт загружается в массив строк функцией , затем обрабатываются метки и после всего этого из первого элемента массива (ячейка 0) извлекается строка subj. Затем массив строк объединяется в текст и получившиеся данные передаются функции mail_to_support(). На этом упражнения с почтой можно временно приостановиться и перейти к другой важной функции - user_access(). P.S. Кстати, уже сейчас можно проверить работу механизма обработки ошибок и отправки соответствующих email-сообщений. Для этого достаточно вызвать функцию mysql_run('белиберда'), которая вызовет ошибку выполнения SQL-запроса со всеми интересующими нас последствиями. Попробуем? Я попробовал. Нашел в написанных фрагментах программы кучу опечаток, но, к счастью, легко исправимых. Получилось следующее. brain.php: highlight_string(' require(preg_replace(\'/www$/i\',\'/req\',$_SERVER[\'DOCUMENT_ROOT\']).\'/utils.class\'); // создаем экз. класса $my=new class_utils; // определяем переменные $title=\'slang.ru: тестирование обработки ошибок\'; $stomach=\'stomach.php\'; include($my->path_inc.\'/main.php\'); ?>');?> stomach.php: highlight_string(' После нажатия на [вперед!] будет произведена попытка произвести ошибочный SQL-запрос с целью проверки работоспособности некоторых функций описанных в главах 1-11 книги "". На экран будет выведена информация об ошибке и отчет о произошедшем будет отправлен на указанный email-адрес. if(isset($test)) {?>
Проверяем механизм отправки сообщений об ошибках
// переопределяем email-адрес support-а $my->email_support[0]=$email; // отправляем запрос в БД $err=$my->sql_run(\'bog_znaet_chto\'); if($err) echo \'Ошибка #\'.$err.\': \'.$my->err_report($err); ?> }?> ');?> И вот так это выглядит в работе: .
Быстренько и идем дальше... 10.08.04 |
| реклама на сайте | ||||
|
| copyright ©2000-2002 Ruslan Kurepin |