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 / Util / Notices / SenderDomainAuthenticationNotices.php
mailpoet / lib / Util / Notices Last commit date
AfterMigrationNotice.php 2 years ago BlackFridayNotice.php 2 months ago ChangedTrackingNotice.php 3 years ago DatabaseEngineNotice.php 1 year ago DeprecatedFilterNotice.php 4 years ago DisabledMailFunctionNotice.php 2 months ago DisabledWPCronNotice.php 1 year ago EmailWithInvalidSegmentNotice.php 3 years ago HeadersAlreadySentNotice.php 2 months ago InactiveSubscribersNotice.php 2 years ago PHPVersionWarnings.php 2 months ago PendingApprovalNotice.php 2 years ago PermanentNotices.php 2 months ago PremiumFeaturesAvailableNotice.php 2 years ago SenderDomainAuthenticationNotices.php 5 months ago SendingQueueBodyCleanupNotice.php 2 months ago StuckPostNotificationNotice.php 2 months ago UnauthorizedEmailInNewslettersNotice.php 5 months ago UnauthorizedEmailNotice.php 5 months ago WooCommerceVersionWarning.php 1 year ago WordPressPlaygroundNotice.php 1 year ago index.php 3 years ago
SenderDomainAuthenticationNotices.php
190 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Util\Notices;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Services\AuthorizedSenderDomainController;
9 use MailPoet\Services\Bridge;
10 use MailPoet\Settings\SettingsController;
11 use MailPoet\Util\FreeDomains;
12 use MailPoet\Util\Helpers;
13 use MailPoet\Util\License\Features\Subscribers;
14 use MailPoet\WP\Notice;
15
16 class SenderDomainAuthenticationNotices {
17 const FREE_MAIL_KB_URL = 'https://kb.mailpoet.com/article/259-your-from-address-cannot-be-yahoo-com-gmail-com-outlook-com';
18 const SPF_DKIM_DMARC_KB_URL = 'https://kb.mailpoet.com/article/295-spf-dkim-dmarc';
19
20 private SettingsController $settingsController;
21
22 private Subscribers $subscribersFeatures;
23
24 private FreeDomains $freeDomains;
25
26 private AuthorizedSenderDomainController $authorizedSenderDomainController;
27
28 private Bridge $bridge;
29
30 public function __construct(
31 SettingsController $settingsController,
32 Subscribers $subscribersFeatures,
33 FreeDomains $freeDomains,
34 AuthorizedSenderDomainController $authorizedEmailsController,
35 Bridge $bridge
36 ) {
37 $this->settingsController = $settingsController;
38 $this->subscribersFeatures = $subscribersFeatures;
39 $this->freeDomains = $freeDomains;
40 $this->authorizedSenderDomainController = $authorizedEmailsController;
41 $this->bridge = $bridge;
42 }
43
44 public function getDefaultFromAddress(): string {
45 return $this->settingsController->get('sender.address', '');
46 }
47
48 public function getDefaultFromDomain(): string {
49 return Helpers::extractEmailDomain($this->getDefaultFromAddress());
50 }
51
52 public function isFreeMailUser(): bool {
53 return $this->freeDomains->isEmailOnFreeDomain($this->getDefaultFromDomain());
54 }
55
56 public function init($shouldDisplay): ?Notice {
57 if (
58 !$shouldDisplay
59 || !$this->bridge->isMailpoetSendingServiceEnabled()
60 || $this->authorizedSenderDomainController->shouldSkipAuthorization()
61 || in_array($this->getDefaultFromDomain(), $this->authorizedSenderDomainController->getFullyVerifiedSenderDomains(true))
62 || $this->authorizedSenderDomainController->isNewUser()
63 || $this->isFreeMailUser() && $this->subscribersFeatures->getSubscribersCount() <= AuthorizedSenderDomainController::LOWER_LIMIT
64 ) {
65 return null;
66 }
67
68 return $this->display();
69 }
70
71 public function display(): Notice {
72 $contactCount = $this->subscribersFeatures->getSubscribersCount();
73 $isFreeMailUser = $this->isFreeMailUser();
74
75 $noticeContent = $isFreeMailUser
76 ? $this->getNoticeContentForFreeMailUsers($contactCount)
77 : $this->getNoticeContentForBrandedDomainUsers($this->isPartiallyVerified(), $contactCount);
78
79 $extraClasses = 'mailpoet-dismissible-notice is-dismissible';
80
81 if ($this->isErrorStyle()) {
82 return Notice::displayError($noticeContent, $extraClasses, '', true, false);
83 }
84
85 return Notice::displayWarning($noticeContent, $extraClasses);
86 }
87
88 public function isErrorStyle(): bool {
89 if (
90 $this->subscribersFeatures->getSubscribersCount() < AuthorizedSenderDomainController::UPPER_LIMIT
91 || $this->isPartiallyVerified()
92 ) {
93 return false;
94 }
95
96 return true;
97 }
98
99 public function isPartiallyVerified(): bool {
100 return in_array($this->getDefaultFromDomain(), $this->authorizedSenderDomainController->getPartiallyVerifiedSenderDomains(true));
101 }
102
103 public function getNoticeContentForFreeMailUsers(int $contactCount): string {
104 if ($contactCount <= AuthorizedSenderDomainController::UPPER_LIMIT) {
105 // translators: %1$s is the domain of the user's default from address, %2$s is a rewritten version of their default from address, %3$s is HTML for an 'update sender' button, and %4$s is HTML for a Learn More button
106 return sprintf(
107 __("<strong>Update your sender email address to a branded domain to continue sending your campaigns.</strong>
108 <span>MailPoet can no longer send from email addresses on shared 3rd party domains like <strong>%1\$s</strong>. Please change your campaigns to send from an email address on your site's branded domain. Your existing scheduled and active emails will temporarily be sent from <strong>%2\$s</strong>.</span> <p>%3\$s &nbsp; %4\$s</p>", 'mailpoet'),
109 "@" . $this->getDefaultFromDomain(),
110 $this->authorizedSenderDomainController->getRewrittenEmailAddress($this->getDefaultFromAddress()),
111 $this->getUpdateSenderButton(),
112 $this->getLearnMoreAboutFreeMailButton()
113 );
114 }
115
116 // translators: %1$s is the domain of the user's default from address, %2$s is a rewritten version of their default from address, %3$s is HTML for an 'update sender' button, and %4$s is HTML for a Learn More button
117 return sprintf(
118 __("<strong>Your newsletters and post notifications have been paused. Update your sender email address to a branded domain to continue sending your campaigns.</strong>
119 <span>MailPoet can no longer send from email addresses on shared 3rd party domains like <strong>%1\$s</strong>. Please change your campaigns to send from an email address on your site's branded domain. Your marketing automations and transactional emails will temporarily be sent from <strong>%2\$s</strong>.</span> <p>%3\$s &nbsp; %4\$s</p>", 'mailpoet'),
120 "@" . $this->getDefaultFromDomain(),
121 $this->authorizedSenderDomainController->getRewrittenEmailAddress($this->getDefaultFromAddress()),
122 $this->getUpdateSenderButton(),
123 $this->getLearnMoreAboutFreeMailButton()
124 );
125 }
126
127 public function getNoticeContentForBrandedDomainUsers(bool $isPartiallyVerified, int $contactCount): string {
128 if ($isPartiallyVerified || $contactCount <= AuthorizedSenderDomainController::LOWER_LIMIT) {
129 // translators: %1$s is HTML for an 'authenticate domain' button, %2$s is HTML for a Learn More button
130 return sprintf(
131 __("<strong>Authenticate your sender domain to improve email delivery rates.</strong>
132 <span>Major mailbox providers require you to authenticate your sender domain to confirm you sent the emails, and may place unauthenticated emails in the “Spam” folder. Please authenticate your sender domain to ensure your marketing campaigns are compliant and will reach your contacts.</span><p>%1\$s &nbsp; %2\$s</p>", 'mailpoet'),
133 $this->getAuthenticateDomainButton(),
134 $this->getLearnMoreAboutSpfDkimDmarcButton()
135 );
136 }
137
138 if ($contactCount <= AuthorizedSenderDomainController::UPPER_LIMIT) {
139 // translators: %1$s is a rewritten version of the user's default from address, %2$s is HTML for an 'authenticate domain' button, %3$s is HTML for a Learn More button
140 return sprintf(
141 __("<strong>Authenticate your sender domain to send new emails.</strong>
142 <span>Major mailbox providers require you to authenticate your sender domain to confirm you sent the emails, and may place unauthenticated emails in the “Spam” folder. Please authenticate your sender domain to ensure your marketing campaigns are compliant and will reach your contacts. Your existing scheduled and active emails will temporarily be sent from <strong>%1\$s</strong>.</span> <p>%2\$s &nbsp; %3\$s</p>", 'mailpoet'),
143 $this->authorizedSenderDomainController->getRewrittenEmailAddress($this->getDefaultFromAddress()),
144 $this->getAuthenticateDomainButton(),
145 $this->getLearnMoreAboutSpfDkimDmarcButton()
146 );
147 }
148
149 // translators: %1$s is a rewritten version of the user's default from address, %2$s is HTML for an 'authenticate domain' button, %3$s is HTML for a Learn More button
150 return sprintf(
151 __("<strong>Your newsletters and post notifications have been paused. Authenticate your sender domain to continue sending.</strong>
152 <span>Major mailbox providers require you to authenticate your sender domain to confirm you sent the emails, and may place unauthenticated emails in the “Spam” folder. Please authenticate your sender domain to ensure your marketing campaigns are compliant and will reach your contacts. Your marketing automations and transactional emails will temporarily be sent from <strong>%1\$s</strong>.</span> <p>%2\$s &nbsp; %3\$s</p>", 'mailpoet'),
153 $this->authorizedSenderDomainController->getRewrittenEmailAddress($this->getDefaultFromAddress()),
154 $this->getAuthenticateDomainButton(),
155 $this->getLearnMoreAboutSpfDkimDmarcButton()
156 );
157 }
158
159 public function getUpdateSenderButton(): string {
160 $buttonClass = $this->subscribersFeatures->getSubscribersCount() > AuthorizedSenderDomainController::UPPER_LIMIT
161 ? 'button-primary'
162 : 'button-secondary';
163 $button = sprintf('<a href="admin.php?page=mailpoet-settings" class="button %1$s">%2$s</a>', $buttonClass, __('Update sender email', 'mailpoet'));
164 return $button;
165 }
166
167 public function getLearnMoreAboutFreeMailButton(): string {
168 $button = '<a href="' . self::FREE_MAIL_KB_URL . '" rel="noopener noreferer" target="_blank" class="button button-link">' . __('Learn more', 'mailpoet') . '</a>';
169 return $button;
170 }
171
172 public function getLearnMoreAboutSpfDkimDmarcButton(): string {
173 $button = '<a href="' . self::SPF_DKIM_DMARC_KB_URL . '" rel="noopener noreferer" target="_blank" class="button button-link">' . __('Learn more', 'mailpoet') . '</a>';
174 return $button;
175 }
176
177 public function getAuthenticateDomainButton() {
178 $buttonClass = $this->isErrorStyle()
179 ? 'button-primary'
180 : 'button-secondary';
181 $button = sprintf(
182 '<a href="#" class="button %s mailpoet-js-button-authorize-email-and-sender-domain" data-email="%s" data-type="domain">%s</a>',
183 $buttonClass,
184 esc_attr($this->getDefaultFromAddress()),
185 __('Authenticate domain', 'mailpoet')
186 );
187 return $button;
188 }
189 }
190