<?
function MAILBOX(){ if (!is_object($GLOBALS['MAILBOX'])) $GLOBALS['MAILBOX']=new c_mailbox();return($GLOBALS['MAILBOX']);}
class c_mailbox
{   var $server ;
    var $port ;
    var $user ;
    var $pass ;
    var $protokol ;
	var $params ;
	var $in_folder ;
	var $ml ;

	function __construct($options=array())
	{  $this->server=($options['server'])? $options['server']:$GLOBALS['LS_mailbox_server'] ;
	   $this->port=($options['port'])? $options['port']:$GLOBALS['LS_mailbox_port'] ;
	   $this->user=($options['user'])? $options['user']:$GLOBALS['LS_mailbox_login'] ;
	   $this->pass=($options['pass'])? $options['pass']:$GLOBALS['LS_mailbox_pass'] ;
	   $this->in_folder=($options['in_folder'])? $options['in_folder']:$GLOBALS['LS_mailbox_in_folder'] ;
	   $this->protokol=($options['protokol'])? $options['protokol']:$GLOBALS['LS_mailbox_protokol'] ; // pop3 || imap
	   $this->params=($options['params'])? $options['params']:$GLOBALS['LS_mailbox_params'] ; //'/ssl/notls' ;
	//damp_array($this) ;
	}

	function read_mail($options=array())
	{   ob_start() ;
		$this->ml = imap_open("{".$this->server.":".$this->port."/".$this->protokol.$this->params."}".$this->in_folder, $this->user, $this->pass);

		$result=array() ;
	    if ($this->ml)
	    {    $n = imap_num_msg($this->ml);
	         echo date('d.m.Y H:i:s').'<br>' ;
	         echo 'В почтовом ящике '.$n.' писем<br><br>' ;
	         if ($n)
	         {   // формируем массив полученных писем
	             for ($i=1;$i<=$n;$i++)
	             {   // чистаем заголовки письма
	                 $h = imap_header($this->ml, $i);
		             $headerArr = imap_headerinfo($this->ml, $i);
		             //damp_array($headerArr) ;
		             $uid = imap_uid($this->ml, $headerArr->Msgno);
		             $sender=$h->from[0]->mailbox.'@'.$h->from[0]->host ;
		             $personal = $h->from[0]->personal;
		             $s = imap_fetch_overview($this->ml, $uid, FT_UID);
		             $theme = imap_utf8($s[0]->subject);
		             $theme = str_replace("'",'',$theme);
                     echo 'Письмо № '.$i.', от '.$sender.', тема: '.$theme.', отправлено '.$headerArr->MailDate.', размер '.$headerArr->Size.'<br>' ;

		             //damp_array($h) ;

					 $rec_mail=$this->get_mail_by_uid($headerArr->udate,$headerArr->Size  ) ;
		             if (!$rec_mail['pkey'])
		             {   $rec_mail=array() ;
			             $rec_mail['sender']=$sender ;
			             $rec_mail['theme']=$theme ;
                         $rec_mail['send_time']=$headerArr->udate ;
                         $rec_mail['size']=$headerArr->Size ;
		                 // получаем структуру вложения
		                 $structure = imap_fetchstructure($this->ml, $uid, FT_UID);
		                 //damp_array($structure,1,-1) ;
		                 //echo 'parts count='._sizeof($structure->parts).'<br>' ;
				         $rec_mail['Вложение']=array() ;
			             if (_sizeof($structure->parts)) foreach($structure->parts as $indx=>$part)
			             {  if ($part->subtype and $part->bytes)
				            {   $attach_info=$this->extract_finfo_from_part($part,$uid,$indx+1,$theme) ;
                                if ($attach_info['saved_fname'])  $rec_mail['Вложение'][]=$attach_info;
				            }

					        if (isset($part->parts)) foreach($part->parts as $indx2=>$sub_part) if ($sub_part->bytes)
				            {   $attach_info=$this->extract_finfo_from_part($sub_part,$uid,($indx+1).'.'.($indx2+1),$theme) ;
                                if ($attach_info['saved_fname'])  $rec_mail['Вложение'][]=$attach_info;
				            }
		                 } else echo 'В письме вложений не обнаружено<br>' ;
				         $this->reg_mail($rec_mail) ;
		                 $result[]=$rec_mail ;
				         echo '<br>' ;
		             } else echo 'Письмо уже загружено<br>' ;
					// тут можно письмо удалить
                    imap_delete($this->ml,$uid,FT_UID);

		             echo '<br>';
	             }

                imap_expunge($this->ml); // удалили
	            // print_2x_arr($result) ;
	     }
	   }
	    else echo 'Не удалось подключиться к почтовому ящику'  ;
		print_2x_arr($result) ;
	    $text=ob_get_clean() ;
	    if (_sizeof($result)) LOGS()->reg_log('read_mail','',array('save_to_file'=>$text,'_data'=>$result)) ;
	    echo $text ;
	//
	  return($result) ;
	}

