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 / PHPMailerMethod.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
PHPMailerMethod.php
127 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\WordPress\PHPMailerLoader;
11 use MailPoet\Util\Url;
12 use PHPMailer\PHPMailer\PHPMailer;
13
14 PHPMailerLoader::load();
15
16 abstract class PHPMailerMethod implements MailerMethod {
17 /** @var string[] */
18 public $sender;
19 /** @var string[] */
20 public $replyTo;
21 /** @var string */
22 public $returnPath;
23 /** @var PHPMailer */
24 public $mailer;
25
26 protected $errorMapper;
27
28 /** @var Url */
29 protected $urlUtils;
30
31 /** @var BlacklistCheck */
32 protected $blacklist;
33
34 public function __construct(
35 $sender,
36 $replyTo,
37 $returnPath,
38 $errorMapper,
39 Url $urlUtils
40 ) {
41 $this->sender = $sender;
42 $this->replyTo = $replyTo;
43 $this->returnPath = $returnPath;
44 $this->mailer = $this->buildMailer();
45 $this->errorMapper = $errorMapper;
46 $this->urlUtils = $urlUtils;
47 $this->blacklist = new BlacklistCheck();
48 }
49
50 public function send($newsletter, $subscriber, $extraParams = []): array {
51 if ($this->blacklist->isBlacklisted($subscriber)) {
52 $error = $this->errorMapper->getBlacklistError($subscriber);
53 return Mailer::formatMailerErrorResult($error);
54 }
55 try {
56 $mailer = $this->configureMailerWithMessage($newsletter, $subscriber, $extraParams);
57 $result = $mailer->send();
58 } catch (\Exception $e) {
59 return Mailer::formatMailerErrorResult($this->errorMapper->getErrorFromException($e, $subscriber));
60 }
61 if ($result === true) {
62 return Mailer::formatMailerSendSuccessResult();
63 } else {
64 $error = $this->errorMapper->getErrorForSubscriber($subscriber);
65 return Mailer::formatMailerErrorResult($error);
66 }
67 }
68
69 abstract public function buildMailer(): PHPMailer;
70
71 public function configureMailerWithMessage($newsletter, $subscriber, $extraParams = []) {
72 $mailer = $this->mailer;
73 $mailer->clearAddresses();
74 $mailer->clearCustomHeaders();
75 $mailer->isHTML(!empty($newsletter['body']['html']));
76 $mailer->CharSet = 'UTF-8'; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
77 $mailer->setFrom($this->sender['from_email'], $this->sender['from_name'], false);
78 $mailer->addReplyTo($this->replyTo['reply_to_email'], $this->replyTo['reply_to_name']);
79 $subscriber = $this->processSubscriber($subscriber);
80 $mailer->addAddress($subscriber['email'], $subscriber['name']);
81 $mailer->Subject = (!empty($newsletter['subject'])) ? $newsletter['subject'] : ''; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
82 $mailer->Body = (!empty($newsletter['body']['html'])) ? $newsletter['body']['html'] : $newsletter['body']['text']; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
83 if ($mailer->ContentType !== 'text/plain') { // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
84 $mailer->AltBody = (!empty($newsletter['body']['text'])) ? $newsletter['body']['text'] : ''; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
85 }
86 $mailer->Sender = $this->returnPath; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
87
88 // unsubscribe header
89 $unsubscribeUrl = $extraParams['unsubscribe_url'] ?? null;
90 $oneClickUnsubscribeUrl = $extraParams['one_click_unsubscribe'] ?? null;
91 if ($unsubscribeUrl) {
92 $isHttps = $this->urlUtils->isUsingHttps($unsubscribeUrl);
93 $url = $isHttps && $oneClickUnsubscribeUrl ? $oneClickUnsubscribeUrl : $unsubscribeUrl;
94 if ($isHttps) {
95 $mailer->addCustomHeader('List-Unsubscribe-Post', 'List-Unsubscribe=One-Click');
96 }
97 $mailer->addCustomHeader('List-Unsubscribe', '<' . $url . '>');
98 }
99
100 // Enforce base64 encoding when lines are too long, otherwise quoted-printable encoding
101 // is automatically used which can occasionally break the email body.
102 // Explanation:
103 // The bug occurs on Unix systems where mail() function passes email to a variation of
104 // sendmail command which expects only NL as line endings (POSIX). Since quoted-printable
105 // requires CRLF some of those commands convert LF to CRLF which can break the email body
106 // because it already (correctly) uses CRLF. Such CRLF then (wrongly) becomes CRCRLF.
107 if (PHPMailer::hasLineLongerThanMax($mailer->Body)) { // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
108 $mailer->Encoding = 'base64'; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
109 }
110
111 return $mailer;
112 }
113
114 public function processSubscriber($subscriber) {
115 preg_match('!(?P<name>.*?)\s<(?P<email>.*?)>!', $subscriber, $subscriberData);
116 if (!isset($subscriberData['email'])) {
117 $subscriberData = [
118 'email' => $subscriber,
119 ];
120 }
121 return [
122 'email' => $subscriberData['email'],
123 'name' => (isset($subscriberData['name'])) ? $subscriberData['name'] : '',
124 ];
125 }
126 }
127