PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Mailer / Methods / MailPoet.php
mailpoet / lib / Mailer / Methods Last commit date
Common 1 year ago ErrorMappers 1 year ago AmazonSES.php 1 year ago MailPoet.php 2 years ago MailerMethod.php 3 years ago PHPMail.php 4 years ago PHPMailerMethod.php 1 year ago SMTP.php 3 weeks ago SendGrid.php 1 year ago index.php 3 years ago
MailPoet.php
187 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Mailer\Methods;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Config\ServicesChecker;
9 use MailPoet\Mailer\Mailer;
10 use MailPoet\Mailer\Methods\Common\BlacklistCheck;
11 use MailPoet\Mailer\Methods\ErrorMappers\MailPoetMapper;
12 use MailPoet\Services\AuthorizedEmailsController;
13 use MailPoet\Services\Bridge;
14 use MailPoet\Services\Bridge\API;
15 use MailPoet\Util\Url;
16
17 class MailPoet implements MailerMethod {
18 public $api;
19 public $sender;
20 public $replyTo;
21 public $servicesChecker;
22
23 /** @var AuthorizedEmailsController */
24 private $authorizedEmailsController;
25
26 /** @var MailPoetMapper */
27 private $errorMapper;
28
29 /** @var BlacklistCheck */
30 private $blacklist;
31
32 /*** @var Url */
33 private $url;
34
35 /** @var Bridge */
36 private $bridge;
37
38 public function __construct(
39 $apiKey,
40 $sender,
41 $replyTo,
42 MailPoetMapper $errorMapper,
43 AuthorizedEmailsController $authorizedEmailsController,
44 Bridge $bridge,
45 Url $url
46 ) {
47 $this->api = new API($apiKey);
48 $this->sender = $sender;
49 $this->replyTo = $replyTo;
50 $this->servicesChecker = new ServicesChecker();
51 $this->errorMapper = $errorMapper;
52 $this->bridge = $bridge;
53 $this->authorizedEmailsController = $authorizedEmailsController;
54 $this->blacklist = new BlacklistCheck();
55 $this->url = $url;
56 }
57
58 public function send($newsletter, $subscriber, $extraParams = []): array {
59 if ($this->servicesChecker->isMailPoetAPIKeyValid() === false) {
60 return Mailer::formatMailerErrorResult($this->errorMapper->getInvalidApiKeyError());
61 }
62
63 $subscribersForBlacklistCheck = is_array($subscriber) ? $subscriber : [$subscriber];
64 foreach ($subscribersForBlacklistCheck as $sub) {
65 if ($this->blacklist->isBlacklisted($sub)) {
66 $error = $this->errorMapper->getBlacklistError($sub);
67 return Mailer::formatMailerErrorResult($error);
68 }
69 }
70
71 $messageBody = $this->getBody($newsletter, $subscriber, $extraParams);
72 $result = $this->api->sendMessages($messageBody);
73
74 switch ($result['status']) {
75 case API::SENDING_STATUS_CONNECTION_ERROR:
76 $error = $this->errorMapper->getConnectionError($result['message']);
77 return Mailer::formatMailerErrorResult($error);
78 case API::SENDING_STATUS_SEND_ERROR:
79 $error = $this->processSendError($result, $subscriber, $newsletter);
80 return Mailer::formatMailerErrorResult($error);
81 case API::RESPONSE_STATUS_OK:
82 default:
83 return Mailer::formatMailerSendSuccessResult();
84 }
85 }
86
87 public function processSendError($result, $subscriber, $newsletter) {
88 if (empty($result['code'])) {
89 return $this->errorMapper->getErrorForResult($result, $subscriber, $this->sender, $newsletter);
90 }
91
92 switch ($result['code']) {
93 case API::RESPONSE_CODE_KEY_INVALID:
94 $this->bridge->invalidateMssKey();
95 break;
96
97 case API::RESPONSE_CODE_CAN_NOT_SEND:
98 if ($result['error'] === API::ERROR_MESSAGE_INVALID_FROM) {
99 $this->authorizedEmailsController->checkAuthorizedEmailAddresses();
100 }
101 break;
102
103 case API::RESPONSE_CODE_PAYLOAD_ERROR:
104 if (!empty($result['error']) && $result['error'] === API::ERROR_MESSAGE_BULK_EMAIL_FORBIDDEN) {
105 $this->authorizedEmailsController->checkAuthorizedEmailAddresses();
106 }
107 break;
108 }
109
110 return $this->errorMapper->getErrorForResult($result, $subscriber, $this->sender, $newsletter);
111 }
112
113 public function processSubscriber($subscriber) {
114 preg_match('!(?P<name>.*?)\s<(?P<email>.*?)>!', $subscriber, $subscriberData);
115 if (!isset($subscriberData['email'])) {
116 $subscriberData = [
117 'email' => $subscriber,
118 ];
119 }
120 return [
121 'email' => $subscriberData['email'],
122 'name' => (isset($subscriberData['name'])) ? $subscriberData['name'] : '',
123 ];
124 }
125
126 public function getBody($newsletter, $subscriber, $extraParams = []) {
127 if (is_array($newsletter) && is_array($subscriber)) {
128 $body = [];
129 for ($record = 0; $record < count($newsletter); $record++) {
130 $body[] = $this->composeBody(
131 $newsletter[$record],
132 $this->processSubscriber($subscriber[$record]),
133 (!empty($extraParams['unsubscribe_url'][$record])) ? $extraParams['unsubscribe_url'][$record] : false,
134 (!empty($extraParams['one_click_unsubscribe'][$record])) ? $extraParams['one_click_unsubscribe'][$record] : false,
135 (!empty($extraParams['meta'][$record])) ? $extraParams['meta'][$record] : false
136 );
137 }
138 } else {
139 $body[] = $this->composeBody(
140 $newsletter,
141 $this->processSubscriber($subscriber),
142 (!empty($extraParams['unsubscribe_url'])) ? $extraParams['unsubscribe_url'] : false,
143 (!empty($extraParams['one_click_unsubscribe'])) ? $extraParams['one_click_unsubscribe'] : false,
144 (!empty($extraParams['meta'])) ? $extraParams['meta'] : false
145 );
146 }
147 return $body;
148 }
149
150 private function composeBody($newsletter, $subscriber, $unsubscribeUrl, $oneClickUnsubscribeUrl, $meta): array {
151 $body = [
152 'to' => ([
153 'address' => $subscriber['email'],
154 'name' => $subscriber['name'],
155 ]),
156 'from' => ([
157 'address' => $this->sender['from_email'],
158 'name' => $this->sender['from_name'],
159 ]),
160 'reply_to' => ([
161 'address' => $this->replyTo['reply_to_email'],
162 ]),
163 'subject' => $newsletter['subject'],
164 ];
165 if (!empty($this->replyTo['reply_to_name'])) {
166 $body['reply_to']['name'] = $this->replyTo['reply_to_name'];
167 }
168 if (!empty($newsletter['body']['html'])) {
169 $body['html'] = $newsletter['body']['html'];
170 }
171 if (!empty($newsletter['body']['text'])) {
172 $body['text'] = $newsletter['body']['text'];
173 }
174 if ($unsubscribeUrl) {
175 $isHttps = $this->url->isUsingHttps($unsubscribeUrl);
176 $body['unsubscribe'] = [
177 'url' => $isHttps && $oneClickUnsubscribeUrl ? $oneClickUnsubscribeUrl : $unsubscribeUrl,
178 'post' => $isHttps,
179 ];
180 }
181 if ($meta) {
182 $body['meta'] = $meta;
183 }
184 return $body;
185 }
186 }
187