	function extract_finfo_from_part($part,$uid,$indx,$theme)
	{    $arr_images=array() ;
		 //damp_array($part,1,-1) ;
		 //echo 'Обработка вложения в разделе '.$indx.'<br>' ;
		 //echo 'Тип вложения '.$part->subtype.'<br>' ;
		 $att_type  = $part->subtype;
		 //print_r($part->parameters) ;
		 //print_r($part->dparameters) ;
         //if ($part->ifdparameters == 1)    $file_name = imap_utf8($part->dparameters[0]->value);
         //else                               $file_name = imap_utf8($part->parameters[0]->value);
         // удаляем кавычки
         //$file_name = str_replace("'",'',$file_name);
         //$file_name = str_replace("utf-8",'',$file_name);
         //$file_name = urldecode($file_name);
         // удаляем странный символ, заменяющий Й (т.к. Й заменяется на И возврат назад и `)
         //$file_name = iconv('UTF-8','cp1251//ignore',$file_name);
         //$file_name = iconv('cp1251','UTF-8',$file_name); // из хитрой й получается и, что не есть хорошо, но пока сойдет
		 switch($theme)
		 { case 'СКУД Nedap': $ext='csv' ; break ;
		   default: $ext=strtolower($part->subtype)  ;
		 }
 if (stripos($ext,'spreadsheet')!==false) $ext='ods' ;
		 if ($ext=='plain') $ext='txt' ;

		 $file_name='file_'.$uid.'.'.$ext;
         $finfo=array() ;
         $finfo['uid']=$uid ;
         $finfo['type']=$part->subtype ;
         $finfo['name']=$file_name ;
         $finfo['type']=$att_type ;
		 //echo 'Имя файла "'.$file_name.'"<br>' ;

         $attach_64 = imap_fetchbody($this->ml, $uid, $indx, FT_UID);     // при отправке со mail.ru
         $attach = imap_base64($attach_64);
		 $attach = removeBOM($attach) ;
         $finfo['bytes']=$part->bytes ;
         $finfo['bytes_attachment']=strlen($attach_64) ;
		 //echo 'Размер вложения по заголовку: '.$part->bytes.' байт<br>' ;
		 //echo 'Извлеченный размер вложения: '.$finfo['bytes_attachment'].' байт<br>' ;
         if ($finfo['bytes_attachment'])
         {   $finfo['size']=show_size(strlen($attach)) ;
             $saved_file_name=ENGINE()->get_rand_string(32).'_'.safe_file_names($file_name)  ;
	         $saved_file_dir=_TEMP_DIR.'uploads/'.$saved_file_name ;
	         if (file_put_contents($saved_file_dir, $attach))
             {   // файл сохранён, обрабатываем дальше
                 $finfo['source_fname']=$file_name ;
                 $finfo['saved_fname']=$saved_file_dir ;

	             echo 'Вложение сохранено в : <a href="'._PATH_TO_SITE.'/temp/uploads/'.$saved_file_name.'" target="_blank">'.$saved_file_name.'</a>, размер файла '.$finfo['size'].'<br>' ;
	             echo 'Проверка чтения сохраненного файла<br>' ;
	             $cont=file_get_contents($saved_file_dir) ;
	             if ($cont) echo 'Файл успешно прочитан, размер файла <strong>'.show_size(strlen($cont)).'</strong><br>' ;
	             else echo '<div class=alert>Не удалось прочитать сохраненный файл</div>' ;
             }
         }
         else
         { $finfo['error']='Реальный размер вложения не соответствует размеру в заголовке' ;
	       echo 'Реальный размер вложения не соответствует размеру в заголовке<br>' ;
         }
		//damp_array($finfo) ;
		return($finfo) ;
	}

