Exemple #1
0
 public function send(array $events)
 {
     $eventsCount = count($events);
     if ($eventsCount == 0) {
         return;
     }
     $mailer = Yii::app()->mailer;
     $mailer->init();
     for ($i = 0; $i < $eventsCount; $i++) {
         $curEvent = $events[$i];
         $mailAccount = $curEvent->eventType->mailAccount;
         $mailerTransport = $mailer->getTransport()->setHost($mailAccount->host);
         if ($mailAccount->getIsNeedAuthorize()) {
             //нужна авторизация на сервере
             $mailerTransport->setUsername($mailAccount->user_name)->setPassword($mailAccount->user_password);
         } else {
             $mailerTransport->setUsername(null)->setPassword(null);
         }
         $eventsProcess = $curEvent->getEventsProcess();
         $eventsProcessCount = count($eventsProcess);
         for ($k = 0; $k < $eventsProcessCount; $k++) {
             $curEventProcess = $eventsProcess[$k];
             $mailMessage = new YiiMailMessage();
             $mailMessage->setTo($curEventProcess->email);
             $mailMessage->setSubject($curEvent->subject);
             $messageContent = '';
             if ($curEvent->event_message === null) {
                 $ncEvent = new NotifierComponentEvent($this, $curEvent, $curEventProcess, $mailMessage);
                 $this->onEmptyMessage(new NotifierComponentEvent($this, $curEvent, $curEventProcess, $mailMessage));
                 if ($mailMessage->getBody() == null && empty($ncEvent->params['messageContent'])) {
                     $curEventProcess->saveAsSent();
                     continue;
                 } elseif (!empty($ncEvent->params['messageContent'])) {
                     $messageContent = $ncEvent->params['messageContent'];
                 }
             } else {
                 $messageContent = $curEvent->event_message;
             }
             if ($mailMessage->getFrom() == null) {
                 //если не указан отправитель, то берем из настроек аккаунта
                 if (!empty($mailAccount->from_name)) {
                     $mailMessage->setFrom(array($mailAccount->email_from => $mailAccount->from_name));
                 } else {
                     $mailMessage->setFrom($mailAccount->email_from);
                 }
             }
             //если тема не указана, то в качестве темы устанавливаем название типа события
             if ($mailMessage->getSubject() == null) {
                 $mailMessage->setSubject($curEvent->eventType->name);
             }
             //Если есть что прикреплять
             if (!empty($messageContent)) {
                 $eventFormat = $curEventProcess->eventSubscriber->eventFormat;
                 switch ($eventFormat->place) {
                     case NotifierEventFormat::PLACE_TEXT:
                         $mailMessage->setBody($messageContent, $eventFormat->name == NotifierEventFormat::TYPE_HTML ? 'text/html' : 'text/plain');
                         break;
                     case NotifierEventFormat::PLACE_ATTACHMENT:
                         $fileName = $eventFormat->file_name;
                         if ($curEventProcess->eventSubscriber->getIsArchiveAttachment()) {
                             //TODO Архивируем вложение
                         }
                         //TODO Добавляем файл в аттач
                         break;
                 }
             }
             if (!$this->onBeforeSend(new NotifierComponentEvent($this, $curEvent, $curEventProcess, $mailMessage))) {
                 continue;
             }
             $errorMessage = false;
             try {
                 if ($mailer->send($mailMessage, $failures)) {
                     $curEventProcess->saveAsSent();
                 } else {
                     $errorMessage = sprintf("Ошибка при отправке почты:\n %s", print_r($failures, true));
                 }
             } catch (Exception $e) {
                 $errorMessage = $e->getMessage();
             }
             if ($errorMessage) {
                 Yii::log($errorMessage, CLogger::LEVEL_ERROR, 'mail.notifier.send');
             }
         }
         // endfor $eventProcess
     }
     // endfor $events
 }