PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
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 / WordPress / WordPressMailer.php
mailpoet / lib / Mailer / WordPress Last commit date
PHPMailerLoader.php 4 years ago WordPressMailer.php 8 months ago WordpressMailerReplacer.php 3 years ago index.php 3 years ago
WordPressMailer.php
131 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Mailer\WordPress;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use Automattic\WooCommerce\EmailEditor\Engine\Renderer\Html2Text;
9 use MailPoet\Mailer\MailerFactory;
10 use MailPoet\Mailer\MetaInfo;
11 use MailPoet\Subscribers\SubscribersRepository;
12 use PHPMailer\PHPMailer\Exception as PHPMailerException;
13 use PHPMailer\PHPMailer\PHPMailer;
14
15 PHPMailerLoader::load();
16
17 class WordPressMailer extends PHPMailer {
18 /** @var MailerFactory */
19 private $mailerFactory;
20
21 /** @var MetaInfo */
22 private $mailerMetaInfo;
23
24 /** @var SubscribersRepository */
25 private $subscribersRepository;
26
27 public function __construct(
28 MailerFactory $mailerFactory,
29 MetaInfo $mailerMetaInfo,
30 SubscribersRepository $subscribersRepository
31 ) {
32 parent::__construct(true);
33 $this->mailerFactory = $mailerFactory;
34 $this->mailerMetaInfo = $mailerMetaInfo;
35 $this->subscribersRepository = $subscribersRepository;
36 }
37
38 public function send() {
39 // We need this so that the PHPMailer class will correctly prepare all the headers.
40 $originalMailer = $this->Mailer; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
41 $this->Mailer = 'mail'; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
42
43 // Prepare everything (including the message) for sending.
44 $this->preSend();
45
46 $email = $this->getEmail();
47 $address = $this->formatAddress($this->getToAddresses());
48 $subscriber = $this->subscribersRepository->findOneBy(['email' => $address]);
49 $extraParams = [
50 'meta' => $this->mailerMetaInfo->getWordPressTransactionalMetaInfo($subscriber),
51 ];
52
53 try {
54 // we need to build fresh mailer for every single WP e-mail to make sure reply-to is set
55 $replyTo = $this->getReplyToAddress();
56 $mailer = $this->mailerFactory->buildMailer(null, null, $replyTo);
57 $result = $mailer->send($email, $address, $extraParams);
58 if (!$result['response']) {
59 throw new \Exception($result['error']->getMessage());
60 }
61 } catch (\Exception $ePrimary) {
62 // In case the sending using MailPoet's mailer fails continue with sending using original parent PHPMailer::sent method.
63 // But if anything fails we still want tho throw the error from the primary MailPoet mailer.
64 try {
65 // Restore original settings for mailer. Some sites may use SMTP and we needed to reset it to mail
66 $this->Mailer = $originalMailer; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
67 return parent::send();
68 } catch (\Exception $eFallback) {
69 throw new PHPMailerException($ePrimary->getMessage(), $ePrimary->getCode(), $ePrimary);
70 }
71 }
72 return true;
73 }
74
75 private function getEmail() {
76 // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
77 $email = [
78 'subject' => $this->Subject,
79 'body' => [],
80 ];
81
82 if (strpos($this->ContentType, 'text/plain') === 0) {
83 $email['body']['text'] = $this->Body;
84 } elseif (strpos($this->ContentType, 'text/html') === 0) {
85 // @phpstan-ignore-next-line mb_convert_encoding will not return false, when we use mb_list_encodings(). It contains special encoding 'pass' ensuring it will always succeed.
86 $text = @Html2Text::convert(strtolower($this->CharSet) === 'utf-8' ? $this->Body : mb_convert_encoding($this->Body, 'UTF-8', mb_list_encodings()));
87 $email['body']['text'] = $text;
88 $email['body']['html'] = $this->Body;
89 } elseif (strpos($this->ContentType, 'multipart/alternative') === 0) {
90 $email['body']['text'] = $this->AltBody;
91 $email['body']['html'] = $this->Body;
92 } else {
93 throw new PHPMailerException('Unsupported email content type has been used. Please use only text or HTML emails.');
94 }
95 return $email;
96 // phpcs:enable
97 }
98
99 private function formatAddress($wordpressAddress) {
100 $data = $wordpressAddress[0];
101 $result = [
102 'address' => $data[0],
103 ];
104 if (!empty($data[1])) {
105 $result['full_name'] = $data[1];
106 }
107 return $result;
108 }
109
110 private function getReplyToAddress(): ?array {
111 $replyToAddress = null;
112 $addresses = $this->getReplyToAddresses();
113
114 if (!empty($addresses)) {
115 // only one reply-to address supported by \MailPoet\Mailer
116 $address = array_shift($addresses);
117 $replyToAddress = [];
118
119 if ($address[1]) {
120 $replyToAddress['name'] = $address[1];
121 }
122
123 if ($address[0]) {
124 $replyToAddress['address'] = $address[0];
125 }
126 }
127
128 return $replyToAddress;
129 }
130 }
131