	// регистрация входящей почты
	function reg_mail($rec_mail)
	{
	   $id=adding_rec_to_table('obj_site_inmail',array('parent'=>1,
			                                       'clss'=>273,
			                                       'obj_name'=>$rec_mail['theme'],
			                                       'size'=>$rec_mail['size'],
			                                       'send_time'=>$rec_mail['send_time'],
			                                       'sender'=>$rec_mail['sender'],
			                                       'message_uid'=>$rec_mail['message_uid']
			   ))   ;

	if (_sizeof($rec_mail['Вложение'])) foreach($rec_mail['Вложение'] as $att)
		adding_rec_to_table('obj_site_inmail_attach',array('parent'=>$id,
					                                       'clss'=>274,
					                                       'obj_name'=>$att['name'],
					                                       'type'=>$att['type'],
					                                       'bytes'=>$att['bytes'],
					                                       'saved_fname'=>$att['saved_fname']
					   ))   ;


	}

	function get_mail_by_uid($send_time,$size)
	{ if (!$send_time) $send_time=0 ;
	  if (!$size) $size=0 ;
	  $rec=execSQL_van('select pkey from obj_site_inmail where send_time='.$send_time.' and size='.$size) ;
	  return($rec) ;
	}

	// асинхронная отправка почты
	function send_turn_mail()
	{
		MAILS()->exec_asyns_turn() ;
	}

}

//---------------------------------------------------------------------------------------------------------------------
//
// класс - отправка писем с сайта
//
//---------------------------------------------------------------------------------------------------------------------

function MAILS(){ if (!is_object($GLOBALS['MAILS'])) $GLOBALS['MAILS']=new c_mail_system();return($GLOBALS['MAILS']);}
function _send_mail($senders,$theme,$text,$options=array()) { return(MAILS()->send_mail($senders,$theme,$text,$options)) ; }

// !!! в дальнейшем соеденить оба класса в один
class c_mail_system
{
   function __construct($options=array())
 	{  $this->table_name=($options['table_name'])? $options['table_name']:TM_MAILS ;
       $this->tkey=$_SESSION['pkey_by_table'][$this->table_name] ;
    }

  // отправка почты
  // для отправки почты через smtp от определенного аккаунта указать в $options['from_email'] emal отправителя - будет использована его запись для отправки почты
  function send_mail($senders,$theme,$text,$options=array())
  { if (!$senders) return ;
    $evt_id=0 ;
    if (!$options['from_email'] and $options['use_email']) $options['from_email']=$options['use_email'] ;
    if (!$options['from_email'])                           $options['from_email']=$GLOBALS['LS_smtp_login'] ;
    $options['html']=1 ;

    if (!is_object($_SESSION['mailer_system'])) $options['use_turn']=0 ; // не ставим в очередь, если нет системы рассылки

    $arr_senders=explode(',',$senders) ;
    if (_sizeof($arr_senders)) foreach($arr_senders as $to) if (trim($to))
    {   $to=trim($to) ;
        // если _ASYNC_SEND_MAIL - ставим в очередь асинхронной рассылки
        if (_ASYNC_SEND_MAIL and !$options['no_asyns_send_mail'] and 0) $res=$this->add_mail_to_asyn_turn($to,$options['from_email'],$theme,$text,$options) ;
        else
    {   if (!$options['check_only'])
        {  list($res,$method,$from)=$this->sdf_email($to,$theme,$text,$options) ;
           $res_text=($res=='ok')? 'Отправка e-mail':'Не удалось отправить e-mail';
           $res_alert=($res=='ok')? '<span class="green bold">OK</span>':'<span class=red>'.$res.'</span> ('.$method.')' ;
	       // регистрируем событие 'отправка почты'
               $comment='От <strong>'.$from.'</strong> к <strong>'.$to.'</strong> с темой "'.$theme.'" : '.$res_alert ;
               if ($options['debug_mail']==1) echo 'Отправка почты:'.$comment.'<br>' ;
               if ($options['no_asyns_send_mail']) $comment.=' [async]' ;
	       // дописываем сообщение о отправке в существующее событие
               if ($options['use_event_id'])  _event_comment($options['use_event_id'],$res_text.' '.$comment,array('no_fixed_time'=>1)) ;
               else if ($evt_id) _event_comment($evt_id,$res_text.' '.$comment,array('no_fixed_time'=>1)) ;
               else if ($options['reg_events']) $evt_id=_event_reg($res_text,$comment,$options['events_reffer_obj']) ;  // все отправки писем в одно событие
        }
        else $res='ok' ;
    }

    }
    return($res) ;
  }

