Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
79.79% covered (warning)
79.79%
75 / 94
20.00% covered (danger)
20.00%
1 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
Notification
79.79% covered (warning)
79.79%
75 / 94
20.00% covered (danger)
20.00%
1 / 5
27.37
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 initQueueTransmission
90.00% covered (success)
90.00%
18 / 20
0.00% covered (danger)
0.00%
0 / 1
8.06
 sendQueueItem
94.12% covered (success)
94.12%
16 / 17
0.00% covered (danger)
0.00%
0 / 1
5.01
 getValidMailer
84.21% covered (warning)
84.21%
16 / 19
0.00% covered (danger)
0.00%
0 / 1
4.06
 readMailer
56.67% covered (warning)
56.67%
17 / 30
0.00% covered (danger)
0.00%
0 / 1
5.30
1<?php
2
3/**
4 *
5* @package Zmsmessaging
6*
7*/
8
9namespace BO\Zmsmessaging;
10
11use BO\Zmsentities\Ics;
12use BO\Zmsentities\Mimepart;
13use PHPMailer\PHPMailer\PHPMailer;
14use PHPMailer\PHPMailer\Exception as PHPMailerException;
15
16class Notification extends BaseController
17{
18    protected $messagesQueue = null;
19
20    public function __construct($verbose = false, $maxRunTime = 50)
21    {
22        parent::__construct($verbose, $maxRunTime);
23        $this->log(
24            "Read Notification QueueList start with limit " . \App::$mails_per_minute . " - " . \App::$now->format('c')
25        );
26        $queueList = \App::$http->readGetResult('/notification/')->getCollection();
27        if (null !== $queueList) {
28            $this->messagesQueue = $queueList->sortByCustomKey('createTimestamp');
29            $this->log("QueueList sorted by createTimestamp - " . \App::$now->format('c'));
30        }
31    }
32
33    public function initQueueTransmission($action = false)
34    {
35        $resultList = [];
36        if ($this->messagesQueue && count($this->messagesQueue)) {
37            foreach ($this->messagesQueue as $item) {
38                if ($this->maxRunTime < $this->getSpendTime()) {
39                    $this->log("Max Runtime exceeded - " . \App::$now->format('c'));
40                    break;
41                }
42                try {
43                    $resultList[] = $this->sendQueueItem($action, $item);
44                } catch (\Exception $exception) {
45                    $log = new Mimepart(['mime' => 'text/plain']);
46                    $log->content = $exception->getMessage();
47                    if (isset($item['process']) && isset($item['process']['id'])) {
48                        $this->log("Init Queue Exception message: " . $log->content . ' - ' . \App::$now->format('c'));
49                        $this->log("Init Queue Exception log readPostResult start - " . \App::$now->format('c'));
50                        \App::$http->readPostResult('/log/process/' . $item['process']['id'] . '/', $log, ['error' => 1]);
51                        $this->log("Init Queue Exception log readPostResult finished - " . \App::$now->format('c'));
52                    }
53                    \App::$log->error($log->content);
54                }
55            }
56        } else {
57            $resultList[] = array(
58                'errorInfo' => 'No notification entry found in Database...'
59            );
60        }
61        return $resultList;
62    }
63
64    public function sendQueueItem($action, $item)
65    {
66        $result = [];
67        $entity = new \BO\Zmsentities\Notification($item);
68        $mailer = $this->getValidMailer($entity);
69        if (! $mailer) {
70            throw new \Exception("No valid mailer");
71        }
72        $result = $this->sendMailer($entity, $mailer, $action);
73        if ($result instanceof PHPMailer) {
74            $result = array(
75                'id' => ($result->getLastMessageID()) ? $result->getLastMessageID() : $entity->id,
76                'recipients' => $result->getAllRecipientAddresses(),
77                'mime' => $result->getMailMIME(),
78                'identification' => $result->FromName,
79                'subject' => $result->Subject
80            );
81            if ($action) {
82                $this->deleteEntityFromQueue($entity);
83            }
84        } else {
85            // @codeCoverageIgnoreStart
86            $result = array(
87                'errorInfo' => $result->ErrorInfo
88            );
89            // @codeCoverageIgnoreEnd
90        }
91        return $result;
92    }
93
94    protected function getValidMailer(\BO\Zmsentities\Notification $entity)
95    {
96        $message = '';
97        $messageId = $entity['id'];
98        try {
99            $mailer = $this->readMailer($entity);
100        // @codeCoverageIgnoreStart
101        } catch (PHPMailerException $exception) {
102            $message = "Message #$messageId PHPMailer Failure: " . $exception->getMessage();
103            \App::$log->warning($message, []);
104        } catch (\Exception $exception) {
105            $message = "Message #$messageId Failure: " . $exception->getMessage();
106            \App::$log->warning($message, []);
107        }
108        if ($message) {
109            $this->removeEntityOlderThanOneHour($entity);
110            $log = new Mimepart(['mime' => 'text/plain']);
111            $log->content = $message;
112            $this->log("Build Mailer Exception log message: " . $message);
113            $this->log("Build Mailer Exception log readPostResult start - " . \App::$now->format('c'));
114            \App::$http->readPostResult('/log/process/' . $entity->process['id'] . '/', $log, ['error' => 1]);
115            $this->log("Build Mailer Exception log readPostResult finished - " . \App::$now->format('c'));
116            return false;
117        }
118        return $mailer;
119    }
120
121    protected function readMailer(\BO\Zmsentities\Notification $entity)
122    {
123        $config = \App::$http->readGetResult('/config/')->getEntity();
124        $this->testEntity($entity);
125        $sender = $entity->getIdentification();
126        $from = $sender ? $sender : $entity['department']['email'];
127        $mailer = new Mailer(true);
128        $message = trim($entity->getMessage());
129        $mailer->CharSet = 'UTF-8';
130        $mailer->Encoding = 'base64';
131        $mailer->SetLanguage('de');
132        $mailer->SetFrom($from, $sender);
133        $mailer->AddAddress($entity->getRecipient($config->getPreference('notifications', 'smsGatewayUrl')));
134        $mailer->Subject = $message;
135        $mailer->Body = '';
136        $mailer->AllowEmpty = true;
137        $mailer->XMailer = \App::IDENTIFIER;
138
139        if (\App::$smtp_enabled) {
140            $mailer->IsSMTP();
141            $mailer->SMTPAuth = \App::$smtp_auth_enabled;
142            $mailer->SMTPSecure = \App::$smtp_auth_method;
143            $mailer->Port = \App::$smtp_port;
144            $mailer->Host = \App::$smtp_host;
145            $mailer->Username = \App::$smtp_username;
146            $mailer->Password = \App::$smtp_password;
147            if (\App::$smtp_skip_tls_verify) {
148                $mailer->SMTPOptions['ssl'] = [
149                    'verify_peer' => false,
150                    'verify_peer_name' => false,
151                    'allow_self_signed' => true,
152                ];
153            }
154        }
155
156        return $mailer;
157    }
158}