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 / AmazonSES.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
AmazonSES.php
250 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Mailer\Methods;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Mailer\Mailer;
9 use MailPoet\Mailer\Methods\Common\BlacklistCheck;
10 use MailPoet\Mailer\Methods\ErrorMappers\AmazonSESMapper;
11 use MailPoet\Util\Url;
12 use MailPoet\WP\Functions as WPFunctions;
13 use PHPMailer\PHPMailer\PHPMailer;
14
15 class AmazonSES extends PHPMailerMethod {
16 /** @var string */
17 public $awsAccessKey;
18 /** @var string */
19 public $awsSecretKey;
20 /** @var string */
21 public $awsRegion;
22 /** @var string */
23 public $awsEndpoint;
24 /** @var string */
25 public $awsSigningAlgorithm;
26 /** @var string */
27 public $awsService;
28 /** @var string */
29 public $awsTerminationString;
30 /** @var string */
31 public $hashAlgorithm;
32 /** @var string */
33 public $url;
34 /** @var string */
35 public $rawMessage;
36 /** @var string */
37 public $date;
38 /** @var string */
39 public $dateWithoutTime;
40 /** @var string[] */
41 private $availableRegions = [
42 'US East (N. Virginia)' => 'us-east-1',
43 'US East (Ohio)' => 'us-east-2',
44 'US West (N. California)' => 'us-west-1',
45 'US West (Oregon)' => 'us-west-2',
46 'EU (Ireland)' => 'eu-west-1',
47 'EU (London)' => 'eu-west-2',
48 'EU (Paris)' => 'eu-west-3',
49 'EU (Milan)' => 'eu-south-1',
50 'EU (Frankfurt)' => 'eu-central-1',
51 'EU (Stockholm)' => 'eu-north-1',
52 'Canada (Central)' => 'ca-central-1',
53 'China (Beijing)' => 'cn-north-1',
54 'China (Ningxia)' => 'cn-northwest-1',
55 'Africa (Cape Town)' => 'af-south-1',
56 'Asia Pacific (Hong Kong)' => 'ap-east-1',
57 'Asia Pacific (Jakarta)' => 'ap-southeast-3',
58 'Asia Pacific (Mumbai)' => 'ap-south-1',
59 'Asia Pacific (Seoul)' => 'ap-northeast-2',
60 'Asia Pacific (Osaka)' => 'ap-northeast-3',
61 'Asia Pacific (Singapore)' => 'ap-southeast-1',
62 'Asia Pacific (Sydney)' => 'ap-southeast-2',
63 'Asia Pacific (Tokyo)' => 'ap-northeast-1',
64 'Middle East (Bahrain)' => 'me-south-1',
65 'South America (Sao Paulo)' => 'sa-east-1',
66 'AWS GovCloud (US)' => 'us-gov-west-1',
67 ];
68 /** @var AmazonSESMapper */
69 protected $errorMapper;
70 /** @var WPFunctions */
71 protected $wp;
72
73 public function __construct(
74 $region,
75 $accessKey,
76 $secretKey,
77 $sender,
78 $replyTo,
79 $returnPath,
80 AmazonSESMapper $errorMapper,
81 WPFunctions $wp,
82 Url $urlUtils
83 ) {
84 $this->awsAccessKey = $accessKey;
85 $this->awsSecretKey = $secretKey;
86 $this->awsRegion = (in_array($region, $this->availableRegions)) ? $region : false;
87 if (!$this->awsRegion) {
88 throw new \Exception(__('Unsupported Amazon SES region', 'mailpoet'));
89 }
90 $this->awsEndpoint = sprintf('email.%s.amazonaws.com', $this->awsRegion);
91 $this->awsSigningAlgorithm = 'AWS4-HMAC-SHA256';
92 $this->awsService = 'ses';
93 $this->awsTerminationString = 'aws4_request';
94 $this->hashAlgorithm = 'sha256';
95 $this->url = 'https://' . $this->awsEndpoint;
96 $this->sender = $sender;
97 $this->replyTo = $replyTo;
98 $this->returnPath = $returnPath;
99 $this->date = gmdate('Ymd\THis\Z');
100 $this->dateWithoutTime = gmdate('Ymd');
101 $this->errorMapper = $errorMapper;
102 $this->wp = $wp;
103 $this->urlUtils = $urlUtils;
104 $this->blacklist = new BlacklistCheck();
105 $this->mailer = $this->buildMailer();
106 }
107
108 public function send($newsletter, $subscriber, $extraParams = []): array {
109 if ($this->blacklist->isBlacklisted($subscriber)) {
110 $error = $this->errorMapper->getBlacklistError($subscriber);
111 return Mailer::formatMailerErrorResult($error);
112 }
113 try {
114 $result = $this->wp->wpRemotePost(
115 $this->url,
116 $this->request($newsletter, $subscriber, $extraParams)
117 );
118 } catch (\Exception $e) {
119 $error = $this->errorMapper->getErrorFromException($e, $subscriber);
120 return Mailer::formatMailerErrorResult($error);
121 }
122 if (is_wp_error($result)) {
123 $error = $this->errorMapper->getConnectionError($result->get_error_message());
124 return Mailer::formatMailerErrorResult($error);
125 }
126 if ($this->wp->wpRemoteRetrieveResponseCode($result) !== 200) {
127 $response = simplexml_load_string($this->wp->wpRemoteRetrieveBody($result));
128 $error = $this->errorMapper->getErrorFromResponse($response, $subscriber);
129 return Mailer::formatMailerErrorResult($error);
130 }
131 return Mailer::formatMailerSendSuccessResult();
132 }
133
134 public function buildMailer(): PHPMailer {
135 return new PHPMailer(true);
136 }
137
138 public function getBody($newsletter, $subscriber, $extraParams = []) {
139 /* Configure mailer and call preSend() method to prepare message */
140 $mailer = $this->configureMailerWithMessage($newsletter, $subscriber, $extraParams);
141 $mailer->preSend();
142 /* When message is prepared, we can get the raw message */
143 $this->rawMessage = $mailer->getSentMIMEMessage();
144 return [
145 'Action' => 'SendRawEmail',
146 'Version' => '2010-12-01',
147 'Source' => $this->sender['from_name_email'],
148 'RawMessage.Data' => $this->encodeMessage($this->rawMessage),
149 ];
150 }
151
152 public function encodeMessage(string $message) {
153 return base64_encode($message);
154 }
155
156 public function request($newsletter, $subscriber, $extraParams = []) {
157 $body = array_map('urlencode', $this->getBody($newsletter, $subscriber, $extraParams));
158 return [
159 'timeout' => 10,
160 'httpversion' => '1.1',
161 'method' => 'POST',
162 'headers' => [
163 'Host' => $this->awsEndpoint,
164 'Authorization' => $this->signRequest($body),
165 'X-Amz-Date' => $this->date,
166 ],
167 'body' => urldecode(http_build_query($body, '', '&')),
168 ];
169 }
170
171 public function signRequest($body) {
172 $stringToSign = $this->createStringToSign(
173 $this->getCredentialScope(),
174 $this->getCanonicalRequest($body)
175 );
176 $signature = hash_hmac(
177 $this->hashAlgorithm,
178 $stringToSign,
179 $this->getSigningKey()
180 );
181
182 return sprintf(
183 '%s Credential=%s/%s, SignedHeaders=host;x-amz-date, Signature=%s',
184 $this->awsSigningAlgorithm,
185 $this->awsAccessKey,
186 $this->getCredentialScope(),
187 $signature
188 );
189 }
190
191 public function getCredentialScope() {
192 return sprintf(
193 '%s/%s/%s/%s',
194 $this->dateWithoutTime,
195 $this->awsRegion,
196 $this->awsService,
197 $this->awsTerminationString
198 );
199 }
200
201 public function getCanonicalRequest($body) {
202 return implode("\n", [
203 'POST',
204 '/',
205 '',
206 'host:' . $this->awsEndpoint,
207 'x-amz-date:' . $this->date,
208 '',
209 'host;x-amz-date',
210 hash($this->hashAlgorithm, urldecode(http_build_query($body, '', '&'))),
211 ]);
212 }
213
214 public function createStringToSign($credentialScope, $canonicalRequest) {
215 return implode("\n", [
216 $this->awsSigningAlgorithm,
217 $this->date,
218 $credentialScope,
219 hash($this->hashAlgorithm, $canonicalRequest),
220 ]);
221 }
222
223 public function getSigningKey() {
224 $dateKey = hash_hmac(
225 $this->hashAlgorithm,
226 $this->dateWithoutTime,
227 'AWS4' . $this->awsSecretKey,
228 true
229 );
230 $regionKey = hash_hmac(
231 $this->hashAlgorithm,
232 $this->awsRegion,
233 $dateKey,
234 true
235 );
236 $serviceKey = hash_hmac(
237 $this->hashAlgorithm,
238 $this->awsService,
239 $regionKey,
240 true
241 );
242 return hash_hmac(
243 $this->hashAlgorithm,
244 $this->awsTerminationString,
245 $serviceKey,
246 true
247 );
248 }
249 }
250