  // отправка email как html
  function send_html_mail($to,$theme,$html,$options=array())
    { $options['html']=1 ;
      $res=$this->send_mail($to,$theme,$html,$options) ;
      return($res) ;
	}

  //http://phpmailer.worxware.com/
  function sdf_email($to,$theme_mail,$text,$options)
    {  global $debug_mails ;
       $list_img_path=array() ; $img_src_cid=array() ;
       if ($debug_mails) $options['debug']=$debug_mails ;
        /*if ($options['debug']){?><h3>PHPmailer debug</h3><?}*/

        $send_method=($GLOBALS['LS_smtp_server'])? 'smtp':'sendmail' ;
        $fromEmail=($options['from_email'])? $options['from_email']:$_SESSION['default_email_from']; // email, от кого письмо

        //$default_account=$_SESSION['email_accounts'][$_SESSION['default_email_from']] ;
        //$cur_account=$_SESSION['email_accounts'][$fromEmail] ;
        /*$account=(_sizeof($cur_account))? $cur_account:$default_account ;
        if (_sizeof($options['account'])) $account=$options['account'] ;
        if ($options['debug']==2)
        { echo 'Использован аккаунт:'  ;
          damp_array($account,1,-1) ;

        } */

        //$fromName=$options['from_name']; // имя, от кого письмо
        //if (!$fromName) $fromName=$account['from_name'] ;

        if ($options['nl2br']) $text=nl2br($text) ;

        // если исходные данные в win1251, перекодируем в utf-8
        /*if ($GLOBALS['mail_options']['cp1251'])// если требуется кодировка cp1251
         {  $theme_mail=iconv('windows-1251','utf-8',$theme_mail);// кодируем заголовок
            $text=iconv('windows-1251','utf-8',$text);// кодируем сам текст
            $fromName=iconv('windows-1251','utf-8',$fromName);// кодируем сам текст
         }*/

       // проверяем наличие изображений в тексте
        $arr_img=pc_image_extractor($text) ;
        if (_sizeof($arr_img)) foreach($arr_img as $i=>$rec) if (strpos($rec[0],'http')!==false) unset($arr_img[$i]) ;
        //damp_array($arr_img) ;
        if (_sizeof($arr_img))
        { // собираем массив изображений без повторов - для этого имя изображения в индекс
          foreach($arr_img as $i=>$rec)  $list_img_path[$rec[0]]='cid:img_'.$i ;
          $list_img_path=array_flip($list_img_path) ;
          if (_sizeof($list_img_path)) foreach($list_img_path as $id=>$img_path) $img_src_cid[$id]=convert_path_to_dir($img_path) ;
          // заменяем src изображений на cid
          $text=str_replace($list_img_path,array_keys($list_img_path),$text) ;
          if ($options['debug']==3) damp_array($img_src_cid,1,-1) ;
          $options['html']=1 ;
          }

        if ($options['html'] and !$options['no_append_css'])
        {  // добавляем файл стилей в текст
           $css_file_name=($options['css_file_name'])? $options['css_file_name']:'/style_emails.css' ;
           if (file_exists(_DIR_TO_ROOT.$css_file_name)) $text='<style type="text/css">'.file_get_contents(_DIR_TO_ROOT.$css_file_name).'</style>'.$text ;
           else
           { $css_file_name='/assets/style_emails.css' ;
             if (file_exists(_DIR_TO_ROOT.$css_file_name)) $text='<style type="text/css">'.file_get_contents(_DIR_TO_ROOT.$css_file_name).'</style>'.$text ;
           }
        }

       if ($options['debug']==3) damp_array($options,1,-1) ;
       /*if ($options['debug']){?><textarea cols=150 rows=12><?echo $text?></textarea><?}*/

       if (_PHP_MAILER_=='PHPMailer_v5.1')
       { require_once(_DIR_TO_ENGINE.'/'._ADDONS_.'/'._PHP_MAILER_.'/class.phpmailer.php');// подгружаем основную библиотеку
         require_once(_DIR_TO_ENGINE.'/'._ADDONS_.'/'._PHP_MAILER_.'/class.pop3.php');// подгружаем POP3 библиотеку
       }
       else require_once(_DIR_TO_ENGINE.'/'._ADDONS_.'/'._PHP_MAILER_.'/PHPMailerAutoload.php');// подгружаем основную библиотеку

       $mail=new PHPMailer();// создаем объект
       $mail->CharSet='utf-8';// выставляем с какой кодировкой работать
       $mail->Encoding='quoted-printable';//
       $mail->Body=$text;// вставляем текст
       $mail->From=$GLOBALS['LS_smtp_from'];// от кого отправлять письмо
       $mail->AddAddress($to); // от кого письмо
       $mail->FromName=$GLOBALS['LS_smtp_from_name']; // От кого представиться
       $mail->Subject=$theme_mail;// устанавливаем тему письма

       if (_sizeof($options['cc'])) foreach($options['cc'] as $email=>$name)
       { $mail->AddCC($email,$name);
         if ($options['debug']) echo 'Копия: '.$name.' ['.$email.']<br>' ;
       }

       if ($options['debug']==2) $mail->Subject.=' ('.$send_method.')' ;
       //$arr_to=explode(',',$send_to) ;
       //if (_sizeof($arr_to))
       //{ foreach($arr_to as $to) if (trim($to)) $mail->AddAddress(trim($to));
       //  if ($options['debug'] or $debug_mails) echo 'Добавлен адресат:'.$to.'<br>' ;
       //} // добавляем адрес, кому отправляем письмо - каждый адрес отдельно
       //$_to=$send_to ;
       //--------------- готовим даннные для SMTP авторизации

       if ($send_method=='smtp') // если отправка почты идет через SMTP
       { // получаем параметры SMTP для указанного аккаунта, если их нет - используем для отправки аккаунт по умолчанию
         $mail->IsSMTP();// устанавливаем флаг, что будем использовать SMTP авторизацию
         $mail->SMTPAuth=($GLOBALS['LS_smtp_auth_use'])?true:false;// требуется применить, только SMTP идентификацию при отправке
         $mail->Host=$GLOBALS['LS_smtp_server'];// прописываем server / host для отправления
         $mail->Port=$GLOBALS['LS_smtp_port'];// прописываем port для отправления
         $mail->Username=$GLOBALS['LS_smtp_login'];// SMTP логин
         $mail->Password=$GLOBALS['LS_smtp_pass'];// SMTP пароль
         $mail->SMTPSecure=$GLOBALS['LS_smtp_secure'];// SSL
         $mail->From=$GLOBALS['LS_smtp_from'];// от кого отправлять письмо - только от логина, иначе не уйдет
           $mail->SMTPDebug = 2;
           $mail->Debugoutput = 'html';
           //$mail->Port='465' ; $mail->SMTPSecure='ssl';

        $debug = '';
        //$mail->Debugoutput = function($str, $level) {
        //    $GLOBALS['debug'] .= "$level: $str\n";
        //}
        //...later


         $method='SMTP' ;
       } else $method='sendmail' ;

       //damp_array($mail,1,-1) ;

       if ($options['html']==1) { $mail->IsHTML(true); }// если письмо нужно отправлять в HTML формате

        //--------------- добавляем файловые вложения
        if (_sizeof($options['files'])) foreach($options['files'] as $fname) $mail->AddAttachment($fname,basename($fname)) ;

       //--------------- добавляем внедренные изображения
       if (_sizeof($img_src_cid)) foreach ($img_src_cid as $cid=>$src)
       {  $id=str_replace('cid:','',$cid);
          $name=basename($src) ;
          $type="image/jpg" ;
          //$type="" ;
          $mail->AddEmbeddedImage($src,$id,$name,"base64",$type) ;
	     }

       //damp_array($mail->GetAttachments()) ;
      if ($options['debug'] or $debug_mails) echo '<strong>Попытка отправки письма</strong>: на адрес - <strong>' .$to.'</strong> от <strong>'.$mail->From.'</strong> ('.$send_method.')<br>' ;
      //if ($debug==2 or $debug_mails==2) { echo '<strong>Опции:</strong><br>' ; damp_array($options,1,-1) ;  echo '<strong>Содержание письма:</strong><br>' .$text.'<br>' ; }

       ob_start() ;
           try { $mail->Send();// отправляем письмо
               }
           catch (phpmailerException $e) { $error_text=$e->errorMessage(); } //Pretty error messages from PHPMailer
           catch (Exception $e) { $error_text=$e->getMessage(); } //Boring error messages from anything else!
       ob_get_clean() ;
       $res=($mail->ErrorInfo!="")? $mail->ErrorInfo:'ok' ;
       //if (strpos($res,'Data not accepted')!==false) $res='ok' ;
       if ($options['debug'])
       { if ($res!='ok') echo '<div class="red bold">'.$res.'<br>'.$error_text.'</div><br>' ;
         else            echo '<div class="green bold">'.$res.'</div><br>' ;
       }
       if ($options['debug']==2)
       { ob_start() ;
            damp_array($mail,1,-1) ;
         $text=ob_get_clean() ;
         if ($GLOBALS['mail_options']['cp1251']) $text=iconv('utf-8','windows-1251',$text);// кодируем сам текст
         echo $text ;
           echo $debug;
       }
       return(array($res,$method,$mail->From)) ;
	     }


  function send_mail_to_pattern($to,$pattern,$vars=array(),$options=array())
  { if (!$vars['site_name'])          $vars['site_name']=$GLOBALS['LS_public_site_name'] ;
    if (!$vars['site_name'])          $vars['site_name']=_MAIN_DOMAIN ;
    if (!$vars['IP'])                 $vars['IP']=IP ;
    if (!$vars['mail_bottom_podpis']) $vars['mail_bottom_podpis']=$GLOBALS['LS_mail_bottom_podpis'] ;

    $obj_info=execSQL_van("select * from ".$this->table_name." where kod='".$pattern."' and enabled=1") ;
	if ($obj_info['value'])
    {  $theme=$this->replace_pattern_array_values($obj_info['theme'],$vars) ;
       if ($options['theme']) $theme=$options['theme'] ;
       $value='<body class=mail>'.$this->replace_pattern_array_values($obj_info['value'],$vars).'</body>' ;
  	   $options['nl2br']=($obj_info['is_HTML']==1)? 0:1 ;
       $options['html']=1 ;
       $this->send_mail($to,$theme,$value,$options) ;
	}
    else
    { if ($options['use_event_id'])  _event_comment($options['use_event_id'],'<span class=red>Уведомление не оптравлено:</span> Не найден шаблон "'.$pattern.'"',array('no_fixed_time'=>1)) ;
      userErrorHandler(1,'Обращение к несуществующему шаблону письма: '.$pattern,'',0) ;
    }
  }

  function get_mail_to_pattern($pattern,$vars=array(),$options=array())
    { $obj_info=execSQL_van("select * from ".$this->table_name." where kod='".$pattern."' and enabled=1") ;
      if ($obj_info['value'])
      {  $theme=$this->replace_pattern_array_values($obj_info['theme'],$vars) ;
         $value=$this->replace_pattern_array_values($obj_info['value'],$vars) ;
         //$value='<body class=mail>'.$this->replace_pattern_array_values($obj_info['value'],$vars).'</body>' ;
         return(array($theme,$value)) ;
      } else return(array()) ;
    }

  // возвращаем список шаблонов, найдеты в тексте $value
  function get_pattern_list($value)
  { preg_match_all('/\/\*(.+?)\*\//is', $value,$matches,PREG_SET_ORDER) ;
    if (_sizeof($matches)) foreach($matches as $match) $res[]=$match[1]  ;
    $res=array_unique($res) ;
    return($res) ;
  }

  // заменяем шаблоны переменных в тексте $value на их глобальные значения
  function replace_pattern_global_values(&$value)
  { preg_match_all('/\/\*(.+?)\*\//is', $value,$matches,PREG_SET_ORDER) ;
    if (_sizeof($matches)) foreach($matches as $match)
	  	  { if ($GLOBALS[${$match[1]}]) $value=str_replace($match[0],$GLOBALS[${$match[1]}],$value) ;
            if ($_SESSION[${$match[1]}]) $value=str_replace($match[0],$_SESSION[${$match[1]}],$value) ;

	  	  }
  }

  // заменяем шаблоны переменных в тексте $value на  значения из массива
  function replace_pattern_array_values($value,$vars)
  { preg_match_all('/\/\*(.+?)\*\//is', $value,$matches,PREG_SET_ORDER) ;
    if (_sizeof($matches)) foreach($matches as $match)
	  	  { if ($vars[$match[1]]) $value=str_replace($match[0],$vars[$match[1]],$value) ;
	  	  }
	return($value);
	//echo 'value='.$value.'<br>' ;
  }


  // добавляем задание в очередь - это функция будет вызываться mail_system
  function add_mail_to_asyn_turn($to,$from_email,$theme,$text,$options)
  { global  $events_system ;
    $to=str_replace(array(',',';',' '),'',$to) ;
    $from_email=str_replace(array(',',';',' '),'',$from_email) ;
    $id=adding_rec_to_table_fast(TM_MAIL_TURN,array('parent'=>1,'clss'=>34,'indx'=>0,'mail_to'=>$to,'mail_from'=>$from_email,'obj_name'=>$theme,'value'=>$text,'options'=>serialize($options)),array('debug'=>0)) ;
    $_SESSION['send_turn_mail']=1 ; //  асинхронная отправка почты через AJAX при следующей загрузке страницы
    if ($options['debug']) echo 'Письмо добавлено в очередь отправки,$id='.$id.'<br>' ;
    return('set_to_asyns_turn') ;
  }

  function exec_asyns_turn()
  {   if (!$GLOBALS['LS_mailer_email_max_count']) $GLOBALS['LS_mailer_email_max_count']=20 ;   // максмимально число писем, отправляемое за раз
      if (!$GLOBALS['LS_mailer_max_send_cnt'])    $GLOBALS['LS_mailer_max_send_cnt']=3 ;       // число попыток отправки писем
      if ($_GET['debug'])                          $GLOBALS['LS_mailer_email_max_count']=1 ;
      $comment='' ;
      {  // получаем неотправленные письма, число попыток отправок которых менее 6
         $cnt_mail_to_send=execSQL_value('select count(pkey) from '.TM_MAIL_TURN.' where clss=34 and enabled=1 and (temp=0 or temp is null) and indx<'.$GLOBALS['LS_mailer_max_send_cnt']) ;
         if ($cnt_mail_to_send)
          {       $cnt_send=0 ; $cnt_non_send=0 ;
                  if ($_GET['debug']) echo 'В очереди на отправку <strong>'.$cnt_mail_to_send.'</strong> писем<br>' ;
                  //for($i=1;$i<=$GLOBALS['LS_mailer_email_max_count'];$i++)
                  for($i=1;$i<=$cnt_mail_to_send;$i++)
                  {   $rec=execSQL_van('select * from '.TM_MAIL_TURN.' where clss=34 and enabled=1 and indx<'.$GLOBALS['LS_mailer_max_send_cnt'].' and (temp=0 or temp is null) order by r_data limit 1') ; //r_data - чтобы письма, которые не получилось отправить, попадали в конец очереди
                      if ($rec['pkey'])
                      { update_rec_in_table(TM_MAIL_TURN,array('temp'=>1),'pkey='.$rec['pkey']) ; // сразу помечаем запись, чтобы не взял другой AJAX
                        if ($rec['options']) $options=unserialize($rec['options']) ; else $options=array() ;
                        $options['debug']=($_GET['debug'])? 1:0  ;
                        $options['no_asyns_send_mail']=1 ;
                        $res=$this->send_mail($rec['mail_to'],$rec['obj_name'],$rec['value'],$options) ;
                            if ($res=='ok') { update_rec_in_table(TM_MAIL_TURN,array('enabled'=>0,'value'=>'','indx'=>$rec['indx']+1,'error'=>0,'send_result'=>'ok'),'pkey='.$rec['pkey']) ; $cnt_send++ ;
                                              $comment.=$rec['mail_to'].' :<span class=green>'.strip_tags($res).'</span><br>' ;
                                            }
                                else        { update_rec_in_table(TM_MAIL_TURN,array('indx'=>$rec['indx']+1,'error'=>1,'temp'=>0,'send_result'=>strip_tags($res)),'pkey='.$rec['pkey']) ;  // обновиться r_data, письмо встанет в конец очереди
                                              $cnt_non_send++ ;
                                              $comment.=$rec['mail_to'].' :<span class=red>'.strip_tags($res).'</span><br>' ;
                                            }
                      }
                  }
                 _event_reg('Асинхронная отправка почты',$comment) ;
          } else echo 'Очередь рассылки пуста' ;

      }
	}

}

?>
