А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/slang.ru/11/
Rambler's Top100
Строим сайт slang.ru, глава 11

Строим сайт slang.ru

Глава 11. почтовые функции, первое тестирование

Раз уж мы вызываем функцию err_to_support(), то давайте сразу и распишем ее.

Очевидно, что отправка почтовых сообщений нам понадобится в разных ситуациях, поэтому желательно сразу продумать всю структуру функций отправки электронных писем.

Я предлагаю следующие функции:

<?   // отправка собщения   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 письма.

В этом файле содержится текстовое оформление и метки вида {текст} которые перед оправкой письма должны быть заменены актуальными данными. Обратите внимание - каждая метка обрабатывается в разных почтовых функциях. Должна быть понятна причина такого разнесения: какие-то данные относятся почти ко всем письмам (присутствуют во всех темплейтах), а какие-то присутствуют в отдельных специализированных темплейтах.

Примечание: рекомендую почтовые темплейты создавать так, чтобы в каждой строке текста было не более 72 символов. Если это правило не соблюсти, некоторые почтовые клиенты будут сами производить перенос строк, что может негативно сказаться на внешнем виде писем.

Темплейт загружается в массив строк функцией file(), затем обрабатываются метки и после всего этого из первого элемента массива (ячейка 0) извлекается строка subj.

Затем массив строк объединяется в текст и получившиеся данные передаются функции mail_to_support().

На этом упражнения с почтой можно временно приостановиться и перейти к другой важной функции - user_access().

P.S. Кстати, уже сейчас можно проверить работу механизма обработки ошибок и отправки соответствующих email-сообщений. Для этого достаточно вызвать функцию mysql_run('белиберда'), которая вызовет ошибку выполнения SQL-запроса со всеми интересующими нас последствиями. Попробуем?

Я попробовал. Нашел в написанных фрагментах программы кучу опечаток, но, к счастью, легко исправимых. Получилось следующее.

brain.php:

<?  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:

<div align=left> <form action="./" method="post"> Ваш email:<br> <input type="text" name="email"><input type="submit" name="test" value="вперед!"><br> </form> <br> После нажатия на [вперед!] будет произведена попытка произвести ошибочный SQL-запрос с целью проверки работоспособности некоторых функций описанных в главах 1-11 книги "<a href=http://kurepin.ru/php/slang.ru/>Строим сайт slang.ru</a>".<br> <br> На экран будет выведена информация об ошибке и отчет о произошедшем будет отправлен на указанный email-адрес.<br> <br>  </div> <br><br><br><br> <? if(isset($test)) {?> <div align=center> <b>Проверяем механизм отправки сообщений об ошибках</b><br> </div> <br> <br> <? // переопределяем email-адрес support-а $my->email_support[0]=$email; // отправляем запрос в БД $err=$my->sql_run('bog_znaet_chto'); if($err) echo 'Ошибка #'.$err.': '.$my->err_report($err); ?> <?}?> <br><br><br><br><br>


И вот так это выглядит в работе: http://11.tutorial.slang.ru/test/err_report/.

Примечание: Ввод email-адреса я сделал по двум причинам: первое - даю вам возможность получить email-отчет об ошибке; второе (и главное) - защищаю свои адреса от наплыва репортов после ваших посещений этой страницы.

Быстренько тестируем и идем дальше...





[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin