WP Mail SMTP by WPForms - Version 2.2.1

Version Description

  • 2020-07-09 =
  • Added: Gmail mailer now supports aliases.
  • Added: Support both old PHPMailer v5 (WordPress <=5.4) and PHPMailer v6 (WordPress >=5.5).
  • Changed: Pepipost mailer is now using the native API v5 instead of the SendGrid migration API.
  • Fixed: Incorrect Mailgun Domain Name option was not showing an email delivery error.
  • Fixed: Empty debug errors for the Sendinblue mailer are no more.
  • Fixed: Properly compare From Email option value with a correct default email address from WP core.
Download this release

Release Info

Developer slaFFik
Plugin Icon 128x128 WP Mail SMTP by WPForms
Version 2.2.1
Comparing to
See all releases

Code changes from version 2.1.1 to 2.2.1

Files changed (40) hide show
  1. assets/languages/wp-mail-smtp.pot +228 -629
  2. readme.txt +9 -1
  3. src/Admin/Area.php +8 -10
  4. src/Admin/PageAbstract.php +89 -87
  5. src/Admin/Pages/About.php +27 -3
  6. src/Admin/Pages/Logs.php +2 -3
  7. src/Admin/Pages/MiscTab.php +13 -2
  8. src/Admin/Pages/SettingsTab.php +54 -11
  9. src/Admin/Pages/TestTab.php +3 -3
  10. src/Core.php +114 -6
  11. src/MailCatcher.php +16 -1
  12. src/MailCatcherInterface.php +33 -0
  13. src/MailCatcherV6.php +149 -0
  14. src/Options.php +3 -1
  15. src/Processor.php +11 -21
  16. src/Providers/Gmail/Auth.php +331 -283
  17. src/Providers/Gmail/Mailer.php +20 -23
  18. src/Providers/Gmail/Options.php +251 -234
  19. src/Providers/Loader.php +5 -8
  20. src/Providers/MailerAbstract.php +7 -10
  21. src/Providers/MailerInterface.php +86 -83
  22. src/Providers/Mailgun/Mailer.php +466 -431
  23. src/Providers/PepipostAPI/Mailer.php +213 -181
  24. src/Providers/SMTPcom/Mailer.php +3 -2
  25. src/Providers/Sendgrid/Mailer.php +3 -2
  26. src/Providers/Sendinblue/Mailer.php +391 -393
  27. src/SiteHealth.php +92 -10
  28. src/Tasks/Task.php +1 -1
  29. src/WP.php +59 -0
  30. uninstall.php +134 -54
  31. vendor/google/auth/src/Credentials/UserRefreshCredentials.php +0 -23
  32. vendor/google/auth/src/CredentialsLoader.php +42 -28
  33. vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php +15 -1
  34. vendor/google/auth/src/HttpHandler/Guzzle7HttpHandler.php +21 -0
  35. vendor/google/auth/src/HttpHandler/HttpHandlerFactory.php +13 -5
  36. vendor/guzzlehttp/guzzle/src/ClientInterface.php +1 -1
  37. vendor/guzzlehttp/guzzle/src/Utils.php +6 -3
  38. vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +302 -1
  39. vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php +311 -1
  40. wp_mail_smtp.php +2 -2
assets/languages/wp-mail-smtp.pot CHANGED
@@ -1,13 +1,13 @@
1
  msgid ""
2
  msgstr ""
3
- "Project-Id-Version: WP Mail SMTP 2.1.1\n"
4
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-mail-smtp\n"
5
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
6
  "Language-Team: LANGUAGE <LL@li.org>\n"
7
  "MIME-Version: 1.0\n"
8
  "Content-Type: text/plain; charset=UTF-8\n"
9
  "Content-Transfer-Encoding: 8bit\n"
10
- "POT-Creation-Date: 2020-06-08T15:01:32+03:00\n"
11
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12
  "X-Generator: WP-CLI 2.4.0\n"
13
  "X-Domain: wp-mail-smtp\n"
@@ -33,1274 +33,1005 @@ msgid "https://wpforms.com/"
33
  msgstr ""
34
 
35
  #. translators: %s - error code, returned by Google API.
36
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:125
37
  #: src/Admin/Area.php:125
38
  msgid "There was an error while processing the authentication request: %s. Please try again."
39
  msgstr ""
40
 
41
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:133
42
  #: src/Admin/Area.php:133
43
  msgid "There was an error while processing the authentication request. Please try again."
44
  msgstr ""
45
 
46
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:140
47
  #: src/Admin/Area.php:140
48
  msgid "There was an error while processing the authentication request. Please make sure that you have Client ID and Client Secret both valid and saved."
49
  msgstr ""
50
 
51
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:149
52
  #: src/Admin/Area.php:149
53
  msgid "You have successfully linked the current site with your Google API project. Now you can start sending emails through Gmail."
54
  msgstr ""
55
 
56
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:155
57
  #: src/Admin/Area.php:155
58
  msgid "You have successfully linked the current site with your Microsoft API project. Now you can start sending emails through Outlook."
59
  msgstr ""
60
 
61
  #. translators: %s - Mailer anchor link.
62
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:186
63
  #: src/Admin/Area.php:186
64
  msgid "Thanks for using WP Mail SMTP! To complete the plugin setup and start sending emails, <strong>please select and configure your <a href=\"%s\">Mailer</a></strong>."
65
  msgstr ""
66
 
67
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:209
68
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:210
69
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:40
70
  #: src/Admin/Area.php:209
71
  #: src/Admin/Area.php:210
72
  #: src/SiteHealth.php:40
73
  msgid "WP Mail SMTP"
74
  msgstr ""
75
 
76
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:220
77
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:221
78
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:864
79
  #: src/Admin/Area.php:220
80
  #: src/Admin/Area.php:221
81
- #: src/Admin/Area.php:864
82
  msgid "Settings"
83
  msgstr ""
84
 
85
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:228
86
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:229
87
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:627
88
- #: build/wp-mail-smtp-pro/src/Admin/Pages/Logs.php:49
89
- #: build/wp-mail-smtp-pro/src/Admin/Pages/LogsTab.php:30
90
  #: src/Admin/Area.php:228
91
  #: src/Admin/Area.php:229
92
- #: src/Admin/Pages/About.php:627
93
- #: src/Admin/Pages/Logs.php:49
94
  #: src/Admin/Pages/LogsTab.php:30
95
  msgid "Email Log"
96
  msgstr ""
97
 
98
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:238
99
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:239
100
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:105
101
  #: src/Admin/Area.php:238
102
  #: src/Admin/Area.php:239
103
- #: src/Admin/Pages/About.php:105
104
  msgid "About Us"
105
  msgstr ""
106
 
107
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:302
108
  #: src/Admin/Area.php:302
109
  msgid "Are you sure you want to reset the current provider connection? You will need to immediately create a new one to be able to send emails."
110
  msgstr ""
111
 
112
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:303
113
  #: src/Admin/Area.php:303
114
  msgid "Changes that you made to the settings are not saved!"
115
  msgstr ""
116
 
117
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:305
118
  #: src/Admin/Area.php:305
119
  msgid "Heads up!"
120
  msgstr ""
121
 
122
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:307
123
  #: src/Admin/Area.php:307
124
  msgid "<p>The Default (PHP) mailer is currently selected, but is not recommended because in most cases it does not resolve email delivery issues.</p><p>Please consider selecting and configuring one of the other mailers.</p>"
125
  msgstr ""
126
 
127
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:312
128
- #: build/wp-mail-smtp-pro/src/Admin/PageAbstract.php:81
129
- #: src/Admin/Area.php:312
130
- #: src/Admin/PageAbstract.php:81
131
  msgid "Save Settings"
132
  msgstr ""
133
 
134
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:313
135
- #: src/Admin/Area.php:313
136
  msgid "Cancel"
137
  msgstr ""
138
 
139
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:314
140
- #: src/Admin/Area.php:314
141
  msgid "Warning icon"
142
  msgstr ""
143
 
144
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:319
145
- #: src/Admin/Area.php:319
146
  msgid "%name% is a PRO Feature"
147
  msgstr ""
148
 
149
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:320
150
- #: src/Admin/Area.php:320
151
  msgid "Upgrade to Pro"
152
  msgstr ""
153
 
154
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:324
155
- #: src/Admin/Area.php:324
156
  msgid "<strong>Bonus:</strong> WP Mail SMTP users get <span>$50 off</span> regular price,<br>applied at checkout."
157
  msgstr ""
158
 
159
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:333
160
- #: src/Admin/Area.php:333
161
  msgid "Already purchased?"
162
  msgstr ""
163
 
164
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:400
165
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:407
166
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:308
167
- #: src/Admin/Area.php:400
168
- #: src/Admin/Area.php:407
169
- #: src/Admin/Pages/About.php:308
170
  msgid "Activate"
171
  msgstr ""
172
 
173
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:401
174
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:300
175
- #: src/Admin/Area.php:401
176
- #: src/Admin/Pages/About.php:300
177
  msgid "Activated"
178
  msgstr ""
179
 
180
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:402
181
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:297
182
- #: src/Admin/Area.php:402
183
- #: src/Admin/Pages/About.php:297
184
  msgid "Active"
185
  msgstr ""
186
 
187
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:403
188
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:305
189
- #: src/Admin/Area.php:403
190
- #: src/Admin/Pages/About.php:305
191
  msgid "Inactive"
192
  msgstr ""
193
 
194
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:404
195
- #: src/Admin/Area.php:404
196
  msgid "Processing..."
197
  msgstr ""
198
 
199
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:405
200
- #: src/Admin/Area.php:405
201
  msgid "Could not install a plugin. Please download from WordPress.org and install manually."
202
  msgstr ""
203
 
204
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:406
205
- #: src/Admin/Area.php:406
206
  msgid "Install and Activate"
207
  msgstr ""
208
 
209
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:408
210
- #: src/Admin/Area.php:408
211
  msgid "Download"
212
  msgstr ""
213
 
214
  #. translators: %1$s - WP.org link; %2$s - same WP.org link.
215
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:468
216
- #: src/Admin/Area.php:468
217
  msgid "Please rate <strong>WP Mail SMTP</strong> <a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">&#9733;&#9733;&#9733;&#9733;&#9733;</a> on <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress.org</a> to help us spread the word. Thank you from the WP Mail SMTP team!"
218
  msgstr ""
219
 
220
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:805
221
- #: src/Admin/Area.php:805
222
  msgid "WP Mail SMTP Pro related message was successfully dismissed."
223
  msgstr ""
224
 
225
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:824
226
- #: src/Admin/Area.php:824
227
  msgid "Educational notice for this mailer was successfully dismissed."
228
  msgstr ""
229
 
230
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:863
231
- #: src/Admin/Area.php:863
232
  msgid "Go to WP Mail SMTP Settings page"
233
  msgstr ""
234
 
235
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:870
236
- #: src/Admin/Area.php:870
237
  msgid "Go to WP Mail SMTP Lite vs Pro comparison page"
238
  msgstr ""
239
 
240
- #: build/wp-mail-smtp-pro/src/Admin/Area.php:871
241
- #: src/Admin/Area.php:871
242
  msgid "Premium Support"
243
  msgstr ""
244
 
245
  #. translators: %s - plugin current license type.
246
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:98
247
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:526
248
- #: src/Admin/Pages/About.php:98
249
- #: src/Admin/Pages/About.php:526
250
  msgid "%s vs Pro"
251
  msgstr ""
252
 
253
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:170
254
- #: src/Admin/Pages/About.php:170
255
  msgid "Hello and welcome to WP Mail SMTP, the easiest and most popular WordPress SMTP plugin. We build software that helps your site reliably deliver emails every time."
256
  msgstr ""
257
 
258
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:174
259
- #: src/Admin/Pages/About.php:174
260
  msgid "Email deliverability has been a well-documented problem for all WordPress websites. However as WPForms grew, we became more aware of this painful issue that affects our users and the larger WordPress community. So we decided to solve this problem and make a solution that's beginner friendly."
261
  msgstr ""
262
 
263
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:177
264
- #: src/Admin/Pages/About.php:177
265
  msgid "Our goal is to make reliable email deliverability easy for WordPress."
266
  msgstr ""
267
 
268
  #. translators: %1$s - WPForms URL, %2$s - WPBeginner URL, %3$s - OptinMonster URL, %4$s - MonsterInsights URL, %5$s - RafflePress URL
269
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:184
270
- #: src/Admin/Pages/About.php:184
271
  msgid "WP Mail SMTP is brought to you by the same team that's behind the most user friendly WordPress forms, <a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">WPForms</a>, the largest WordPress resource site, <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">WPBeginner</a>, the most popular lead-generation software, <a href=\"%3$s\" target=\"_blank\" rel=\"noopener noreferrer\">OptinMonster</a>, the best WordPress analytics plugin, <a href=\"%4$s\" target=\"_blank\" rel=\"noopener noreferrer\">MonsterInsights</a>, and the most powerful WordPress contest plugin, <a href=\"%5$s\" target=\"_blank\" rel=\"noopener noreferrer\">RafflePress</a>."
272
  msgstr ""
273
 
274
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:202
275
- #: src/Admin/Pages/About.php:202
276
  msgid "Yup, we know a thing or two about building awesome products that customers love."
277
  msgstr ""
278
 
279
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:208
280
- #: src/Admin/Pages/About.php:208
281
  msgid "The WPForms Team photo"
282
  msgstr ""
283
 
284
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:210
285
- #: src/Admin/Pages/About.php:210
286
  msgid "The WPForms Team"
287
  msgstr ""
288
 
 
 
 
 
289
  #. translators: %s - status HTML text.
290
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:250
291
- #: src/Admin/Pages/About.php:250
292
  msgid "Status: %s"
293
  msgstr ""
294
 
295
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:316
296
- #: src/Admin/Pages/About.php:316
297
  msgid "Not Installed"
298
  msgstr ""
299
 
300
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:319
301
- #: src/Admin/Pages/About.php:319
302
  msgid "Install Plugin"
303
  msgstr ""
304
 
305
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:340
306
- #: src/Admin/Pages/About.php:340
307
  msgid "MonsterInsights"
308
  msgstr ""
309
 
310
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:341
311
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:347
312
- #: src/Admin/Pages/About.php:341
313
- #: src/Admin/Pages/About.php:347
314
  msgid "MonsterInsights makes it “effortless” to properly connect your WordPress site with Google Analytics, so you can start making data-driven decisions to grow your business."
315
  msgstr ""
316
 
317
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:346
318
- #: src/Admin/Pages/About.php:346
319
  msgid "MonsterInsights Pro"
320
  msgstr ""
321
 
322
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:354
323
- #: src/Admin/Pages/About.php:354
324
  msgid "OptinMonster"
325
  msgstr ""
326
 
327
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:355
328
- #: src/Admin/Pages/About.php:355
329
  msgid "Our high-converting optin forms like Exit-Intent® popups, Fullscreen Welcome Mats, and Scroll boxes help you dramatically boost conversions and get more email subscribers."
330
  msgstr ""
331
 
332
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:361
333
- #: src/Admin/Pages/About.php:361
334
  msgid "Contact Forms by WPForms"
335
  msgstr ""
336
 
337
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:362
338
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:368
339
- #: src/Admin/Pages/About.php:362
340
- #: src/Admin/Pages/About.php:368
341
  msgid "The best WordPress contact form plugin. Drag & Drop online form builder that helps you create beautiful contact forms with just a few clicks."
342
  msgstr ""
343
 
344
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:367
345
- #: src/Admin/Pages/About.php:367
346
  msgid "WPForms Pro"
347
  msgstr ""
348
 
349
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:375
350
- #: src/Admin/Pages/About.php:375
351
  msgid "RafflePress"
352
  msgstr ""
353
 
354
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:376
355
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:382
356
- #: src/Admin/Pages/About.php:376
357
- #: src/Admin/Pages/About.php:382
358
  msgid "Turn your visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with powerful viral giveaways & contests."
359
  msgstr ""
360
 
361
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:381
362
- #: src/Admin/Pages/About.php:381
363
  msgid "RafflePress Pro"
364
  msgstr ""
365
 
366
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:401
367
- #: src/Admin/Pages/About.php:401
368
  msgid "Could not activate the plugin. Please activate it from the Plugins page."
369
  msgstr ""
370
 
371
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:413
372
- #: src/Admin/Pages/About.php:413
373
  msgid "Plugin activated."
374
  msgstr ""
375
 
376
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:430
377
- #: src/Admin/Pages/About.php:430
378
  msgid "Could not install the plugin."
379
  msgstr ""
380
 
381
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:491
382
- #: src/Admin/Pages/About.php:491
383
  msgid "Plugin installed & activated."
384
  msgstr ""
385
 
386
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:499
387
- #: src/Admin/Pages/About.php:499
388
  msgid "Plugin installed."
389
  msgstr ""
390
 
391
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:534
392
- #: src/Admin/Pages/About.php:534
393
  msgid "Get the most out of WP Mail SMTP by upgrading to Pro and unlocking all of the powerful features."
394
  msgstr ""
395
 
396
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:543
397
- #: src/Admin/Pages/About.php:543
398
  msgid "Feature"
399
  msgstr ""
400
 
401
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:553
402
- #: src/Admin/Pages/About.php:553
403
  msgid "Pro"
404
  msgstr ""
405
 
406
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:594
407
- #: src/Admin/Pages/About.php:594
408
  msgid "Get WP Mail SMTP Pro Today and Unlock all of these Powerful Features"
409
  msgstr ""
410
 
411
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:601
412
- #: src/Admin/Pages/About.php:601
413
  msgid "Bonus: WP Mail SMTP Lite users get <span class=\"price-off\">$50 off regular price</span>, automatically applied at checkout."
414
  msgstr ""
415
 
416
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:628
417
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:27
418
- #: src/Admin/Pages/About.php:628
419
  #: src/Admin/Pages/ControlTab.php:27
420
  msgid "Email Controls"
421
  msgstr ""
422
 
423
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:629
424
- #: src/Admin/Pages/About.php:629
425
  msgid "Additional Mailers"
426
  msgstr ""
427
 
428
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:630
429
- #: src/Admin/Pages/About.php:630
430
  msgid "Customer Support"
431
  msgstr ""
432
 
433
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:651
434
- #: src/Admin/Pages/About.php:651
435
  msgid "Emails are not logged"
436
  msgstr ""
437
 
438
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:657
439
- #: src/Admin/Pages/About.php:657
440
  msgid "Complete Email Log management inside WordPress"
441
  msgstr ""
442
 
443
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:665
444
- #: src/Admin/Pages/About.php:665
445
  msgid "No controls over whether default WordPress emails are sent"
446
  msgstr ""
447
 
448
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:671
449
- #: src/Admin/Pages/About.php:671
450
  msgid "Complete Email Controls management for most default WordPress emails"
451
  msgstr ""
452
 
453
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:679
454
- #: src/Admin/Pages/About.php:679
455
  msgid "Only default list of mailers"
456
  msgstr ""
457
 
458
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:685
459
- #: src/Admin/Pages/About.php:685
460
  msgid "Additional mailers: Microsoft Outlook (with Office365 support) and Amazon SES"
461
  msgstr ""
462
 
463
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:693
464
- #: src/Admin/Pages/About.php:693
465
  msgid "Limited Support"
466
  msgstr ""
467
 
468
- #: build/wp-mail-smtp-pro/src/Admin/Pages/About.php:699
469
- #: src/Admin/Pages/About.php:699
470
  msgid "Priority Support"
471
  msgstr ""
472
 
473
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:48
474
  #: src/Admin/Pages/ControlTab.php:48
475
  msgid "Comment Notifications"
476
  msgstr ""
477
 
478
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:49
479
  #: src/Admin/Pages/ControlTab.php:49
480
  msgid "Manage emails sent when comments are published or awaiting moderation."
481
  msgstr ""
482
 
483
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:53
484
  #: src/Admin/Pages/ControlTab.php:53
485
  msgid "Site Admin Email Change Notifications"
486
  msgstr ""
487
 
488
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:54
489
  #: src/Admin/Pages/ControlTab.php:54
490
  msgid "Manage emails sent when site admin's account has been changed."
491
  msgstr ""
492
 
493
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:58
494
  #: src/Admin/Pages/ControlTab.php:58
495
  msgid "User Change Notifications"
496
  msgstr ""
497
 
498
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:59
499
  #: src/Admin/Pages/ControlTab.php:59
500
  msgid "Limit emails triggered by password changed/reset, email changed, and more."
501
  msgstr ""
502
 
503
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:63
504
  #: src/Admin/Pages/ControlTab.php:63
505
  msgid "Personal Data Requests Notifications"
506
  msgstr ""
507
 
508
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:64
509
  #: src/Admin/Pages/ControlTab.php:64
510
  msgid "Control emails for data requests and data removal actions."
511
  msgstr ""
512
 
513
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:68
514
  #: src/Admin/Pages/ControlTab.php:68
515
  msgid "Automatic Update Notifications"
516
  msgstr ""
517
 
518
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:69
519
  #: src/Admin/Pages/ControlTab.php:69
520
  msgid "Manage emails sent by the core automatic update process."
521
  msgstr ""
522
 
523
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:73
524
  #: src/Admin/Pages/ControlTab.php:73
525
  msgid "New User Notifications"
526
  msgstr ""
527
 
528
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:74
529
  #: src/Admin/Pages/ControlTab.php:74
530
  msgid "Toggle emails sent to both user and site administrator about new user accounts."
531
  msgstr ""
532
 
533
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:92
534
  #: src/Admin/Pages/ControlTab.php:92
535
  msgid "Unlock Email Controls"
536
  msgstr ""
537
 
538
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:95
539
  #: src/Admin/Pages/ControlTab.php:95
540
  msgid "Email Controls allows you to granularly manage emails sent by WordPress.
"
541
  msgstr ""
542
 
543
- #: build/wp-mail-smtp-pro/src/Admin/Pages/ControlTab.php:119
544
- #: build/wp-mail-smtp-pro/src/Admin/Pages/LogsTab.php:67
545
  #: src/Admin/Pages/ControlTab.php:119
546
  #: src/Admin/Pages/LogsTab.php:67
547
  msgid "Upgrade to WP Mail SMTP Pro"
548
  msgstr ""
549
 
550
- #: build/wp-mail-smtp-pro/src/Admin/Pages/LogsTab.php:53
551
  #: src/Admin/Pages/LogsTab.php:53
552
  msgid "Unlock Email Logging"
553
  msgstr ""
554
 
555
- #: build/wp-mail-smtp-pro/src/Admin/Pages/LogsTab.php:56
556
  #: src/Admin/Pages/LogsTab.php:56
557
  msgid "Keep track of every email sent from your WordPress site with email logging.
"
558
  msgstr ""
559
 
560
- #: build/wp-mail-smtp-pro/src/Admin/Pages/LogsTab.php:57
561
  #: src/Admin/Pages/LogsTab.php:57
562
  msgid "Troubleshoot sending issues, recover lost emails, and more!"
563
  msgstr ""
564
 
565
- #: build/wp-mail-smtp-pro/src/Admin/Pages/LogsTab.php:61
566
  #: src/Admin/Pages/LogsTab.php:61
567
  msgid "Logs Archive Page Screenshot"
568
  msgstr ""
569
 
570
- #: build/wp-mail-smtp-pro/src/Admin/Pages/LogsTab.php:62
571
  #: src/Admin/Pages/LogsTab.php:62
572
  msgid "Logs Single Page Screenshot"
573
  msgstr ""
574
 
575
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:24
576
  #: src/Admin/Pages/MiscTab.php:24
577
  msgid "Misc"
578
  msgstr ""
579
 
580
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:56
581
  #: src/Admin/Pages/MiscTab.php:56
582
  msgid "Do Not Send"
583
  msgstr ""
584
 
585
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:65
586
  #: src/Admin/Pages/MiscTab.php:65
587
  msgid "Check this if you would like to stop sending all emails."
588
  msgstr ""
589
 
590
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:71
591
  #: src/Admin/Pages/MiscTab.php:71
592
  msgid "Some plugins, like BuddyPress and Events Manager, are using their own email delivery solutions. By default, this option does not block their emails, as those plugins do not use default <code>wp_mail()</code> function to send emails."
593
  msgstr ""
594
 
595
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:79
596
  #: src/Admin/Pages/MiscTab.php:79
597
  msgid "You will need to consult with their documentation to switch them to use default WordPress email delivery."
598
  msgstr ""
599
 
600
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:81
601
  #: src/Admin/Pages/MiscTab.php:81
602
  msgid "Test emails are allowed to be sent, regardless of this option."
603
  msgstr ""
604
 
605
  #. translators: %1$s - constant that was used; %2$s - file where it was used.
606
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:86
607
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:468
608
  #: src/Admin/Pages/MiscTab.php:86
609
  #: src/Providers/OptionsAbstract.php:468
610
  msgid "The value of this field was set using a constant %1$s most likely inside %2$s of your WordPress installation."
611
  msgstr ""
612
 
613
  #. translators: %s - The URL to the constants support article.
614
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:93
615
  #: src/Admin/Pages/MiscTab.php:93
616
  msgid "Please read this <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">support article</a> if you want to enable this option using constants."
617
  msgstr ""
618
 
619
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:114
620
  #: src/Admin/Pages/MiscTab.php:114
621
  msgid "Hide Announcements"
622
  msgstr ""
623
 
624
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:123
625
  #: src/Admin/Pages/MiscTab.php:123
626
  msgid "Check this if you would like to hide plugin announcements and update details."
627
  msgstr ""
628
 
629
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:133
630
  #: src/Admin/Pages/MiscTab.php:133
631
  msgid "Hide Email Delivery Errors"
632
  msgstr ""
633
 
634
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:149
635
  #: src/Admin/Pages/MiscTab.php:149
636
  msgid "Check this if you would like to hide warnings alerting of email delivery errors."
637
  msgstr ""
638
 
639
  #. translators: %s - filter that was used to disabled.
640
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:156
641
  #: src/Admin/Pages/MiscTab.php:156
642
  msgid "Email Delivery Errors were disabled using a %s filter."
643
  msgstr ""
644
 
645
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:165
646
  #: src/Admin/Pages/MiscTab.php:165
647
  msgid "<strong>This is not recommended</strong> and should only be done for staging or development sites."
648
  msgstr ""
649
 
650
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:180
651
  #: src/Admin/Pages/MiscTab.php:180
652
  msgid "Uninstall WP Mail SMTP"
653
  msgstr ""
654
 
655
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:188
656
  #: src/Admin/Pages/MiscTab.php:188
657
  msgid "Check this if you would like to remove ALL WP Mail SMTP data upon plugin deletion. All settings will be unrecoverable."
658
  msgstr ""
659
 
660
- #: build/wp-mail-smtp-pro/src/Admin/Pages/MiscTab.php:223
661
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:540
662
- #: src/Admin/Pages/MiscTab.php:223
663
- #: src/Admin/Pages/SettingsTab.php:540
664
  msgid "Settings were successfully saved."
665
  msgstr ""
666
 
667
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:36
668
- #: src/Admin/Pages/SettingsTab.php:36
669
  msgid "General"
670
  msgstr ""
671
 
672
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:64
673
- #: src/Admin/Pages/SettingsTab.php:64
674
  msgid "License"
675
  msgstr ""
676
 
677
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:67
678
- #: src/Admin/Pages/SettingsTab.php:67
679
  msgid "Your license key provides access to updates and support."
680
  msgstr ""
681
 
682
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:75
683
- #: src/Admin/Pages/SettingsTab.php:75
684
  msgid "License Key"
685
  msgstr ""
686
 
687
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:85
688
- #: src/Admin/Pages/SettingsTab.php:85
689
  msgid "Mail"
690
  msgstr ""
691
 
692
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:92
693
- #: src/Admin/Pages/SettingsTab.php:92
694
  msgid "From Email"
695
  msgstr ""
696
 
697
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:103
698
- #: src/Admin/Pages/SettingsTab.php:103
 
 
 
699
  msgid "The email address which emails are sent from."
700
  msgstr ""
701
 
702
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:104
703
- #: src/Admin/Pages/SettingsTab.php:104
704
- msgid "If you using an email provider (Gmail, Yahoo, Outlook.com, etc) this should be your email address for that account."
705
  msgstr ""
706
 
707
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:107
708
- #: src/Admin/Pages/SettingsTab.php:107
709
  msgid "Please note that other plugins can change this, to prevent this use the setting below."
710
  msgstr ""
711
 
712
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:119
713
- #: src/Admin/Pages/SettingsTab.php:119
714
  msgid "Force From Email"
715
  msgstr ""
716
 
717
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:124
718
- #: src/Admin/Pages/SettingsTab.php:124
719
  msgid "Current provider will automatically force From Email to be the email address that you use to set up the connection below."
720
  msgstr ""
721
 
722
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:128
723
- #: src/Admin/Pages/SettingsTab.php:128
 
 
 
724
  msgid "If checked, the From Email setting above will be used for all emails, ignoring values set by other plugins."
725
  msgstr ""
726
 
727
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:138
728
- #: src/Admin/Pages/SettingsTab.php:138
729
  msgid "From Name"
730
  msgstr ""
731
 
732
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:149
733
- #: src/Admin/Pages/SettingsTab.php:149
734
  msgid "The name which emails are sent from."
735
  msgstr ""
736
 
737
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:161
738
- #: src/Admin/Pages/SettingsTab.php:161
739
  msgid "Force From Name"
740
  msgstr ""
741
 
742
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:166
743
- #: src/Admin/Pages/SettingsTab.php:166
744
  msgid "Current provider doesn't support setting and forcing From Name. Emails will be sent on behalf of the account name used to setup the connection below."
745
  msgstr ""
746
 
747
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:170
748
- #: src/Admin/Pages/SettingsTab.php:170
749
  msgid "If checked, the From Name setting above will be used for all emails, ignoring values set by other plugins."
750
  msgstr ""
751
 
752
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:179
753
- #: src/Admin/Pages/SettingsTab.php:179
754
  msgid "Return Path"
755
  msgstr ""
756
 
757
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:188
758
- #: src/Admin/Pages/SettingsTab.php:188
759
  msgid "Set the return-path to match the From Email"
760
  msgstr ""
761
 
762
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:192
763
- #: src/Admin/Pages/SettingsTab.php:192
764
  msgid "Return Path indicates where non-delivery receipts - or bounce messages - are to be sent."
765
  msgstr ""
766
 
767
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:193
768
- #: src/Admin/Pages/SettingsTab.php:193
769
  msgid "If unchecked, bounce messages may be lost. Some providers may ignore this option."
770
  msgstr ""
771
 
772
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:201
773
- #: src/Admin/Pages/SettingsTab.php:201
774
  msgid "Mailer"
775
  msgstr ""
776
 
777
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:242
778
- #: src/Admin/Pages/SettingsTab.php:242
779
  msgid "Don't see what you're looking for?"
780
  msgstr ""
781
 
782
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:244
783
- #: src/Admin/Pages/SettingsTab.php:244
784
  msgid "Suggest a Mailer"
785
  msgstr ""
786
 
787
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:272
788
- #: src/Admin/Pages/SettingsTab.php:272
789
  msgid "Dismiss this notice"
790
  msgstr ""
791
 
792
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:314
793
- #: src/Admin/Pages/SettingsTab.php:314
794
  msgid "You're using WP Mail SMTP Lite - no license needed. Enjoy!"
795
  msgstr ""
796
 
797
  #. translators: %s - WPMailSMTP.com upgrade URL.
798
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:320
799
- #: src/Admin/Pages/SettingsTab.php:320
800
  msgid "To unlock more features consider <strong><a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"wp-mail-smtp-upgrade-modal\">upgrading to PRO</a></strong>."
801
  msgstr ""
802
 
803
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:339
804
- #: src/Admin/Pages/SettingsTab.php:339
805
  msgid "As a valued WP Mail SMTP Lite user you receive <strong>$50 off</strong>, automatically applied at checkout!"
806
  msgstr ""
807
 
808
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:400
809
- #: src/Admin/Pages/SettingsTab.php:400
810
  msgid "Get WP Mail SMTP Pro and Unlock all the Powerful Features"
811
  msgstr ""
812
 
813
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:404
814
- #: src/Admin/Pages/SettingsTab.php:404
815
  msgid "Thanks for being a loyal WP Mail SMTP user. Upgrade to WP Mail SMTP Pro to unlock more awesome features and experience why WP Mail SMTP is the most popular SMTP plugin."
816
  msgstr ""
817
 
818
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:408
819
- #: src/Admin/Pages/SettingsTab.php:408
820
  msgid "We know that you will truly love WP Mail SMTP. It's used by over 1,000,000 websites."
821
  msgstr ""
822
 
823
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:411
824
- #: src/Admin/Pages/SettingsTab.php:411
825
  msgid "Pro Features:"
826
  msgstr ""
827
 
828
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:415
829
- #: src/Admin/Pages/SettingsTab.php:415
830
  msgid "Manage Notifications - control which emails your site sends"
831
  msgstr ""
832
 
833
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:416
834
- #: src/Admin/Pages/SettingsTab.php:416
835
  msgid "Email Logging - keep track of every email sent from your site"
836
  msgstr ""
837
 
838
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:417
839
- #: src/Admin/Pages/SettingsTab.php:417
840
  msgid "Office 365 - send emails using your Office 365 account"
841
  msgstr ""
842
 
843
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:418
844
- #: src/Admin/Pages/SettingsTab.php:418
845
  msgid "Amazon SES - harness the power of AWS"
846
  msgstr ""
847
 
848
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:419
849
- #: src/Admin/Pages/SettingsTab.php:419
850
  msgid "Outlook.com - send emails using your Outlook.com account"
851
  msgstr ""
852
 
853
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:420
854
- #: src/Admin/Pages/SettingsTab.php:420
855
  msgid "Access to our world class support team"
856
  msgstr ""
857
 
858
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:423
859
- #: src/Admin/Pages/SettingsTab.php:423
860
  msgid "White Glove Setup - sit back and relax while we handle everything for you"
861
  msgstr ""
862
 
863
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:424
864
- #: src/Admin/Pages/SettingsTab.php:424
865
  msgid "Install WP Mail SMTP Pro plugin"
866
  msgstr ""
867
 
868
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:425
869
- #: src/Admin/Pages/SettingsTab.php:425
870
  msgid "Set up domain name verification (DNS)"
871
  msgstr ""
872
 
873
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:426
874
- #: src/Admin/Pages/SettingsTab.php:426
875
  msgid "Configure Mailgun service"
876
  msgstr ""
877
 
878
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:427
879
- #: src/Admin/Pages/SettingsTab.php:427
880
  msgid "Set up WP Mail SMTP Pro plugin"
881
  msgstr ""
882
 
883
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:428
884
- #: src/Admin/Pages/SettingsTab.php:428
885
  msgid "Test and verify email delivery"
886
  msgstr ""
887
 
888
  #. translators: %s - WPMailSMTP.com URL.
889
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:436
890
- #: src/Admin/Pages/SettingsTab.php:436
891
  msgid "<a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Get WP Mail SMTP Pro Today and Unlock all the Powerful Features &raquo;</a>"
892
  msgstr ""
893
 
894
- #: build/wp-mail-smtp-pro/src/Admin/Pages/SettingsTab.php:454
895
- #: src/Admin/Pages/SettingsTab.php:454
896
  msgid "<strong>Bonus:</strong> WP Mail SMTP users get <span class=\"price-off\">$50 off regular price</span>, automatically applied at checkout."
897
  msgstr ""
898
 
899
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:37
900
  #: src/Admin/Pages/TestTab.php:37
901
  msgid "Email Test"
902
  msgstr ""
903
 
904
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:59
905
  #: src/Admin/Pages/TestTab.php:59
906
  msgid "Send a Test Email"
907
  msgstr ""
908
 
909
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:66
910
  #: src/Admin/Pages/TestTab.php:66
911
  msgid "Send To"
912
  msgstr ""
913
 
914
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:72
915
  #: src/Admin/Pages/TestTab.php:72
916
  msgid "Enter email address where test email will be sent."
917
  msgstr ""
918
 
919
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:80
920
  #: src/Admin/Pages/TestTab.php:80
921
  msgid "HTML"
922
  msgstr ""
923
 
924
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:86
925
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:264
926
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:286
927
  #: src/Admin/Pages/TestTab.php:86
928
  #: src/Providers/OptionsAbstract.php:264
929
  #: src/Providers/OptionsAbstract.php:286
930
  msgid "On"
931
  msgstr ""
932
 
933
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:87
934
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:265
935
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:287
936
  #: src/Admin/Pages/TestTab.php:87
937
  #: src/Providers/OptionsAbstract.php:265
938
  #: src/Providers/OptionsAbstract.php:287
939
  msgid "Off"
940
  msgstr ""
941
 
942
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:90
943
  #: src/Admin/Pages/TestTab.php:90
944
  msgid "Send this email in HTML or in plain text format."
945
  msgstr ""
946
 
947
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:110
948
  #: src/Admin/Pages/TestTab.php:110
949
  msgid "You cannot send an email. Mailer is not properly configured. Please check your settings."
950
  msgstr ""
951
 
952
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:114
953
  #: src/Admin/Pages/TestTab.php:114
954
  msgid "Send Email"
955
  msgstr ""
956
 
957
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:142
958
  #: src/Admin/Pages/TestTab.php:142
959
  msgid "Test failed. Please use a valid email address and try to resend the test email."
960
  msgstr ""
961
 
962
  #. translators: %s - email address a test email will be sent to.
963
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:154
964
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:160
965
  #: src/Admin/Pages/TestTab.php:154
966
  #: src/Admin/Pages/TestTab.php:160
967
  msgid "Test email to %s"
968
  msgstr ""
969
 
970
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:186
971
  #: src/Admin/Pages/TestTab.php:186
972
  msgid "Test plain text email was sent successfully!"
973
  msgstr ""
974
 
975
  #. translators: %s - "HTML" in bold.
976
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:190
977
  #: src/Admin/Pages/TestTab.php:190
978
  msgid "Test %s email was sent successfully! Please check your inbox to make sure it is delivered."
979
  msgstr ""
980
 
981
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:510
982
  #: src/Admin/Pages/TestTab.php:510
983
  msgid "SSL certificate issue."
984
  msgstr ""
985
 
986
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:511
987
  #: src/Admin/Pages/TestTab.php:511
988
  msgid "This means your web server cannot reliably make secure connections (make requests to HTTPS sites)."
989
  msgstr ""
990
 
991
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:512
992
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:560
993
  #: src/Admin/Pages/TestTab.php:512
994
  #: src/Admin/Pages/TestTab.php:560
995
  msgid "Typically this error is returned when web server is not configured properly."
996
  msgstr ""
997
 
998
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:515
999
  #: src/Admin/Pages/TestTab.php:515
1000
  msgid "Contact your web hosting provider and inform them your site has an issue with SSL certificates."
1001
  msgstr ""
1002
 
1003
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:516
1004
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:564
1005
  #: src/Admin/Pages/TestTab.php:516
1006
  #: src/Admin/Pages/TestTab.php:564
1007
  msgid "The exact error you can provide them is in the Error log, available at the bottom of this page."
1008
  msgstr ""
1009
 
1010
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:517
1011
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:565
1012
  #: src/Admin/Pages/TestTab.php:517
1013
  #: src/Admin/Pages/TestTab.php:565
1014
  msgid "Ask them to resolve the issue then try again."
1015
  msgstr ""
1016
 
1017
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:528
1018
  #: src/Admin/Pages/TestTab.php:528
1019
  msgid "Could not connect to host."
1020
  msgstr ""
1021
 
1022
  #. translators: %s - SMTP host address.
1023
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:531
1024
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:556
1025
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:658
1026
  #: src/Admin/Pages/TestTab.php:531
1027
  #: src/Admin/Pages/TestTab.php:556
1028
  #: src/Admin/Pages/TestTab.php:658
1029
  msgid "This means your web server was unable to connect to %s."
1030
  msgstr ""
1031
 
1032
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:534
1033
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:559
1034
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:661
1035
  #: src/Admin/Pages/TestTab.php:534
1036
  #: src/Admin/Pages/TestTab.php:559
1037
  #: src/Admin/Pages/TestTab.php:661
1038
  msgid "This means your web server was unable to connect to the host server."
1039
  msgstr ""
1040
 
1041
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:535
1042
  #: src/Admin/Pages/TestTab.php:535
1043
  msgid "Typically this error is returned your web server is blocking the connections or the SMTP host denying the request."
1044
  msgstr ""
1045
 
1046
  #. translators: %s - SMTP host address.
1047
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:539
1048
  #: src/Admin/Pages/TestTab.php:539
1049
  msgid "Contact your web hosting provider and ask them to verify your server can connect to %s. Additionally, ask them if a firewall or security policy may be preventing the connection."
1050
  msgstr ""
1051
 
1052
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:542
1053
  #: src/Admin/Pages/TestTab.php:542
1054
  msgid "If using \"Other SMTP\" Mailer, triple check your SMTP settings including host address, email, and password."
1055
  msgstr ""
1056
 
1057
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:543
1058
  #: src/Admin/Pages/TestTab.php:543
1059
  msgid "If using \"Other SMTP\" Mailer, contact your SMTP host to confirm they are accepting outside connections with the settings you have configured (address, username, port, security, etc)."
1060
  msgstr ""
1061
 
1062
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:553
1063
  #: src/Admin/Pages/TestTab.php:553
1064
  msgid "Could not connect to your host."
1065
  msgstr ""
1066
 
1067
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:563
1068
  #: src/Admin/Pages/TestTab.php:563
1069
  msgid "Contact your web hosting provider and inform them you are having issues making outbound connections."
1070
  msgstr ""
1071
 
1072
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:575
1073
  #: src/Admin/Pages/TestTab.php:575
1074
  msgid "Could not authenticate your SMTP account."
1075
  msgstr ""
1076
 
1077
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:576
1078
  #: src/Admin/Pages/TestTab.php:576
1079
  msgid "This means we were able to connect to your SMTP host, but were not able to proceed using the email/password in the settings."
1080
  msgstr ""
1081
 
1082
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:577
1083
  #: src/Admin/Pages/TestTab.php:577
1084
  msgid "Typically this error is returned when the email or password is not correct or is not what the SMTP host is expecting."
1085
  msgstr ""
1086
 
1087
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:580
1088
  #: src/Admin/Pages/TestTab.php:580
1089
  msgid "Triple check your SMTP settings including host address, email, and password. If you have recently reset your password you will need to update the settings."
1090
  msgstr ""
1091
 
1092
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:581
1093
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:686
1094
  #: src/Admin/Pages/TestTab.php:581
1095
  #: src/Admin/Pages/TestTab.php:686
1096
  msgid "Contact your SMTP host to confirm you are using the correct username and password."
1097
  msgstr ""
1098
 
1099
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:582
1100
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:687
1101
  #: src/Admin/Pages/TestTab.php:582
1102
  #: src/Admin/Pages/TestTab.php:687
1103
  msgid "Verify with your SMTP host that your account has permissions to send emails using outside connections."
1104
  msgstr ""
1105
 
1106
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:592
1107
  #: src/Admin/Pages/TestTab.php:592
1108
  msgid "Error due to unsolicited and/or bulk e-mail."
1109
  msgstr ""
1110
 
1111
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:593
1112
  #: src/Admin/Pages/TestTab.php:593
1113
  msgid "This means the connection to your SMTP host was made successfully, but the host rejected the email."
1114
  msgstr ""
1115
 
1116
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:594
1117
  #: src/Admin/Pages/TestTab.php:594
1118
  msgid "Typically this error is returned when you are sending too many e-mails or e-mails that have been identified as spam."
1119
  msgstr ""
1120
 
1121
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:597
1122
  #: src/Admin/Pages/TestTab.php:597
1123
  msgid "Check the emails that are sending are sending individually. Example: email is not sending to 30 recipients. You can install any WordPress e-mail logging plugin to do that."
1124
  msgstr ""
1125
 
1126
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:598
1127
  #: src/Admin/Pages/TestTab.php:598
1128
  msgid "Contact your SMTP host to ask about sending/rate limits."
1129
  msgstr ""
1130
 
1131
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:599
1132
  #: src/Admin/Pages/TestTab.php:599
1133
  msgid "Verify with them your SMTP account is in good standing and your account has not been flagged."
1134
  msgstr ""
1135
 
1136
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:609
1137
  #: src/Admin/Pages/TestTab.php:609
1138
  msgid "Unauthenticated senders are not allowed."
1139
  msgstr ""
1140
 
1141
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:610
1142
  #: src/Admin/Pages/TestTab.php:610
1143
  msgid "This means the connection to your SMTP host was made successfully, but you should enable Authentication and provide correct Username and Password."
1144
  msgstr ""
1145
 
1146
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:613
1147
  #: src/Admin/Pages/TestTab.php:613
1148
  msgid "Go to WP Mail SMTP plugin Settings page."
1149
  msgstr ""
1150
 
1151
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:614
1152
  #: src/Admin/Pages/TestTab.php:614
1153
  msgid "Enable Authentication"
1154
  msgstr ""
1155
 
1156
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:615
1157
  #: src/Admin/Pages/TestTab.php:615
1158
  msgid "Enter correct SMTP Username (usually this is an email address) and Password in the appropriate fields."
1159
  msgstr ""
1160
 
1161
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:627
1162
  #: src/Admin/Pages/TestTab.php:627
1163
  msgid "Misconfigured server certificate."
1164
  msgstr ""
1165
 
1166
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:628
1167
  #: src/Admin/Pages/TestTab.php:628
1168
  msgid "This means OpenSSL on your server isn't able to verify the host certificate."
1169
  msgstr ""
1170
 
1171
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:629
1172
  #: src/Admin/Pages/TestTab.php:629
1173
  msgid "There are a few reasons why this is happening. It could be that the host certificate is misconfigured, or this server's OpenSSL is using an outdated CA bundle."
1174
  msgstr ""
1175
 
1176
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:632
1177
  #: src/Admin/Pages/TestTab.php:632
1178
  msgid "Verify that the host's SSL certificate is valid."
1179
  msgstr ""
1180
 
1181
  #. translators: %s - URL to the PHP openssl manual
1182
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:635
1183
  #: src/Admin/Pages/TestTab.php:635
1184
  msgid "Contact your hosting support, show them the \"full Error Log for debugging\" below and share this <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">link</a> with them."
1185
  msgstr ""
1186
 
1187
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:655
1188
  #: src/Admin/Pages/TestTab.php:655
1189
  msgid "Could not connect to the SMTP host."
1190
  msgstr ""
1191
 
1192
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:662
1193
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1048
1194
  #: src/Admin/Pages/TestTab.php:662
1195
  #: src/Admin/Pages/TestTab.php:1048
1196
  msgid "Typically this error is returned for one of the following reasons:"
1197
  msgstr ""
1198
 
1199
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:663
1200
  #: src/Admin/Pages/TestTab.php:663
1201
  msgid "SMTP settings are incorrect (wrong port, security setting, incorrect host)."
1202
  msgstr ""
1203
 
1204
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:664
1205
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1050
1206
  #: src/Admin/Pages/TestTab.php:664
1207
  #: src/Admin/Pages/TestTab.php:1050
1208
  msgid "Your web server is blocking the connection."
1209
  msgstr ""
1210
 
1211
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:665
1212
  #: src/Admin/Pages/TestTab.php:665
1213
  msgid "Your SMTP host is rejecting the connection."
1214
  msgstr ""
1215
 
1216
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:668
1217
  #: src/Admin/Pages/TestTab.php:668
1218
  msgid "Triple check your SMTP settings including host address, email, and password, port, and security."
1219
  msgstr ""
1220
 
1221
  #. translators: %1$s - SMTP host address, %2$s - SMTP port, %3$s - SMTP encryption.
1222
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:671
1223
  #: src/Admin/Pages/TestTab.php:671
1224
  msgid "Contact your web hosting provider and ask them to verify your server can connect to %1$s on port %2$s using %3$s encryption. Additionally, ask them if a firewall or security policy may be preventing the connection - many shared hosts block certain ports.<br><strong>Note: this is the most common cause of this issue.</strong>"
1225
  msgstr ""
1226
 
1227
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:684
1228
  #: src/Admin/Pages/TestTab.php:684
1229
  msgid "no"
1230
  msgstr ""
1231
 
1232
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:697
1233
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:712
1234
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:728
1235
  #: src/Admin/Pages/TestTab.php:697
1236
  #: src/Admin/Pages/TestTab.php:712
1237
  #: src/Admin/Pages/TestTab.php:728
1238
  msgid "Mailgun failed."
1239
  msgstr ""
1240
 
1241
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:698
1242
  #: src/Admin/Pages/TestTab.php:698
1243
  msgid "It seems that you forgot to activate your Mailgun account."
1244
  msgstr ""
1245
 
1246
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:701
1247
  #: src/Admin/Pages/TestTab.php:701
1248
  msgid "Check your inbox you used to create a Mailgun account. Click the activation link in an email from Mailgun."
1249
  msgstr ""
1250
 
1251
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:702
1252
  #: src/Admin/Pages/TestTab.php:702
1253
  msgid "If you do not see activation email, go to your Mailgun control panel and resend the activation email."
1254
  msgstr ""
1255
 
1256
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:713
1257
  #: src/Admin/Pages/TestTab.php:713
1258
  msgid "Typically this error is because there is an issue with your Mailgun settings, in many cases the API key."
1259
  msgstr ""
1260
 
1261
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:716
1262
  #: src/Admin/Pages/TestTab.php:716
1263
  msgid "Verify your API key is correct."
1264
  msgstr ""
1265
 
1266
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:717
1267
  #: src/Admin/Pages/TestTab.php:717
1268
  msgid "Go to your Mailgun account and view your API key."
1269
  msgstr ""
1270
 
1271
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:718
1272
  #: src/Admin/Pages/TestTab.php:718
1273
  msgid "Note that the API key includes the \"key\" prefix, so make sure that it is in the WP Mail SMTP Mailgun API setting."
1274
  msgstr ""
1275
 
1276
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:729
1277
  #: src/Admin/Pages/TestTab.php:729
1278
  msgid "Your Mailgun account does not have access to send emails."
1279
  msgstr ""
1280
 
1281
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:730
1282
  #: src/Admin/Pages/TestTab.php:730
1283
  msgid "Typically this error is because you have not set up and/or complete domain name verification for your Mailgun account."
1284
  msgstr ""
1285
 
1286
  #. translators: %s - Mailgun documentation URL.
1287
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:735
1288
  #: src/Admin/Pages/TestTab.php:735
1289
  msgid "Go to our how-to guide for setting up <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Mailgun with WP Mail SMTP</a>."
1290
  msgstr ""
1291
 
1292
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:746
1293
  #: src/Admin/Pages/TestTab.php:746
1294
  msgid "Complete the steps in section \"2. Verify Your Domain\"."
1295
  msgstr ""
1296
 
1297
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:756
1298
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:805
1299
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:825
1300
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:851
1301
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:867
1302
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:919
1303
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:945
1304
  #: src/Admin/Pages/TestTab.php:756
1305
  #: src/Admin/Pages/TestTab.php:805
1306
  #: src/Admin/Pages/TestTab.php:825
@@ -1311,767 +1042,642 @@ msgstr ""
1311
  msgid "Google API Error."
1312
  msgstr ""
1313
 
1314
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:757
1315
  #: src/Admin/Pages/TestTab.php:757
1316
  msgid "You have not properly configured Gmail mailer."
1317
  msgstr ""
1318
 
1319
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:758
1320
  #: src/Admin/Pages/TestTab.php:758
1321
  msgid "Make sure that you have clicked the \"Allow plugin to send emails using your Google account\" button under Gmail settings."
1322
  msgstr ""
1323
 
1324
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:761
1325
  #: src/Admin/Pages/TestTab.php:761
1326
  msgid "Go to plugin Settings page and click the \"Allow plugin to send emails using your Google account\" button."
1327
  msgstr ""
1328
 
1329
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:762
1330
  #: src/Admin/Pages/TestTab.php:762
1331
  msgid "After the click you should be redirected to a Gmail authorization screen, where you will be asked a permission to send emails on your behalf."
1332
  msgstr ""
1333
 
1334
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:763
1335
  #: src/Admin/Pages/TestTab.php:763
1336
  msgid "Please click \"Agree\", if you see that button. If not - you will need to enable less secure apps first:"
1337
  msgstr ""
1338
 
1339
  #. translators: %s - Google support article URL.
1340
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:768
1341
  #: src/Admin/Pages/TestTab.php:768
1342
  msgid "if you are using regular Gmail account, please <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">read this article</a> to proceed."
1343
  msgstr ""
1344
 
1345
  #. translators: %s - Google support article URL.
1346
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:783
1347
  #: src/Admin/Pages/TestTab.php:783
1348
  msgid "if you are using G Suite, please <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">read this article</a> to proceed."
1349
  msgstr ""
1350
 
1351
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:806
1352
  #: src/Admin/Pages/TestTab.php:806
1353
  msgid "Typically this error is because address the email was sent to is invalid or was empty."
1354
  msgstr ""
1355
 
1356
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:809
1357
  #: src/Admin/Pages/TestTab.php:809
1358
  msgid "Check the \"Send To\" email address used and confirm it is a valid email and was not empty."
1359
  msgstr ""
1360
 
1361
  #. translators: 1 - correct email address example. 2 - incorrect email address example.
1362
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:811
1363
  #: src/Admin/Pages/TestTab.php:811
1364
  msgid "It should be something like this: %1$s. These are incorrect values: %2$s."
1365
  msgstr ""
1366
 
1367
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:815
1368
  #: src/Admin/Pages/TestTab.php:815
1369
  msgid "Make sure that the generated email has a TO header, useful when you are responsible for email creation."
1370
  msgstr ""
1371
 
1372
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:826
1373
  #: src/Admin/Pages/TestTab.php:826
1374
  msgid "Unfortunately, this error can be due to many different reasons."
1375
  msgstr ""
1376
 
1377
  #. translators: %s - Blog article URL.
1378
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:831
1379
  #: src/Admin/Pages/TestTab.php:831
1380
  msgid "Please <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">read this article</a> to learn more about what can cause this error and how it can be resolved."
1381
  msgstr ""
1382
 
1383
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:852
1384
  #: src/Admin/Pages/TestTab.php:852
1385
  msgid "Authentication code that Google returned to you has already been used on your previous auth attempt."
1386
  msgstr ""
1387
 
1388
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:855
1389
  #: src/Admin/Pages/TestTab.php:855
1390
  msgid "Make sure that you are not trying to manually clean up the plugin options to retry the \"Allow...\" step."
1391
  msgstr ""
1392
 
1393
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:856
1394
  #: src/Admin/Pages/TestTab.php:856
1395
  msgid "Reinstall the plugin with clean plugin data turned on on Misc page. This will remove all the plugin options and you will be safe to retry."
1396
  msgstr ""
1397
 
1398
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:857
1399
  #: src/Admin/Pages/TestTab.php:857
1400
  msgid "Make sure there is no aggressive caching on site admin area pages or try to clean cache between attempts."
1401
  msgstr ""
1402
 
1403
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:868
1404
  #: src/Admin/Pages/TestTab.php:868
1405
  msgid "There are various reasons for that, please review the steps below."
1406
  msgstr ""
1407
 
1408
  #. translators: %s - Google G Suite Admin area URL.
1409
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:873
1410
  #: src/Admin/Pages/TestTab.php:873
1411
  msgid "Make sure that your G Suite trial period has not expired. You can check the status <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>."
1412
  msgstr ""
1413
 
1414
  #. translators: %s - Google G Suite Admin area URL.
1415
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:886
1416
  #: src/Admin/Pages/TestTab.php:886
1417
  msgid "Make sure that Gmail app in your G Suite is actually enabled. You can check that in Apps list in <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">G Suite Admin</a> area."
1418
  msgstr ""
1419
 
1420
  #. translators: %s - Google Developers Console URL.
1421
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:899
1422
  #: src/Admin/Pages/TestTab.php:899
1423
  msgid "Make sure that you have Gmail API enabled, and you can do that <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>."
1424
  msgstr ""
1425
 
1426
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:922
1427
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:949
1428
  #: src/Admin/Pages/TestTab.php:922
1429
  #: src/Admin/Pages/TestTab.php:949
1430
  msgid "Make sure that the used Client ID/Secret correspond to a proper project that has Gmail API enabled."
1431
  msgstr ""
1432
 
1433
  #. translators: %s - Gmail documentation URL.
1434
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:925
1435
  #: src/Admin/Pages/TestTab.php:925
1436
  msgid "Please follow our <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Gmail tutorial</a> to be sure that all the correct project and data is applied."
1437
  msgstr ""
1438
 
1439
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:946
1440
  #: src/Admin/Pages/TestTab.php:946
1441
  msgid "You may have added a new API to a project"
1442
  msgstr ""
1443
 
1444
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:950
1445
  #: src/Admin/Pages/TestTab.php:950
1446
  msgid "Try to use a separate project for your emails, so the project has only 1 Gmail API in it enabled. You will need to remove the old project and create a new one from scratch."
1447
  msgstr ""
1448
 
1449
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:960
1450
  #: src/Admin/Pages/TestTab.php:960
1451
  msgid "SMTP.com API Error."
1452
  msgstr ""
1453
 
1454
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:961
1455
  #: src/Admin/Pages/TestTab.php:961
1456
  msgid "Your Sender Name option is incorrect."
1457
  msgstr ""
1458
 
1459
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:964
1460
  #: src/Admin/Pages/TestTab.php:964
1461
  msgid "Please make sure you entered an accurate Sender Name in WP Mail SMTP plugin settings."
1462
  msgstr ""
1463
 
1464
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:974
1465
  #: src/Admin/Pages/TestTab.php:974
1466
  msgid "GuzzleHttp requirements."
1467
  msgstr ""
1468
 
1469
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:975
1470
  #: src/Admin/Pages/TestTab.php:975
1471
  msgid "GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler."
1472
  msgstr ""
1473
 
1474
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:978
1475
  #: src/Admin/Pages/TestTab.php:978
1476
  msgid "Edit your php.ini file on your hosting server."
1477
  msgstr ""
1478
 
1479
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:979
1480
  #: src/Admin/Pages/TestTab.php:979
1481
  msgid "(Recommended) Enable PHP extension: cURL, by adding \"extension=curl\" to the php.ini file (without the quotation marks) OR"
1482
  msgstr ""
1483
 
1484
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:980
1485
  #: src/Admin/Pages/TestTab.php:980
1486
  msgid "(If cURL can't be enabled on your hosting server) Enable PHP setting: allow_url_fopen, by adding \"allow_url_fopen = On\" to the php.ini file (without the quotation marks)"
1487
  msgstr ""
1488
 
1489
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:981
1490
  #: src/Admin/Pages/TestTab.php:981
1491
  msgid "If you don't know how to do the above we strongly suggest contacting your hosting support and provide them the \"full Error Log for debugging\" below and these steps. They should be able to fix this issue for you."
1492
  msgstr ""
1493
 
1494
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1003
1495
  #: src/Admin/Pages/TestTab.php:1003
1496
  msgid "PCRE library issue"
1497
  msgstr ""
1498
 
1499
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1004
1500
  #: src/Admin/Pages/TestTab.php:1004
1501
  msgid "It looks like your server is running PHP version 7.4.x with an outdated PCRE library (libpcre2) that has a known issue with email address validation."
1502
  msgstr ""
1503
 
1504
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1005
1505
  #: src/Admin/Pages/TestTab.php:1005
1506
  msgid "There is a known issue with PHP version 7.4.x, when using libpcre2 library version lower than 10.33."
1507
  msgstr ""
1508
 
1509
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1008
1510
  #: src/Admin/Pages/TestTab.php:1008
1511
  msgid "Contact your web hosting provider and inform them you are having issues with libpcre2 library on PHP 7.4."
1512
  msgstr ""
1513
 
1514
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1009
1515
  #: src/Admin/Pages/TestTab.php:1009
1516
  msgid "They should be able to resolve this issue for you."
1517
  msgstr ""
1518
 
1519
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1010
1520
  #: src/Admin/Pages/TestTab.php:1010
1521
  msgid "For a quick fix, until your web hosting resolves this, you can downgrade to PHP version 7.3 on your server."
1522
  msgstr ""
1523
 
1524
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1046
1525
  #: src/Admin/Pages/TestTab.php:1046
1526
  msgid "An issue was detected."
1527
  msgstr ""
1528
 
1529
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1047
1530
  #: src/Admin/Pages/TestTab.php:1047
1531
  msgid "This means your test email was unable to be sent."
1532
  msgstr ""
1533
 
1534
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1049
1535
  #: src/Admin/Pages/TestTab.php:1049
1536
  msgid "Plugin settings are incorrect (wrong SMTP settings, invalid Mailer configuration, etc)."
1537
  msgstr ""
1538
 
1539
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1051
1540
  #: src/Admin/Pages/TestTab.php:1051
1541
  msgid "Your host is rejecting the connection."
1542
  msgstr ""
1543
 
1544
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1054
1545
  #: src/Admin/Pages/TestTab.php:1054
1546
  msgid "Triple check the plugin settings, consider reconfiguring to make sure everything is correct (eg bad copy and paste)."
1547
  msgstr ""
1548
 
1549
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1056
1550
  #: src/Admin/Pages/TestTab.php:1056
1551
  msgid "Contact your web hosting provider and ask them to verify your server can make outside connections. Additionally, ask them if a firewall or security policy may be preventing the connection - many shared hosts block certain ports.<br><strong>Note: this is the most common cause of this issue.</strong>"
1552
  msgstr ""
1553
 
1554
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1062
1555
  #: src/Admin/Pages/TestTab.php:1062
1556
  msgid "Try using a different mailer."
1557
  msgstr ""
1558
 
1559
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1081
1560
  #: src/Admin/Pages/TestTab.php:1081
1561
  msgid "There was a problem while sending the test email."
1562
  msgstr ""
1563
 
1564
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1091
1565
  #: src/Admin/Pages/TestTab.php:1091
1566
  msgid "Recommended next steps:"
1567
  msgstr ""
1568
 
1569
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1101
1570
  #: src/Admin/Pages/TestTab.php:1101
1571
  msgid "Need support?"
1572
  msgstr ""
1573
 
1574
  #. translators: %s - WPMailSMTP.com account area link.
1575
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1109
1576
  #: src/Admin/Pages/TestTab.php:1109
1577
  msgid "As a WP Mail SMTP Pro user you have access to WP Mail SMTP priority support. Please log in to your WPMailSMTP.com account and <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">submit a support ticket</a>."
1578
  msgstr ""
1579
 
1580
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1126
1581
  #: src/Admin/Pages/TestTab.php:1126
1582
  msgid "WP Mail SMTP is a free plugin, and the team behind WPForms maintains it to give back to the WordPress community."
1583
  msgstr ""
1584
 
1585
  #. translators: %s - WPMailSMTP.com URL.
1586
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1133
1587
  #: src/Admin/Pages/TestTab.php:1133
1588
  msgid "To access our world class support, please <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">upgrade to WP Mail SMTP Pro</a>. Along with getting expert support, you will also get Notification controls, Email Logging, and integrations for Amazon SES, Office 365, and Outlook.com."
1589
  msgstr ""
1590
 
1591
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1148
1592
  #: src/Admin/Pages/TestTab.php:1148
1593
  msgid "Additionally, you can take advantage of our White Glove Setup. Sit back and relax while we handle everything for you! If you simply don't have time or maybe you feel a bit in over your head - we got you covered."
1594
  msgstr ""
1595
 
1596
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1154
1597
  #: src/Admin/Pages/TestTab.php:1154
1598
  msgid "As a valued WP Mail SMTP user, you will get <span class=\"price-off\">$50 off regular pricing</span>, automatically applied at checkout!"
1599
  msgstr ""
1600
 
1601
  #. translators: %1$s - WP Mail SMTP support policy URL, %2$s - WP Mail SMTP support forum URL, %3$s - WPMailSMTP.com URL.
1602
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1168
1603
  #: src/Admin/Pages/TestTab.php:1168
1604
  msgid "Alternatively, we also offer <a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">limited support</a> on the WordPress.org support forums. You can <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">create a support thread</a> there, but please understand that free support is not guaranteed and is limited to simple issues. If you have an urgent or complex issue, then please consider <a href=\"%3$s\" target=\"_blank\" rel=\"noopener noreferrer\">upgrading to WP Mail SMTP Pro</a> to access our priority support ticket system."
1605
  msgstr ""
1606
 
1607
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1189
1608
  #: src/Admin/Pages/TestTab.php:1189
1609
  msgid "Click here to view the full Error Log for debugging"
1610
  msgstr ""
1611
 
1612
- #: build/wp-mail-smtp-pro/src/Admin/Pages/TestTab.php:1198
1613
  #: src/Admin/Pages/TestTab.php:1198
1614
  msgid "Please copy only the content of the error debug message above, identified with an orange left border, into the support forum topic if you experience any issues."
1615
  msgstr ""
1616
 
1617
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:119
1618
  #: src/Admin/Review.php:119
1619
  msgid "Are you enjoying WP Mail SMTP?"
1620
  msgstr ""
1621
 
1622
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:121
1623
  #: src/Admin/Review.php:121
1624
  msgid "Yes"
1625
  msgstr ""
1626
 
1627
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:122
1628
  #: src/Admin/Review.php:122
1629
  msgid "Not Really"
1630
  msgstr ""
1631
 
1632
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:126
1633
  #: src/Admin/Review.php:126
1634
  msgid "We're sorry to hear you aren't enjoying WP Mail SMTP. We would love a chance to improve. Could you take a minute and let us know what we can do better?"
1635
  msgstr ""
1636
 
1637
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:129
1638
  #: src/Admin/Review.php:129
1639
  msgid "Give Feedback"
1640
  msgstr ""
1641
 
1642
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:132
1643
  #: src/Admin/Review.php:132
1644
  msgid "No thanks"
1645
  msgstr ""
1646
 
1647
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:137
1648
  #: src/Admin/Review.php:137
1649
  msgid "That’s awesome! Could you please do me a BIG favor and give it a 5-star rating on WordPress to help us spread the word and boost our motivation?"
1650
  msgstr ""
1651
 
1652
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:138
1653
  #: src/Admin/Review.php:138
1654
  msgid "~ Jared Atchison<br>Lead Developer, WP Mail SMTP"
1655
  msgstr ""
1656
 
1657
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:141
1658
  #: src/Admin/Review.php:141
1659
  msgid "Ok, you deserve it"
1660
  msgstr ""
1661
 
1662
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:143
1663
  #: src/Admin/Review.php:143
1664
  msgid "Nope, maybe later"
1665
  msgstr ""
1666
 
1667
- #: build/wp-mail-smtp-pro/src/Admin/Review.php:144
1668
  #: src/Admin/Review.php:144
1669
  msgid "I already did"
1670
  msgstr ""
1671
 
1672
  #. translators: %1$s - Plugin name causing conflict; %2$s - Plugin name causing conflict.
1673
- #: build/wp-mail-smtp-pro/src/Conflicts.php:159
1674
  #: src/Conflicts.php:159
1675
  msgid "Heads up! WP Mail SMTP has detected %1$s is activated. Please deactivate %2$s to prevent conflicts."
1676
  msgstr ""
1677
 
1678
  #. translators: %1$s - WP Mail SMTP plugin name; %2$s - WPMailSMTP.com URL to a related doc.
1679
- #: build/wp-mail-smtp-pro/src/Core.php:367
1680
- #: src/Core.php:367
1681
  msgid "Your site is running an outdated version of PHP that is no longer supported and may cause issues with %1$s. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Read more</a> for additional information."
1682
  msgstr ""
1683
 
1684
- #: build/wp-mail-smtp-pro/src/Core.php:381
1685
- #: src/Core.php:381
1686
  msgid "<strong>Please Note:</strong> Support for PHP 5.5 will be discontinued in 2020. After this, if no further action is taken, WP Mail SMTP functionality will be disabled."
1687
  msgstr ""
1688
 
1689
  #. translators: %s - plugin name and its version.
1690
- #: build/wp-mail-smtp-pro/src/Core.php:415
1691
- #: src/Core.php:415
1692
  msgid "<strong>EMAILING DISABLED:</strong> The %s is currently blocking all emails from being sent."
1693
  msgstr ""
1694
 
1695
  #. translators: %1$s - constant name; %2$s - constant value.
1696
- #: build/wp-mail-smtp-pro/src/Core.php:426
1697
- #: src/Core.php:426
1698
  msgid "To send emails, change the value of the %1$s constant to %2$s."
1699
  msgstr ""
1700
 
1701
  #. translators: %s - plugin Misc settings page URL.
1702
- #: build/wp-mail-smtp-pro/src/Core.php:437
1703
- #: src/Core.php:437
1704
  msgid "To send emails, go to plugin <a href=\"%s\">Misc settings</a> and disable the \"Do Not Send\" option."
1705
  msgstr ""
1706
 
1707
  #. translators: %s - plugin name and its version.
1708
- #: build/wp-mail-smtp-pro/src/Core.php:469
1709
- #: src/Core.php:469
1710
  msgid "<strong>EMAIL DELIVERY ERROR:</strong> the plugin %s logged this error during the last time it tried to send an email:"
1711
  msgstr ""
1712
 
1713
- #: build/wp-mail-smtp-pro/src/Core.php:499
1714
- #: src/Core.php:499
1715
  msgid "Consider running an email test after fixing it."
1716
  msgstr ""
1717
 
1718
  #. translators: %1$s - WP Mail SMTP, %2$s - error message.
1719
- #: build/wp-mail-smtp-pro/src/Migration.php:137
1720
  #: src/Migration.php:137
1721
  msgid "There was an error while upgrading the database. Please contact %1$s support with this information: %2$s."
1722
  msgstr ""
1723
 
1724
- #: build/wp-mail-smtp-pro/src/Pro/Providers/Providers.php:158
1725
  #: src/Pro/Providers/Providers.php:158
1726
  msgid "OK"
1727
  msgstr ""
1728
 
1729
- #: build/wp-mail-smtp-pro/src/Pro/SiteHealth.php:58
1730
  #: src/Pro/SiteHealth.php:58
1731
  msgid "Is wpmailsmtp.com reachable?"
1732
  msgstr ""
1733
 
1734
- #: build/wp-mail-smtp-pro/src/Providers/AmazonSES/Options.php:25
1735
  #: src/Providers/AmazonSES/Options.php:25
1736
  msgid "Amazon SES"
1737
  msgstr ""
1738
 
1739
- #: build/wp-mail-smtp-pro/src/Providers/AmazonSES/Options.php:39
1740
  #: src/Providers/AmazonSES/Options.php:39
1741
  msgid "We're sorry, the Amazon SES mailer is not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features."
1742
  msgstr ""
1743
 
1744
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Auth.php:170
1745
- #: src/Providers/Gmail/Auth.php:170
1746
  msgid "There was an error while processing the Google authentication request. Please make sure that you have Client ID and Client Secret both valid and saved."
1747
  msgstr ""
1748
 
1749
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Mailer.php:258
1750
- #: src/Providers/Gmail/Mailer.php:258
1751
  msgid "Please re-grant Google app permissions!"
1752
  msgstr ""
1753
 
1754
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Mailer.php:259
1755
- #: src/Providers/Gmail/Mailer.php:259
1756
  msgid "Go to WP Mail SMTP plugin settings page. Click the “Remove Connection” button."
1757
  msgstr ""
1758
 
1759
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Mailer.php:260
1760
- #: src/Providers/Gmail/Mailer.php:260
1761
  msgid "Then click the “Allow plugin to send emails using your Google account” button and re-enable access."
1762
  msgstr ""
1763
 
1764
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:32
1765
  #: src/Providers/Gmail/Options.php:32
1766
  msgid "Gmail"
1767
  msgstr ""
1768
 
1769
  #. translators: %s - URL to our Gmail doc.
1770
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:35
1771
  #: src/Providers/Gmail/Options.php:35
1772
  msgid "Send emails using your Gmail or G Suite (formerly Google Apps) account, all while keeping your login credentials safe. Other Google SMTP methods require enabling less secure apps in your account and entering your password. However, this integration uses the Google API to improve email delivery issues while keeping your site secure.<br><br>Read our <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Gmail documentation</a> to learn how to configure Gmail or G Suite."
1773
  msgstr ""
1774
 
1775
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:48
1776
  #: src/Providers/Gmail/Options.php:48
1777
  msgid "The Gmail mailer works well for sites that send low numbers of emails. However, Gmail's API has rate limitations and a number of additional restrictions that can lead to challenges during setup. If you expect to send a high volume of emails, or if you find that your web host is not compatible with the Gmail API restrictions, then we recommend considering a different mailer option."
1778
  msgstr ""
1779
 
1780
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:72
1781
  #: src/Providers/Gmail/Options.php:72
1782
  msgid "Client ID"
1783
  msgstr ""
1784
 
1785
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:87
1786
  #: src/Providers/Gmail/Options.php:87
1787
  msgid "Client Secret"
1788
  msgstr ""
1789
 
1790
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:109
1791
  #: src/Providers/Gmail/Options.php:109
1792
  msgid "Authorized redirect URI"
1793
  msgstr ""
1794
 
1795
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:117
1796
  #: src/Providers/Gmail/Options.php:117
1797
  msgid "Copy URL to clipboard"
1798
  msgstr ""
1799
 
1800
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:122
1801
  #: src/Providers/Gmail/Options.php:122
1802
  msgid "Please copy this URL into the \"Authorized redirect URIs\" field of your Google web application."
1803
  msgstr ""
1804
 
1805
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:131
1806
  #: src/Providers/Gmail/Options.php:131
1807
  msgid "Authorization"
1808
  msgstr ""
1809
 
1810
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:159
1811
  #: src/Providers/Gmail/Options.php:159
1812
  msgid "Allow plugin to send emails using your Google account"
1813
  msgstr ""
1814
 
1815
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:162
1816
  #: src/Providers/Gmail/Options.php:162
1817
  msgid "Click the button above to confirm authorization."
1818
  msgstr ""
1819
 
1820
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:168
1821
  #: src/Providers/Gmail/Options.php:168
1822
  msgid "Remove Connection"
1823
  msgstr ""
1824
 
1825
  #. translators: %s - email address, as received from Google API.
1826
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:177
1827
  #: src/Providers/Gmail/Options.php:177
1828
  msgid "Connected as %s"
1829
  msgstr ""
1830
 
1831
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:184
1832
- #: src/Providers/Gmail/Options.php:184
 
 
 
 
1833
  msgid "Removing the connection will give you an ability to redo the connection or link to another Google account."
1834
  msgstr ""
1835
 
1836
- #: build/wp-mail-smtp-pro/src/Providers/Gmail/Options.php:192
1837
- #: src/Providers/Gmail/Options.php:192
1838
  msgid "You need to save settings with Client ID and Client Secret before you can proceed."
1839
  msgstr ""
1840
 
1841
- #: build/wp-mail-smtp-pro/src/Providers/Mail/Options.php:25
1842
  #: src/Providers/Mail/Options.php:25
1843
  msgid "Default (none)"
1844
  msgstr ""
1845
 
1846
- #: build/wp-mail-smtp-pro/src/Providers/Mail/Options.php:37
1847
  #: src/Providers/Mail/Options.php:37
1848
  msgid "You currently have the native WordPress option selected. Please select any other Mailer option above to continue the setup."
1849
  msgstr ""
1850
 
1851
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:25
 
 
 
 
 
 
 
 
 
 
 
1852
  #: src/Providers/Mailgun/Options.php:25
1853
  msgid "Mailgun"
1854
  msgstr ""
1855
 
1856
  #. translators: %1$s - opening link tag; %2$s - closing link tag; %3$s - opening link tag; %4$s - closing link tag.
1857
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:29
1858
  #: src/Providers/Mailgun/Options.php:29
1859
  msgid "%1$sMailgun%2$s is one of the leading transactional email services trusted by over 150,000+ businesses. They provide 5,000 free emails per month for 3 months.<br><br>Read our %3$sMailgun documentation%4$s to learn how to configure Mailgun and improve your email deliverability."
1860
  msgstr ""
1861
 
1862
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:57
1863
  #: src/Providers/Mailgun/Options.php:57
1864
  msgid "Private API Key"
1865
  msgstr ""
1866
 
1867
  #. translators: %s - API key link.
1868
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:76
1869
  #: src/Providers/Mailgun/Options.php:76
1870
  msgid "Follow this link to get an API Key from Mailgun: %s."
1871
  msgstr ""
1872
 
1873
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:78
1874
  #: src/Providers/Mailgun/Options.php:78
1875
  msgid "Get a Private API Key"
1876
  msgstr ""
1877
 
1878
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:89
1879
  #: src/Providers/Mailgun/Options.php:89
1880
  msgid "Domain Name"
1881
  msgstr ""
1882
 
1883
  #. translators: %s - Domain Name link.
1884
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:101
1885
  #: src/Providers/Mailgun/Options.php:101
1886
  msgid "Follow this link to get a Domain Name from Mailgun: %s."
1887
  msgstr ""
1888
 
1889
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:103
1890
  #: src/Providers/Mailgun/Options.php:103
1891
  msgid "Get a Domain Name"
1892
  msgstr ""
1893
 
1894
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:114
1895
  #: src/Providers/Mailgun/Options.php:114
1896
  msgid "Region"
1897
  msgstr ""
1898
 
1899
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:124
1900
  #: src/Providers/Mailgun/Options.php:124
1901
  msgid "US"
1902
  msgstr ""
1903
 
1904
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:133
1905
  #: src/Providers/Mailgun/Options.php:133
1906
  msgid "EU"
1907
  msgstr ""
1908
 
1909
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:137
1910
  #: src/Providers/Mailgun/Options.php:137
1911
  msgid "Define which endpoint you want to use for sending messages."
1912
  msgstr ""
1913
 
1914
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:138
1915
  #: src/Providers/Mailgun/Options.php:138
1916
  msgid "If you are operating under EU laws, you may be required to use EU region."
1917
  msgstr ""
1918
 
1919
  #. translators: %s - URL to Mailgun.com page.
1920
- #: build/wp-mail-smtp-pro/src/Providers/Mailgun/Options.php:143
1921
  #: src/Providers/Mailgun/Options.php:143
1922
  msgid "<a href=\"%s\" rel=\"\" target=\"_blank\">More information</a> on Mailgun.com."
1923
  msgstr ""
1924
 
1925
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:186
1926
  #: src/Providers/OptionsAbstract.php:186
1927
  msgid "SMTP Host"
1928
  msgstr ""
1929
 
1930
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:200
1931
  #: src/Providers/OptionsAbstract.php:200
1932
  msgid "Encryption"
1933
  msgstr ""
1934
 
1935
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:210
1936
  #: src/Providers/OptionsAbstract.php:210
1937
  msgid "None"
1938
  msgstr ""
1939
 
1940
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:219
1941
  #: src/Providers/OptionsAbstract.php:219
1942
  msgid "SSL"
1943
  msgstr ""
1944
 
1945
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:228
1946
  #: src/Providers/OptionsAbstract.php:228
1947
  msgid "TLS"
1948
  msgstr ""
1949
 
1950
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:232
1951
  #: src/Providers/OptionsAbstract.php:232
1952
  msgid "For most servers TLS is the recommended option. If your SMTP provider offers both SSL and TLS options, we recommend using TLS."
1953
  msgstr ""
1954
 
1955
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:240
1956
  #: src/Providers/OptionsAbstract.php:240
1957
  msgid "SMTP Port"
1958
  msgstr ""
1959
 
1960
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:254
1961
  #: src/Providers/OptionsAbstract.php:254
1962
  msgid "Auto TLS"
1963
  msgstr ""
1964
 
1965
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:268
1966
  #: src/Providers/OptionsAbstract.php:268
1967
  msgid "By default TLS encryption is automatically used if the server supports it, which is recommended. In some cases, due to server misconfigurations, this can cause issues and may need to be disabled."
1968
  msgstr ""
1969
 
1970
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:276
1971
  #: src/Providers/OptionsAbstract.php:276
1972
  msgid "Authentication"
1973
  msgstr ""
1974
 
1975
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:295
1976
  #: src/Providers/OptionsAbstract.php:295
1977
  msgid "SMTP Username"
1978
  msgstr ""
1979
 
1980
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:309
1981
  #: src/Providers/OptionsAbstract.php:309
1982
  msgid "SMTP Password"
1983
  msgstr ""
1984
 
1985
  #. translators: %s - constant name: WPMS_SMTP_PASS.
1986
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:321
1987
  #: src/Providers/OptionsAbstract.php:321
1988
  msgid "To change the password you need to change the value of the constant there: %s"
1989
  msgstr ""
1990
 
1991
  #. translators: %1$s - wp-config.php file, %2$s - WPMS_ON constant name.
1992
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:329
1993
  #: src/Providers/OptionsAbstract.php:329
1994
  msgid "If you want to disable the use of constants, find in %1$s file the constant %2$s and turn if off:"
1995
  msgstr ""
1996
 
1997
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:339
1998
  #: src/Providers/OptionsAbstract.php:339
1999
  msgid "All the defined constants will stop working and you will be able to change all the values on this page."
2000
  msgstr ""
2001
 
2002
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:347
2003
  #: src/Providers/OptionsAbstract.php:347
2004
  msgid "The password will be stored in plain text. For improved security, we highly recommend using your site's WordPress configuration file to set your password."
2005
  msgstr ""
2006
 
2007
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:350
2008
  #: src/Providers/OptionsAbstract.php:350
2009
  msgid "Learn More"
2010
  msgstr ""
2011
 
2012
  #. translators: %1$s - Provider name; %2$s - PHP version required by Provider; %3$s - current PHP version.
2013
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:410
2014
  #: src/Providers/OptionsAbstract.php:410
2015
  msgid "%1$s requires PHP %2$s to work and does not support your current PHP version %3$s. Please contact your host and request a PHP upgrade to the latest one."
2016
  msgstr ""
2017
 
2018
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:417
2019
  #: src/Providers/OptionsAbstract.php:417
2020
  msgid "Meanwhile you can switch to some other mailers."
2021
  msgstr ""
2022
 
2023
  #. translators: %s - Provider name
2024
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:436
2025
  #: src/Providers/OptionsAbstract.php:436
2026
  msgid "%s requires an SSL certificate, and so is not currently compatible with your site. Please contact your host to request a SSL certificate, or check out <a href=\"https://www.wpbeginner.com/wp-tutorials/how-to-add-ssl-and-https-in-wordpress/\" target=\"_blank\">WPBeginner's tutorial on how to set up SSL</a>."
2027
  msgstr ""
2028
 
2029
- #: build/wp-mail-smtp-pro/src/Providers/OptionsAbstract.php:449
2030
  #: src/Providers/OptionsAbstract.php:449
2031
  msgid "If you'd prefer not to set up SSL, or need an SMTP solution in the meantime, please select a different mailer option."
2032
  msgstr ""
2033
 
2034
- #: build/wp-mail-smtp-pro/src/Providers/Outlook/Options.php:25
2035
  #: src/Providers/Outlook/Options.php:25
2036
  msgid "Outlook"
2037
  msgstr ""
2038
 
2039
- #: build/wp-mail-smtp-pro/src/Providers/Outlook/Options.php:39
2040
  #: src/Providers/Outlook/Options.php:39
2041
  msgid "We're sorry, the Microsoft Outlook mailer is not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features."
2042
  msgstr ""
2043
 
2044
- #: build/wp-mail-smtp-pro/src/Providers/Pepipost/Options.php:25
2045
  #: src/Providers/Pepipost/Options.php:25
2046
  msgid "Pepipost SMTP"
2047
  msgstr ""
2048
 
 
 
 
 
 
 
 
 
2049
  #. translators: %1$s - URL to pepipost.com site.
2050
- #: build/wp-mail-smtp-pro/src/Providers/PepipostAPI/Options.php:31
2051
  #: src/Providers/PepipostAPI/Options.php:31
2052
  msgid "<strong><a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">Pepipost</a> is a recommended transactional email service.</strong> Every month Pepipost delivers over 8 billion emails from 20,000+ customers. Their mission is to reliably send emails in the most efficient way and at the most disruptive pricing ever. Pepipost provides users 30,000 free emails the first 30 days."
2053
  msgstr ""
2054
 
2055
  #. translators: %1$s - URL to wpmailsmtp.com doc.
2056
- #: build/wp-mail-smtp-pro/src/Providers/PepipostAPI/Options.php:34
2057
  #: src/Providers/PepipostAPI/Options.php:34
2058
  msgid "Read our <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Pepipost documentation</a> to learn how to configure Pepipost and improve your email deliverability."
2059
  msgstr ""
2060
 
2061
- #: build/wp-mail-smtp-pro/src/Providers/PepipostAPI/Options.php:53
2062
  #: src/Providers/PepipostAPI/Options.php:53
2063
  msgid "Get Started with Pepipost"
2064
  msgstr ""
2065
 
2066
- #: build/wp-mail-smtp-pro/src/Providers/PepipostAPI/Options.php:61
2067
  #: src/Providers/PepipostAPI/Options.php:61
2068
  msgid "Pepipost"
2069
  msgstr ""
2070
 
2071
- #: build/wp-mail-smtp-pro/src/Providers/PepipostAPI/Options.php:88
2072
- #: build/wp-mail-smtp-pro/src/Providers/Sendgrid/Options.php:57
2073
- #: build/wp-mail-smtp-pro/src/Providers/Sendinblue/Options.php:76
2074
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Options.php:83
2075
  #: src/Providers/PepipostAPI/Options.php:88
2076
  #: src/Providers/Sendgrid/Options.php:57
2077
  #: src/Providers/Sendinblue/Options.php:76
@@ -2080,222 +1686,215 @@ msgid "API Key"
2080
  msgstr ""
2081
 
2082
  #. translators: %s - link to get an API Key.
2083
- #: build/wp-mail-smtp-pro/src/Providers/PepipostAPI/Options.php:107
2084
- #: build/wp-mail-smtp-pro/src/Providers/Sendinblue/Options.php:95
2085
  #: src/Providers/PepipostAPI/Options.php:107
2086
  #: src/Providers/Sendinblue/Options.php:95
2087
  msgid "Follow this link to get an API Key: %s."
2088
  msgstr ""
2089
 
2090
- #: build/wp-mail-smtp-pro/src/Providers/PepipostAPI/Options.php:109
2091
  #: src/Providers/PepipostAPI/Options.php:109
2092
  msgid "Get the API Key"
2093
  msgstr ""
2094
 
2095
- #: build/wp-mail-smtp-pro/src/Providers/Sendgrid/Options.php:25
2096
  #: src/Providers/Sendgrid/Options.php:25
2097
  msgid "SendGrid"
2098
  msgstr ""
2099
 
2100
  #. translators: %1$s - opening link tag; %2$s - closing link tag; %3$s - opening link tag; %4$s - closing link tag.
2101
- #: build/wp-mail-smtp-pro/src/Providers/Sendgrid/Options.php:29
2102
  #: src/Providers/Sendgrid/Options.php:29
2103
  msgid "%1$sSendGrid%2$s is one of the leading transactional email services, sending over 35 billion emails every month. They provide users 100 free emails per day.<br><br>Read our %3$sSendGrid documentation%4$s to learn how to set up SendGrid and improve your email deliverability."
2104
  msgstr ""
2105
 
2106
  #. translators: %s - API key link.
2107
- #: build/wp-mail-smtp-pro/src/Providers/Sendgrid/Options.php:76
2108
  #: src/Providers/Sendgrid/Options.php:76
2109
  msgid "Follow this link to get an API Key from SendGrid: %s."
2110
  msgstr ""
2111
 
2112
- #: build/wp-mail-smtp-pro/src/Providers/Sendgrid/Options.php:78
2113
  #: src/Providers/Sendgrid/Options.php:78
2114
  msgid "Create API Key"
2115
  msgstr ""
2116
 
2117
  #. translators: %s - SendGrid access level.
2118
- #: build/wp-mail-smtp-pro/src/Providers/Sendgrid/Options.php:86
2119
  #: src/Providers/Sendgrid/Options.php:86
2120
  msgid "To send emails you will need only a %s access level for this API key."
2121
  msgstr ""
2122
 
2123
- #: build/wp-mail-smtp-pro/src/Providers/Sendinblue/Options.php:33
2124
  #: src/Providers/Sendinblue/Options.php:33
2125
  msgid "Sendinblue"
2126
  msgstr ""
2127
 
2128
  #. translators: %1$s - URL to sendinblue.com site.
2129
- #: build/wp-mail-smtp-pro/src/Providers/Sendinblue/Options.php:37
2130
  #: src/Providers/Sendinblue/Options.php:37
2131
  msgid "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">Sendinblue</a> serves 80,000+ growing companies around the world and sends over 30 million emails each day. They provide users 300 free emails per day."
2132
  msgstr ""
2133
 
2134
  #. translators: %2$s - URL to wpmailsmtp.com doc.
2135
- #: build/wp-mail-smtp-pro/src/Providers/Sendinblue/Options.php:40
2136
  #: src/Providers/Sendinblue/Options.php:40
2137
  msgid "Read our <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Sendinblue documentation</a> to learn how to configure Sendinblue and improve your email deliverability."
2138
  msgstr ""
2139
 
2140
- #: build/wp-mail-smtp-pro/src/Providers/Sendinblue/Options.php:97
2141
  #: src/Providers/Sendinblue/Options.php:97
2142
  msgid "Get v3 API Key"
2143
  msgstr ""
2144
 
2145
- #: build/wp-mail-smtp-pro/src/Providers/SMTP/Options.php:25
2146
  #: src/Providers/SMTP/Options.php:25
2147
  msgid "Other SMTP"
2148
  msgstr ""
2149
 
2150
  #. translators: %s - URL to SMTP documentation.
2151
- #: build/wp-mail-smtp-pro/src/Providers/SMTP/Options.php:29
2152
  #: src/Providers/SMTP/Options.php:29
2153
  msgid "Use the SMTP details provided by your hosting provider or email service.<br><br>To see recommended settings for the popular services as well as troubleshooting tips, check out our <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">SMTP documentation</a>."
2154
  msgstr ""
2155
 
2156
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Mailer.php:433
2157
- #: src/Providers/SMTPcom/Mailer.php:433
2158
  msgid "Api Key:"
2159
  msgstr ""
2160
 
2161
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Mailer.php:435
2162
- #: src/Providers/SMTPcom/Mailer.php:435
2163
  msgid "Channel:"
2164
  msgstr ""
2165
 
2166
  #. translators: %s - URL to smtp.com site.
2167
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Options.php:41
2168
  #: src/Providers/SMTPcom/Options.php:41
2169
  msgid "<strong><a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">SMTP.com</a> is a recommended transactional email service.</strong> With a 22 years of track record of reliable email delivery, SMTP.com is a premiere solution for WordPress developers and website owners. SMTP.com has been around for almost as long as email itself. Their super simple integration interface makes it easy to get started while a powerful API and robust documentation make it a preferred choice among developers. Start a 30-day free trial with 50,000 emails."
2170
  msgstr ""
2171
 
2172
  #. translators: %s - URL to wpmailsmtp.com doc page for stmp.com.
2173
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Options.php:49
2174
  #: src/Providers/SMTPcom/Options.php:49
2175
  msgid "Read our <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">SMTP.com documentation</a> to learn how to configure SMTP.com and improve your email deliverability."
2176
  msgstr ""
2177
 
2178
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Options.php:59
2179
  #: src/Providers/SMTPcom/Options.php:59
2180
  msgid "Get Started with SMTP.com"
2181
  msgstr ""
2182
 
2183
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Options.php:67
2184
  #: src/Providers/SMTPcom/Options.php:67
2185
  msgid "SMTP.com"
2186
  msgstr ""
2187
 
2188
  #. translators: %s - API key link.
2189
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Options.php:101
2190
  #: src/Providers/SMTPcom/Options.php:101
2191
  msgid "Follow this link to get an API Key from SMTP.com: %s."
2192
  msgstr ""
2193
 
2194
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Options.php:103
2195
  #: src/Providers/SMTPcom/Options.php:103
2196
  msgid "Get API Key"
2197
  msgstr ""
2198
 
2199
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Options.php:114
2200
  #: src/Providers/SMTPcom/Options.php:114
2201
  msgid "Sender Name"
2202
  msgstr ""
2203
 
2204
  #. translators: %s - Channel/Sender Name link for smtp.com documentation.
2205
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Options.php:130
2206
  #: src/Providers/SMTPcom/Options.php:130
2207
  msgid "Follow this link to get a Sender Name from SMTP.com: %s."
2208
  msgstr ""
2209
 
2210
- #: build/wp-mail-smtp-pro/src/Providers/SMTPcom/Options.php:132
2211
  #: src/Providers/SMTPcom/Options.php:132
2212
  msgid "Get Sender Name"
2213
  msgstr ""
2214
 
2215
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:67
2216
  #: src/SiteHealth.php:67
2217
  msgid "Is WP Mail SMTP mailer setup complete?"
2218
  msgstr ""
2219
 
2220
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:92
2221
- #: src/SiteHealth.php:92
 
 
 
2222
  msgid "Version"
2223
  msgstr ""
2224
 
2225
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:96
2226
- #: src/SiteHealth.php:96
2227
  msgid "License key type"
2228
  msgstr ""
2229
 
2230
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:100
2231
- #: src/SiteHealth.php:100
2232
  msgid "Debug"
2233
  msgstr ""
2234
 
2235
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:101
2236
- #: src/SiteHealth.php:101
2237
  msgid "No debug notices found."
2238
  msgstr ""
2239
 
2240
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:131
2241
- #: src/SiteHealth.php:131
 
 
 
 
 
 
 
2242
  msgid "Current mailer"
2243
  msgstr ""
2244
 
2245
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:136
2246
- #: src/SiteHealth.php:136
2247
  msgid "WP Mail SMTP mailer setup is complete"
2248
  msgstr ""
2249
 
2250
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:145
2251
- #: src/SiteHealth.php:145
2252
  msgid "The WP Mail SMTP plugin mailer setup is complete. You can send a test email, to make sure it's working properly."
2253
  msgstr ""
2254
 
2255
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:150
2256
- #: src/SiteHealth.php:150
2257
  msgid "Test email sending"
2258
  msgstr ""
2259
 
2260
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:158
2261
- #: src/SiteHealth.php:158
2262
  msgid "You currently have the default mailer selected, which means that you haven’t set up SMTP yet."
2263
  msgstr ""
2264
 
2265
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:163
2266
- #: src/SiteHealth.php:163
2267
  msgid "WP Mail SMTP mailer setup is incomplete"
2268
  msgstr ""
2269
 
2270
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:169
2271
- #: src/SiteHealth.php:169
2272
  msgid "The WP Mail SMTP plugin mailer setup is incomplete. Please click on the link below to access plugin settings and configure the mailer."
2273
  msgstr ""
2274
 
2275
- #: build/wp-mail-smtp-pro/src/SiteHealth.php:174
2276
- #: src/SiteHealth.php:174
2277
  msgid "Configure mailer"
2278
  msgstr ""
2279
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2280
  #. translators: %1$s - date, \a\t - specially escaped "at", %2$s - time.
2281
- #: build/wp-mail-smtp-pro/src/WP.php:190
2282
  #: src/WP.php:190
2283
  msgid "%1$s \\a\\t %2$s"
2284
  msgstr ""
2285
 
2286
- #: build/wp-mail-smtp-pro/wp_mail_smtp.php:135
2287
  #: wp_mail_smtp.php:135
2288
  msgid "Please deactivate the free version of the WP Mail SMTP plugin before activating WP Mail SMTP Pro."
2289
  msgstr ""
2290
 
2291
  #. translators: %1$s - WPBeginner URL for recommended WordPress hosting.
2292
- #: build/wp-mail-smtp-pro/wp_mail_smtp.php:163
2293
  #: wp_mail_smtp.php:163
2294
  msgid "Your site is running an <strong>insecure version</strong> of PHP that is no longer supported. Please contact your web hosting provider to update your PHP version or switch to a <a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">recommended WordPress hosting company</a>."
2295
  msgstr ""
2296
 
2297
  #. translators: %s - WPMailSMTP.com docs URL with more details.
2298
- #: build/wp-mail-smtp-pro/wp_mail_smtp.php:180
2299
  #: wp_mail_smtp.php:180
2300
  msgid "<strong>WP Mail SMTP plugin is disabled</strong> on your site until you fix the issue. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Read more for additional information.</a>"
2301
  msgstr ""
1
  msgid ""
2
  msgstr ""
3
+ "Project-Id-Version: WP Mail SMTP 2.2.1\n"
4
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-mail-smtp\n"
5
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
6
  "Language-Team: LANGUAGE <LL@li.org>\n"
7
  "MIME-Version: 1.0\n"
8
  "Content-Type: text/plain; charset=UTF-8\n"
9
  "Content-Transfer-Encoding: 8bit\n"
10
+ "POT-Creation-Date: 2020-07-09T12:48:03+03:00\n"
11
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12
  "X-Generator: WP-CLI 2.4.0\n"
13
  "X-Domain: wp-mail-smtp\n"
33
  msgstr ""
34
 
35
  #. translators: %s - error code, returned by Google API.
 
36
  #: src/Admin/Area.php:125
37
  msgid "There was an error while processing the authentication request: %s. Please try again."
38
  msgstr ""
39
 
 
40
  #: src/Admin/Area.php:133
41
  msgid "There was an error while processing the authentication request. Please try again."
42
  msgstr ""
43
 
 
44
  #: src/Admin/Area.php:140
45
  msgid "There was an error while processing the authentication request. Please make sure that you have Client ID and Client Secret both valid and saved."
46
  msgstr ""
47
 
 
48
  #: src/Admin/Area.php:149
49
  msgid "You have successfully linked the current site with your Google API project. Now you can start sending emails through Gmail."
50
  msgstr ""
51
 
 
52
  #: src/Admin/Area.php:155
53
  msgid "You have successfully linked the current site with your Microsoft API project. Now you can start sending emails through Outlook."
54
  msgstr ""
55
 
56
  #. translators: %s - Mailer anchor link.
 
57
  #: src/Admin/Area.php:186
58
  msgid "Thanks for using WP Mail SMTP! To complete the plugin setup and start sending emails, <strong>please select and configure your <a href=\"%s\">Mailer</a></strong>."
59
  msgstr ""
60
 
 
 
 
61
  #: src/Admin/Area.php:209
62
  #: src/Admin/Area.php:210
63
  #: src/SiteHealth.php:40
64
  msgid "WP Mail SMTP"
65
  msgstr ""
66
 
 
 
 
67
  #: src/Admin/Area.php:220
68
  #: src/Admin/Area.php:221
69
+ #: src/Admin/Area.php:862
70
  msgid "Settings"
71
  msgstr ""
72
 
 
 
 
 
 
73
  #: src/Admin/Area.php:228
74
  #: src/Admin/Area.php:229
75
+ #: src/Admin/Pages/About.php:651
76
+ #: src/Admin/Pages/Logs.php:48
77
  #: src/Admin/Pages/LogsTab.php:30
78
  msgid "Email Log"
79
  msgstr ""
80
 
 
 
 
81
  #: src/Admin/Area.php:238
82
  #: src/Admin/Area.php:239
83
+ #: src/Admin/Pages/About.php:106
84
  msgid "About Us"
85
  msgstr ""
86
 
 
87
  #: src/Admin/Area.php:302
88
  msgid "Are you sure you want to reset the current provider connection? You will need to immediately create a new one to be able to send emails."
89
  msgstr ""
90
 
 
91
  #: src/Admin/Area.php:303
92
  msgid "Changes that you made to the settings are not saved!"
93
  msgstr ""
94
 
 
95
  #: src/Admin/Area.php:305
96
  msgid "Heads up!"
97
  msgstr ""
98
 
 
99
  #: src/Admin/Area.php:307
100
  msgid "<p>The Default (PHP) mailer is currently selected, but is not recommended because in most cases it does not resolve email delivery issues.</p><p>Please consider selecting and configuring one of the other mailers.</p>"
101
  msgstr ""
102
 
103
+ #: src/Admin/Area.php:310
104
+ #: src/Admin/PageAbstract.php:83
 
 
105
  msgid "Save Settings"
106
  msgstr ""
107
 
108
+ #: src/Admin/Area.php:311
 
109
  msgid "Cancel"
110
  msgstr ""
111
 
112
+ #: src/Admin/Area.php:312
 
113
  msgid "Warning icon"
114
  msgstr ""
115
 
116
+ #: src/Admin/Area.php:317
 
117
  msgid "%name% is a PRO Feature"
118
  msgstr ""
119
 
120
+ #: src/Admin/Area.php:318
 
121
  msgid "Upgrade to Pro"
122
  msgstr ""
123
 
124
+ #: src/Admin/Area.php:322
 
125
  msgid "<strong>Bonus:</strong> WP Mail SMTP users get <span>$50 off</span> regular price,<br>applied at checkout."
126
  msgstr ""
127
 
128
+ #: src/Admin/Area.php:331
 
129
  msgid "Already purchased?"
130
  msgstr ""
131
 
132
+ #: src/Admin/Area.php:398
133
+ #: src/Admin/Area.php:405
134
+ #: src/Admin/Pages/About.php:332
 
 
 
135
  msgid "Activate"
136
  msgstr ""
137
 
138
+ #: src/Admin/Area.php:399
139
+ #: src/Admin/Pages/About.php:324
 
 
140
  msgid "Activated"
141
  msgstr ""
142
 
143
+ #: src/Admin/Area.php:400
144
+ #: src/Admin/Pages/About.php:321
 
 
145
  msgid "Active"
146
  msgstr ""
147
 
148
+ #: src/Admin/Area.php:401
149
+ #: src/Admin/Pages/About.php:329
 
 
150
  msgid "Inactive"
151
  msgstr ""
152
 
153
+ #: src/Admin/Area.php:402
 
154
  msgid "Processing..."
155
  msgstr ""
156
 
157
+ #: src/Admin/Area.php:403
 
158
  msgid "Could not install a plugin. Please download from WordPress.org and install manually."
159
  msgstr ""
160
 
161
+ #: src/Admin/Area.php:404
 
162
  msgid "Install and Activate"
163
  msgstr ""
164
 
165
+ #: src/Admin/Area.php:406
 
166
  msgid "Download"
167
  msgstr ""
168
 
169
  #. translators: %1$s - WP.org link; %2$s - same WP.org link.
170
+ #: src/Admin/Area.php:466
 
171
  msgid "Please rate <strong>WP Mail SMTP</strong> <a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">&#9733;&#9733;&#9733;&#9733;&#9733;</a> on <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress.org</a> to help us spread the word. Thank you from the WP Mail SMTP team!"
172
  msgstr ""
173
 
174
+ #: src/Admin/Area.php:803
 
175
  msgid "WP Mail SMTP Pro related message was successfully dismissed."
176
  msgstr ""
177
 
178
+ #: src/Admin/Area.php:822
 
179
  msgid "Educational notice for this mailer was successfully dismissed."
180
  msgstr ""
181
 
182
+ #: src/Admin/Area.php:861
 
183
  msgid "Go to WP Mail SMTP Settings page"
184
  msgstr ""
185
 
186
+ #: src/Admin/Area.php:868
 
187
  msgid "Go to WP Mail SMTP Lite vs Pro comparison page"
188
  msgstr ""
189
 
190
+ #: src/Admin/Area.php:869
 
191
  msgid "Premium Support"
192
  msgstr ""
193
 
194
  #. translators: %s - plugin current license type.
195
+ #: src/Admin/Pages/About.php:99
196
+ #: src/Admin/Pages/About.php:550
 
 
197
  msgid "%s vs Pro"
198
  msgstr ""
199
 
200
+ #: src/Admin/Pages/About.php:171
 
201
  msgid "Hello and welcome to WP Mail SMTP, the easiest and most popular WordPress SMTP plugin. We build software that helps your site reliably deliver emails every time."
202
  msgstr ""
203
 
204
+ #: src/Admin/Pages/About.php:175
 
205
  msgid "Email deliverability has been a well-documented problem for all WordPress websites. However as WPForms grew, we became more aware of this painful issue that affects our users and the larger WordPress community. So we decided to solve this problem and make a solution that's beginner friendly."
206
  msgstr ""
207
 
208
+ #: src/Admin/Pages/About.php:178
 
209
  msgid "Our goal is to make reliable email deliverability easy for WordPress."
210
  msgstr ""
211
 
212
  #. translators: %1$s - WPForms URL, %2$s - WPBeginner URL, %3$s - OptinMonster URL, %4$s - MonsterInsights URL, %5$s - RafflePress URL
213
+ #: src/Admin/Pages/About.php:185
 
214
  msgid "WP Mail SMTP is brought to you by the same team that's behind the most user friendly WordPress forms, <a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">WPForms</a>, the largest WordPress resource site, <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">WPBeginner</a>, the most popular lead-generation software, <a href=\"%3$s\" target=\"_blank\" rel=\"noopener noreferrer\">OptinMonster</a>, the best WordPress analytics plugin, <a href=\"%4$s\" target=\"_blank\" rel=\"noopener noreferrer\">MonsterInsights</a>, and the most powerful WordPress contest plugin, <a href=\"%5$s\" target=\"_blank\" rel=\"noopener noreferrer\">RafflePress</a>."
215
  msgstr ""
216
 
217
+ #: src/Admin/Pages/About.php:203
 
218
  msgid "Yup, we know a thing or two about building awesome products that customers love."
219
  msgstr ""
220
 
221
+ #: src/Admin/Pages/About.php:209
 
222
  msgid "The WPForms Team photo"
223
  msgstr ""
224
 
225
+ #: src/Admin/Pages/About.php:211
 
226
  msgid "The WPForms Team"
227
  msgstr ""
228
 
229
+ #: src/Admin/Pages/About.php:260
230
+ msgid "Plugin icon"
231
+ msgstr ""
232
+
233
  #. translators: %s - status HTML text.
234
+ #: src/Admin/Pages/About.php:274
 
235
  msgid "Status: %s"
236
  msgstr ""
237
 
238
+ #: src/Admin/Pages/About.php:340
 
239
  msgid "Not Installed"
240
  msgstr ""
241
 
242
+ #: src/Admin/Pages/About.php:343
 
243
  msgid "Install Plugin"
244
  msgstr ""
245
 
246
+ #: src/Admin/Pages/About.php:364
 
247
  msgid "MonsterInsights"
248
  msgstr ""
249
 
250
+ #: src/Admin/Pages/About.php:365
251
+ #: src/Admin/Pages/About.php:371
 
 
252
  msgid "MonsterInsights makes it “effortless” to properly connect your WordPress site with Google Analytics, so you can start making data-driven decisions to grow your business."
253
  msgstr ""
254
 
255
+ #: src/Admin/Pages/About.php:370
 
256
  msgid "MonsterInsights Pro"
257
  msgstr ""
258
 
259
+ #: src/Admin/Pages/About.php:378
 
260
  msgid "OptinMonster"
261
  msgstr ""
262
 
263
+ #: src/Admin/Pages/About.php:379
 
264
  msgid "Our high-converting optin forms like Exit-Intent® popups, Fullscreen Welcome Mats, and Scroll boxes help you dramatically boost conversions and get more email subscribers."
265
  msgstr ""
266
 
267
+ #: src/Admin/Pages/About.php:385
 
268
  msgid "Contact Forms by WPForms"
269
  msgstr ""
270
 
271
+ #: src/Admin/Pages/About.php:386
272
+ #: src/Admin/Pages/About.php:392
 
 
273
  msgid "The best WordPress contact form plugin. Drag & Drop online form builder that helps you create beautiful contact forms with just a few clicks."
274
  msgstr ""
275
 
276
+ #: src/Admin/Pages/About.php:391
 
277
  msgid "WPForms Pro"
278
  msgstr ""
279
 
280
+ #: src/Admin/Pages/About.php:399
 
281
  msgid "RafflePress"
282
  msgstr ""
283
 
284
+ #: src/Admin/Pages/About.php:400
285
+ #: src/Admin/Pages/About.php:406
 
 
286
  msgid "Turn your visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with powerful viral giveaways & contests."
287
  msgstr ""
288
 
289
+ #: src/Admin/Pages/About.php:405
 
290
  msgid "RafflePress Pro"
291
  msgstr ""
292
 
293
+ #: src/Admin/Pages/About.php:425
 
294
  msgid "Could not activate the plugin. Please activate it from the Plugins page."
295
  msgstr ""
296
 
297
+ #: src/Admin/Pages/About.php:437
 
298
  msgid "Plugin activated."
299
  msgstr ""
300
 
301
+ #: src/Admin/Pages/About.php:454
 
302
  msgid "Could not install the plugin."
303
  msgstr ""
304
 
305
+ #: src/Admin/Pages/About.php:515
 
306
  msgid "Plugin installed & activated."
307
  msgstr ""
308
 
309
+ #: src/Admin/Pages/About.php:523
 
310
  msgid "Plugin installed."
311
  msgstr ""
312
 
313
+ #: src/Admin/Pages/About.php:558
 
314
  msgid "Get the most out of WP Mail SMTP by upgrading to Pro and unlocking all of the powerful features."
315
  msgstr ""
316
 
317
+ #: src/Admin/Pages/About.php:567
 
318
  msgid "Feature"
319
  msgstr ""
320
 
321
+ #: src/Admin/Pages/About.php:577
 
322
  msgid "Pro"
323
  msgstr ""
324
 
325
+ #: src/Admin/Pages/About.php:618
 
326
  msgid "Get WP Mail SMTP Pro Today and Unlock all of these Powerful Features"
327
  msgstr ""
328
 
329
+ #: src/Admin/Pages/About.php:625
 
330
  msgid "Bonus: WP Mail SMTP Lite users get <span class=\"price-off\">$50 off regular price</span>, automatically applied at checkout."
331
  msgstr ""
332
 
333
+ #: src/Admin/Pages/About.php:652
 
 
334
  #: src/Admin/Pages/ControlTab.php:27
335
  msgid "Email Controls"
336
  msgstr ""
337
 
338
+ #: src/Admin/Pages/About.php:653
 
339
  msgid "Additional Mailers"
340
  msgstr ""
341
 
342
+ #: src/Admin/Pages/About.php:654
 
343
  msgid "Customer Support"
344
  msgstr ""
345
 
346
+ #: src/Admin/Pages/About.php:675
 
347
  msgid "Emails are not logged"
348
  msgstr ""
349
 
350
+ #: src/Admin/Pages/About.php:681
 
351
  msgid "Complete Email Log management inside WordPress"
352
  msgstr ""
353
 
354
+ #: src/Admin/Pages/About.php:689
 
355
  msgid "No controls over whether default WordPress emails are sent"
356
  msgstr ""
357
 
358
+ #: src/Admin/Pages/About.php:695
 
359
  msgid "Complete Email Controls management for most default WordPress emails"
360
  msgstr ""
361
 
362
+ #: src/Admin/Pages/About.php:703
 
363
  msgid "Only default list of mailers"
364
  msgstr ""
365
 
366
+ #: src/Admin/Pages/About.php:709
 
367
  msgid "Additional mailers: Microsoft Outlook (with Office365 support) and Amazon SES"
368
  msgstr ""
369
 
370
+ #: src/Admin/Pages/About.php:717
 
371
  msgid "Limited Support"
372
  msgstr ""
373
 
374
+ #: src/Admin/Pages/About.php:723
 
375
  msgid "Priority Support"
376
  msgstr ""
377
 
 
378
  #: src/Admin/Pages/ControlTab.php:48
379
  msgid "Comment Notifications"
380
  msgstr ""
381
 
 
382
  #: src/Admin/Pages/ControlTab.php:49
383
  msgid "Manage emails sent when comments are published or awaiting moderation."
384
  msgstr ""
385
 
 
386
  #: src/Admin/Pages/ControlTab.php:53
387
  msgid "Site Admin Email Change Notifications"
388
  msgstr ""
389
 
 
390
  #: src/Admin/Pages/ControlTab.php:54
391
  msgid "Manage emails sent when site admin's account has been changed."
392
  msgstr ""
393
 
 
394
  #: src/Admin/Pages/ControlTab.php:58
395
  msgid "User Change Notifications"
396
  msgstr ""
397
 
 
398
  #: src/Admin/Pages/ControlTab.php:59
399
  msgid "Limit emails triggered by password changed/reset, email changed, and more."
400
  msgstr ""
401
 
 
402
  #: src/Admin/Pages/ControlTab.php:63
403
  msgid "Personal Data Requests Notifications"
404
  msgstr ""
405
 
 
406
  #: src/Admin/Pages/ControlTab.php:64
407
  msgid "Control emails for data requests and data removal actions."
408
  msgstr ""
409
 
 
410
  #: src/Admin/Pages/ControlTab.php:68
411
  msgid "Automatic Update Notifications"
412
  msgstr ""
413
 
 
414
  #: src/Admin/Pages/ControlTab.php:69
415
  msgid "Manage emails sent by the core automatic update process."
416
  msgstr ""
417
 
 
418
  #: src/Admin/Pages/ControlTab.php:73
419
  msgid "New User Notifications"
420
  msgstr ""
421
 
 
422
  #: src/Admin/Pages/ControlTab.php:74
423
  msgid "Toggle emails sent to both user and site administrator about new user accounts."
424
  msgstr ""
425
 
 
426
  #: src/Admin/Pages/ControlTab.php:92
427
  msgid "Unlock Email Controls"
428
  msgstr ""
429
 
 
430
  #: src/Admin/Pages/ControlTab.php:95
431
  msgid "Email Controls allows you to granularly manage emails sent by WordPress.
"
432
  msgstr ""
433
 
 
 
434
  #: src/Admin/Pages/ControlTab.php:119
435
  #: src/Admin/Pages/LogsTab.php:67
436
  msgid "Upgrade to WP Mail SMTP Pro"
437
  msgstr ""
438
 
 
439
  #: src/Admin/Pages/LogsTab.php:53
440
  msgid "Unlock Email Logging"
441
  msgstr ""
442
 
 
443
  #: src/Admin/Pages/LogsTab.php:56
444
  msgid "Keep track of every email sent from your WordPress site with email logging.
"
445
  msgstr ""
446
 
 
447
  #: src/Admin/Pages/LogsTab.php:57
448
  msgid "Troubleshoot sending issues, recover lost emails, and more!"
449
  msgstr ""
450
 
 
451
  #: src/Admin/Pages/LogsTab.php:61
452
  msgid "Logs Archive Page Screenshot"
453
  msgstr ""
454
 
 
455
  #: src/Admin/Pages/LogsTab.php:62
456
  msgid "Logs Single Page Screenshot"
457
  msgstr ""
458
 
 
459
  #: src/Admin/Pages/MiscTab.php:24
460
  msgid "Misc"
461
  msgstr ""
462
 
 
463
  #: src/Admin/Pages/MiscTab.php:56
464
  msgid "Do Not Send"
465
  msgstr ""
466
 
 
467
  #: src/Admin/Pages/MiscTab.php:65
468
  msgid "Check this if you would like to stop sending all emails."
469
  msgstr ""
470
 
 
471
  #: src/Admin/Pages/MiscTab.php:71
472
  msgid "Some plugins, like BuddyPress and Events Manager, are using their own email delivery solutions. By default, this option does not block their emails, as those plugins do not use default <code>wp_mail()</code> function to send emails."
473
  msgstr ""
474
 
 
475
  #: src/Admin/Pages/MiscTab.php:79
476
  msgid "You will need to consult with their documentation to switch them to use default WordPress email delivery."
477
  msgstr ""
478
 
 
479
  #: src/Admin/Pages/MiscTab.php:81
480
  msgid "Test emails are allowed to be sent, regardless of this option."
481
  msgstr ""
482
 
483
  #. translators: %1$s - constant that was used; %2$s - file where it was used.
 
 
484
  #: src/Admin/Pages/MiscTab.php:86
485
  #: src/Providers/OptionsAbstract.php:468
486
  msgid "The value of this field was set using a constant %1$s most likely inside %2$s of your WordPress installation."
487
  msgstr ""
488
 
489
  #. translators: %s - The URL to the constants support article.
 
490
  #: src/Admin/Pages/MiscTab.php:93
491
  msgid "Please read this <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">support article</a> if you want to enable this option using constants."
492
  msgstr ""
493
 
 
494
  #: src/Admin/Pages/MiscTab.php:114
495
  msgid "Hide Announcements"
496
  msgstr ""
497
 
 
498
  #: src/Admin/Pages/MiscTab.php:123
499
  msgid "Check this if you would like to hide plugin announcements and update details."
500
  msgstr ""
501
 
 
502
  #: src/Admin/Pages/MiscTab.php:133
503
  msgid "Hide Email Delivery Errors"
504
  msgstr ""
505
 
 
506
  #: src/Admin/Pages/MiscTab.php:149
507
  msgid "Check this if you would like to hide warnings alerting of email delivery errors."
508
  msgstr ""
509
 
510
  #. translators: %s - filter that was used to disabled.
 
511
  #: src/Admin/Pages/MiscTab.php:156
512
  msgid "Email Delivery Errors were disabled using a %s filter."
513
  msgstr ""
514
 
 
515
  #: src/Admin/Pages/MiscTab.php:165
516
  msgid "<strong>This is not recommended</strong> and should only be done for staging or development sites."
517
  msgstr ""
518
 
 
519
  #: src/Admin/Pages/MiscTab.php:180
520
  msgid "Uninstall WP Mail SMTP"
521
  msgstr ""
522
 
 
523
  #: src/Admin/Pages/MiscTab.php:188
524
  msgid "Check this if you would like to remove ALL WP Mail SMTP data upon plugin deletion. All settings will be unrecoverable."
525
  msgstr ""
526
 
527
+ #: src/Admin/Pages/MiscTab.php:234
528
+ #: src/Admin/Pages/SettingsTab.php:583
 
 
529
  msgid "Settings were successfully saved."
530
  msgstr ""
531
 
532
+ #: src/Admin/Pages/SettingsTab.php:37
 
533
  msgid "General"
534
  msgstr ""
535
 
536
+ #: src/Admin/Pages/SettingsTab.php:67
 
537
  msgid "License"
538
  msgstr ""
539
 
540
+ #: src/Admin/Pages/SettingsTab.php:70
 
541
  msgid "Your license key provides access to updates and support."
542
  msgstr ""
543
 
544
+ #: src/Admin/Pages/SettingsTab.php:78
 
545
  msgid "License Key"
546
  msgstr ""
547
 
548
+ #: src/Admin/Pages/SettingsTab.php:88
 
549
  msgid "Mail"
550
  msgstr ""
551
 
552
+ #: src/Admin/Pages/SettingsTab.php:95
 
553
  msgid "From Email"
554
  msgstr ""
555
 
556
+ #: src/Admin/Pages/SettingsTab.php:113
557
+ msgid "Please first authorize the Gmail mailer below"
558
+ msgstr ""
559
+
560
+ #: src/Admin/Pages/SettingsTab.php:127
561
  msgid "The email address which emails are sent from."
562
  msgstr ""
563
 
564
+ #: src/Admin/Pages/SettingsTab.php:128
565
+ msgid "If you're using an email provider (Yahoo, Outlook.com, etc) this should be your email address for that account."
 
566
  msgstr ""
567
 
568
+ #: src/Admin/Pages/SettingsTab.php:131
 
569
  msgid "Please note that other plugins can change this, to prevent this use the setting below."
570
  msgstr ""
571
 
572
+ #: src/Admin/Pages/SettingsTab.php:149
 
573
  msgid "Force From Email"
574
  msgstr ""
575
 
576
+ #: src/Admin/Pages/SettingsTab.php:156
 
577
  msgid "Current provider will automatically force From Email to be the email address that you use to set up the connection below."
578
  msgstr ""
579
 
580
+ #: src/Admin/Pages/SettingsTab.php:158
581
+ msgid "Gmail mailer will automatically force From Email to be the email address that you selected above."
582
+ msgstr ""
583
+
584
+ #: src/Admin/Pages/SettingsTab.php:164
585
  msgid "If checked, the From Email setting above will be used for all emails, ignoring values set by other plugins."
586
  msgstr ""
587
 
588
+ #: src/Admin/Pages/SettingsTab.php:174
 
589
  msgid "From Name"
590
  msgstr ""
591
 
592
+ #: src/Admin/Pages/SettingsTab.php:185
 
593
  msgid "The name which emails are sent from."
594
  msgstr ""
595
 
596
+ #: src/Admin/Pages/SettingsTab.php:197
 
597
  msgid "Force From Name"
598
  msgstr ""
599
 
600
+ #: src/Admin/Pages/SettingsTab.php:202
 
601
  msgid "Current provider doesn't support setting and forcing From Name. Emails will be sent on behalf of the account name used to setup the connection below."
602
  msgstr ""
603
 
604
+ #: src/Admin/Pages/SettingsTab.php:206
 
605
  msgid "If checked, the From Name setting above will be used for all emails, ignoring values set by other plugins."
606
  msgstr ""
607
 
608
+ #: src/Admin/Pages/SettingsTab.php:215
 
609
  msgid "Return Path"
610
  msgstr ""
611
 
612
+ #: src/Admin/Pages/SettingsTab.php:224
 
613
  msgid "Set the return-path to match the From Email"
614
  msgstr ""
615
 
616
+ #: src/Admin/Pages/SettingsTab.php:228
 
617
  msgid "Return Path indicates where non-delivery receipts - or bounce messages - are to be sent."
618
  msgstr ""
619
 
620
+ #: src/Admin/Pages/SettingsTab.php:229
 
621
  msgid "If unchecked, bounce messages may be lost. Some providers may ignore this option."
622
  msgstr ""
623
 
624
+ #: src/Admin/Pages/SettingsTab.php:237
 
625
  msgid "Mailer"
626
  msgstr ""
627
 
628
+ #: src/Admin/Pages/SettingsTab.php:278
 
629
  msgid "Don't see what you're looking for?"
630
  msgstr ""
631
 
632
+ #: src/Admin/Pages/SettingsTab.php:280
 
633
  msgid "Suggest a Mailer"
634
  msgstr ""
635
 
636
+ #: src/Admin/Pages/SettingsTab.php:308
 
637
  msgid "Dismiss this notice"
638
  msgstr ""
639
 
640
+ #: src/Admin/Pages/SettingsTab.php:355
 
641
  msgid "You're using WP Mail SMTP Lite - no license needed. Enjoy!"
642
  msgstr ""
643
 
644
  #. translators: %s - WPMailSMTP.com upgrade URL.
645
+ #: src/Admin/Pages/SettingsTab.php:361
 
646
  msgid "To unlock more features consider <strong><a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"wp-mail-smtp-upgrade-modal\">upgrading to PRO</a></strong>."
647
  msgstr ""
648
 
649
+ #: src/Admin/Pages/SettingsTab.php:380
 
650
  msgid "As a valued WP Mail SMTP Lite user you receive <strong>$50 off</strong>, automatically applied at checkout!"
651
  msgstr ""
652
 
653
+ #: src/Admin/Pages/SettingsTab.php:441
 
654
  msgid "Get WP Mail SMTP Pro and Unlock all the Powerful Features"
655
  msgstr ""
656
 
657
+ #: src/Admin/Pages/SettingsTab.php:445
 
658
  msgid "Thanks for being a loyal WP Mail SMTP user. Upgrade to WP Mail SMTP Pro to unlock more awesome features and experience why WP Mail SMTP is the most popular SMTP plugin."
659
  msgstr ""
660
 
661
+ #: src/Admin/Pages/SettingsTab.php:449
 
662
  msgid "We know that you will truly love WP Mail SMTP. It's used by over 1,000,000 websites."
663
  msgstr ""
664
 
665
+ #: src/Admin/Pages/SettingsTab.php:452
 
666
  msgid "Pro Features:"
667
  msgstr ""
668
 
669
+ #: src/Admin/Pages/SettingsTab.php:456
 
670
  msgid "Manage Notifications - control which emails your site sends"
671
  msgstr ""
672
 
673
+ #: src/Admin/Pages/SettingsTab.php:457
 
674
  msgid "Email Logging - keep track of every email sent from your site"
675
  msgstr ""
676
 
677
+ #: src/Admin/Pages/SettingsTab.php:458
 
678
  msgid "Office 365 - send emails using your Office 365 account"
679
  msgstr ""
680
 
681
+ #: src/Admin/Pages/SettingsTab.php:459
 
682
  msgid "Amazon SES - harness the power of AWS"
683
  msgstr ""
684
 
685
+ #: src/Admin/Pages/SettingsTab.php:460
 
686
  msgid "Outlook.com - send emails using your Outlook.com account"
687
  msgstr ""
688
 
689
+ #: src/Admin/Pages/SettingsTab.php:461
 
690
  msgid "Access to our world class support team"
691
  msgstr ""
692
 
693
+ #: src/Admin/Pages/SettingsTab.php:464
 
694
  msgid "White Glove Setup - sit back and relax while we handle everything for you"
695
  msgstr ""
696
 
697
+ #: src/Admin/Pages/SettingsTab.php:465
 
698
  msgid "Install WP Mail SMTP Pro plugin"
699
  msgstr ""
700
 
701
+ #: src/Admin/Pages/SettingsTab.php:466
 
702
  msgid "Set up domain name verification (DNS)"
703
  msgstr ""
704
 
705
+ #: src/Admin/Pages/SettingsTab.php:467
 
706
  msgid "Configure Mailgun service"
707
  msgstr ""
708
 
709
+ #: src/Admin/Pages/SettingsTab.php:468
 
710
  msgid "Set up WP Mail SMTP Pro plugin"
711
  msgstr ""
712
 
713
+ #: src/Admin/Pages/SettingsTab.php:469
 
714
  msgid "Test and verify email delivery"
715
  msgstr ""
716
 
717
  #. translators: %s - WPMailSMTP.com URL.
718
+ #: src/Admin/Pages/SettingsTab.php:477
 
719
  msgid "<a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Get WP Mail SMTP Pro Today and Unlock all the Powerful Features &raquo;</a>"
720
  msgstr ""
721
 
722
+ #: src/Admin/Pages/SettingsTab.php:495
 
723
  msgid "<strong>Bonus:</strong> WP Mail SMTP users get <span class=\"price-off\">$50 off regular price</span>, automatically applied at checkout."
724
  msgstr ""
725
 
 
726
  #: src/Admin/Pages/TestTab.php:37
727
  msgid "Email Test"
728
  msgstr ""
729
 
 
730
  #: src/Admin/Pages/TestTab.php:59
731
  msgid "Send a Test Email"
732
  msgstr ""
733
 
 
734
  #: src/Admin/Pages/TestTab.php:66
735
  msgid "Send To"
736
  msgstr ""
737
 
 
738
  #: src/Admin/Pages/TestTab.php:72
739
  msgid "Enter email address where test email will be sent."
740
  msgstr ""
741
 
 
742
  #: src/Admin/Pages/TestTab.php:80
743
  msgid "HTML"
744
  msgstr ""
745
 
 
 
 
746
  #: src/Admin/Pages/TestTab.php:86
747
  #: src/Providers/OptionsAbstract.php:264
748
  #: src/Providers/OptionsAbstract.php:286
749
  msgid "On"
750
  msgstr ""
751
 
 
 
 
752
  #: src/Admin/Pages/TestTab.php:87
753
  #: src/Providers/OptionsAbstract.php:265
754
  #: src/Providers/OptionsAbstract.php:287
755
  msgid "Off"
756
  msgstr ""
757
 
 
758
  #: src/Admin/Pages/TestTab.php:90
759
  msgid "Send this email in HTML or in plain text format."
760
  msgstr ""
761
 
 
762
  #: src/Admin/Pages/TestTab.php:110
763
  msgid "You cannot send an email. Mailer is not properly configured. Please check your settings."
764
  msgstr ""
765
 
 
766
  #: src/Admin/Pages/TestTab.php:114
767
  msgid "Send Email"
768
  msgstr ""
769
 
 
770
  #: src/Admin/Pages/TestTab.php:142
771
  msgid "Test failed. Please use a valid email address and try to resend the test email."
772
  msgstr ""
773
 
774
  #. translators: %s - email address a test email will be sent to.
 
 
775
  #: src/Admin/Pages/TestTab.php:154
776
  #: src/Admin/Pages/TestTab.php:160
777
  msgid "Test email to %s"
778
  msgstr ""
779
 
 
780
  #: src/Admin/Pages/TestTab.php:186
781
  msgid "Test plain text email was sent successfully!"
782
  msgstr ""
783
 
784
  #. translators: %s - "HTML" in bold.
 
785
  #: src/Admin/Pages/TestTab.php:190
786
  msgid "Test %s email was sent successfully! Please check your inbox to make sure it is delivered."
787
  msgstr ""
788
 
 
789
  #: src/Admin/Pages/TestTab.php:510
790
  msgid "SSL certificate issue."
791
  msgstr ""
792
 
 
793
  #: src/Admin/Pages/TestTab.php:511
794
  msgid "This means your web server cannot reliably make secure connections (make requests to HTTPS sites)."
795
  msgstr ""
796
 
 
 
797
  #: src/Admin/Pages/TestTab.php:512
798
  #: src/Admin/Pages/TestTab.php:560
799
  msgid "Typically this error is returned when web server is not configured properly."
800
  msgstr ""
801
 
 
802
  #: src/Admin/Pages/TestTab.php:515
803
  msgid "Contact your web hosting provider and inform them your site has an issue with SSL certificates."
804
  msgstr ""
805
 
 
 
806
  #: src/Admin/Pages/TestTab.php:516
807
  #: src/Admin/Pages/TestTab.php:564
808
  msgid "The exact error you can provide them is in the Error log, available at the bottom of this page."
809
  msgstr ""
810
 
 
 
811
  #: src/Admin/Pages/TestTab.php:517
812
  #: src/Admin/Pages/TestTab.php:565
813
  msgid "Ask them to resolve the issue then try again."
814
  msgstr ""
815
 
 
816
  #: src/Admin/Pages/TestTab.php:528
817
  msgid "Could not connect to host."
818
  msgstr ""
819
 
820
  #. translators: %s - SMTP host address.
 
 
 
821
  #: src/Admin/Pages/TestTab.php:531
822
  #: src/Admin/Pages/TestTab.php:556
823
  #: src/Admin/Pages/TestTab.php:658
824
  msgid "This means your web server was unable to connect to %s."
825
  msgstr ""
826
 
 
 
 
827
  #: src/Admin/Pages/TestTab.php:534
828
  #: src/Admin/Pages/TestTab.php:559
829
  #: src/Admin/Pages/TestTab.php:661
830
  msgid "This means your web server was unable to connect to the host server."
831
  msgstr ""
832
 
 
833
  #: src/Admin/Pages/TestTab.php:535
834
  msgid "Typically this error is returned your web server is blocking the connections or the SMTP host denying the request."
835
  msgstr ""
836
 
837
  #. translators: %s - SMTP host address.
 
838
  #: src/Admin/Pages/TestTab.php:539
839
  msgid "Contact your web hosting provider and ask them to verify your server can connect to %s. Additionally, ask them if a firewall or security policy may be preventing the connection."
840
  msgstr ""
841
 
 
842
  #: src/Admin/Pages/TestTab.php:542
843
  msgid "If using \"Other SMTP\" Mailer, triple check your SMTP settings including host address, email, and password."
844
  msgstr ""
845
 
 
846
  #: src/Admin/Pages/TestTab.php:543
847
  msgid "If using \"Other SMTP\" Mailer, contact your SMTP host to confirm they are accepting outside connections with the settings you have configured (address, username, port, security, etc)."
848
  msgstr ""
849
 
 
850
  #: src/Admin/Pages/TestTab.php:553
851
  msgid "Could not connect to your host."
852
  msgstr ""
853
 
 
854
  #: src/Admin/Pages/TestTab.php:563
855
  msgid "Contact your web hosting provider and inform them you are having issues making outbound connections."
856
  msgstr ""
857
 
 
858
  #: src/Admin/Pages/TestTab.php:575
859
  msgid "Could not authenticate your SMTP account."
860
  msgstr ""
861
 
 
862
  #: src/Admin/Pages/TestTab.php:576
863
  msgid "This means we were able to connect to your SMTP host, but were not able to proceed using the email/password in the settings."
864
  msgstr ""
865
 
 
866
  #: src/Admin/Pages/TestTab.php:577
867
  msgid "Typically this error is returned when the email or password is not correct or is not what the SMTP host is expecting."
868
  msgstr ""
869
 
 
870
  #: src/Admin/Pages/TestTab.php:580
871
  msgid "Triple check your SMTP settings including host address, email, and password. If you have recently reset your password you will need to update the settings."
872
  msgstr ""
873
 
 
 
874
  #: src/Admin/Pages/TestTab.php:581
875
  #: src/Admin/Pages/TestTab.php:686
876
  msgid "Contact your SMTP host to confirm you are using the correct username and password."
877
  msgstr ""
878
 
 
 
879
  #: src/Admin/Pages/TestTab.php:582
880
  #: src/Admin/Pages/TestTab.php:687
881
  msgid "Verify with your SMTP host that your account has permissions to send emails using outside connections."
882
  msgstr ""
883
 
 
884
  #: src/Admin/Pages/TestTab.php:592
885
  msgid "Error due to unsolicited and/or bulk e-mail."
886
  msgstr ""
887
 
 
888
  #: src/Admin/Pages/TestTab.php:593
889
  msgid "This means the connection to your SMTP host was made successfully, but the host rejected the email."
890
  msgstr ""
891
 
 
892
  #: src/Admin/Pages/TestTab.php:594
893
  msgid "Typically this error is returned when you are sending too many e-mails or e-mails that have been identified as spam."
894
  msgstr ""
895
 
 
896
  #: src/Admin/Pages/TestTab.php:597
897
  msgid "Check the emails that are sending are sending individually. Example: email is not sending to 30 recipients. You can install any WordPress e-mail logging plugin to do that."
898
  msgstr ""
899
 
 
900
  #: src/Admin/Pages/TestTab.php:598
901
  msgid "Contact your SMTP host to ask about sending/rate limits."
902
  msgstr ""
903
 
 
904
  #: src/Admin/Pages/TestTab.php:599
905
  msgid "Verify with them your SMTP account is in good standing and your account has not been flagged."
906
  msgstr ""
907
 
 
908
  #: src/Admin/Pages/TestTab.php:609
909
  msgid "Unauthenticated senders are not allowed."
910
  msgstr ""
911
 
 
912
  #: src/Admin/Pages/TestTab.php:610
913
  msgid "This means the connection to your SMTP host was made successfully, but you should enable Authentication and provide correct Username and Password."
914
  msgstr ""
915
 
 
916
  #: src/Admin/Pages/TestTab.php:613
917
  msgid "Go to WP Mail SMTP plugin Settings page."
918
  msgstr ""
919
 
 
920
  #: src/Admin/Pages/TestTab.php:614
921
  msgid "Enable Authentication"
922
  msgstr ""
923
 
 
924
  #: src/Admin/Pages/TestTab.php:615
925
  msgid "Enter correct SMTP Username (usually this is an email address) and Password in the appropriate fields."
926
  msgstr ""
927
 
 
928
  #: src/Admin/Pages/TestTab.php:627
929
  msgid "Misconfigured server certificate."
930
  msgstr ""
931
 
 
932
  #: src/Admin/Pages/TestTab.php:628
933
  msgid "This means OpenSSL on your server isn't able to verify the host certificate."
934
  msgstr ""
935
 
 
936
  #: src/Admin/Pages/TestTab.php:629
937
  msgid "There are a few reasons why this is happening. It could be that the host certificate is misconfigured, or this server's OpenSSL is using an outdated CA bundle."
938
  msgstr ""
939
 
 
940
  #: src/Admin/Pages/TestTab.php:632
941
  msgid "Verify that the host's SSL certificate is valid."
942
  msgstr ""
943
 
944
  #. translators: %s - URL to the PHP openssl manual
 
945
  #: src/Admin/Pages/TestTab.php:635
946
  msgid "Contact your hosting support, show them the \"full Error Log for debugging\" below and share this <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">link</a> with them."
947
  msgstr ""
948
 
 
949
  #: src/Admin/Pages/TestTab.php:655
950
  msgid "Could not connect to the SMTP host."
951
  msgstr ""
952
 
 
 
953
  #: src/Admin/Pages/TestTab.php:662
954
  #: src/Admin/Pages/TestTab.php:1048
955
  msgid "Typically this error is returned for one of the following reasons:"
956
  msgstr ""
957
 
 
958
  #: src/Admin/Pages/TestTab.php:663
959
  msgid "SMTP settings are incorrect (wrong port, security setting, incorrect host)."
960
  msgstr ""
961
 
 
 
962
  #: src/Admin/Pages/TestTab.php:664
963
  #: src/Admin/Pages/TestTab.php:1050
964
  msgid "Your web server is blocking the connection."
965
  msgstr ""
966
 
 
967
  #: src/Admin/Pages/TestTab.php:665
968
  msgid "Your SMTP host is rejecting the connection."
969
  msgstr ""
970
 
 
971
  #: src/Admin/Pages/TestTab.php:668
972
  msgid "Triple check your SMTP settings including host address, email, and password, port, and security."
973
  msgstr ""
974
 
975
  #. translators: %1$s - SMTP host address, %2$s - SMTP port, %3$s - SMTP encryption.
 
976
  #: src/Admin/Pages/TestTab.php:671
977
  msgid "Contact your web hosting provider and ask them to verify your server can connect to %1$s on port %2$s using %3$s encryption. Additionally, ask them if a firewall or security policy may be preventing the connection - many shared hosts block certain ports.<br><strong>Note: this is the most common cause of this issue.</strong>"
978
  msgstr ""
979
 
 
980
  #: src/Admin/Pages/TestTab.php:684
981
  msgid "no"
982
  msgstr ""
983
 
 
 
 
984
  #: src/Admin/Pages/TestTab.php:697
985
  #: src/Admin/Pages/TestTab.php:712
986
  #: src/Admin/Pages/TestTab.php:728
987
  msgid "Mailgun failed."
988
  msgstr ""
989
 
 
990
  #: src/Admin/Pages/TestTab.php:698
991
  msgid "It seems that you forgot to activate your Mailgun account."
992
  msgstr ""
993
 
 
994
  #: src/Admin/Pages/TestTab.php:701
995
  msgid "Check your inbox you used to create a Mailgun account. Click the activation link in an email from Mailgun."
996
  msgstr ""
997
 
 
998
  #: src/Admin/Pages/TestTab.php:702
999
  msgid "If you do not see activation email, go to your Mailgun control panel and resend the activation email."
1000
  msgstr ""
1001
 
 
1002
  #: src/Admin/Pages/TestTab.php:713
1003
  msgid "Typically this error is because there is an issue with your Mailgun settings, in many cases the API key."
1004
  msgstr ""
1005
 
 
1006
  #: src/Admin/Pages/TestTab.php:716
1007
  msgid "Verify your API key is correct."
1008
  msgstr ""
1009
 
 
1010
  #: src/Admin/Pages/TestTab.php:717
1011
  msgid "Go to your Mailgun account and view your API key."
1012
  msgstr ""
1013
 
 
1014
  #: src/Admin/Pages/TestTab.php:718
1015
  msgid "Note that the API key includes the \"key\" prefix, so make sure that it is in the WP Mail SMTP Mailgun API setting."
1016
  msgstr ""
1017
 
 
1018
  #: src/Admin/Pages/TestTab.php:729
1019
  msgid "Your Mailgun account does not have access to send emails."
1020
  msgstr ""
1021
 
 
1022
  #: src/Admin/Pages/TestTab.php:730
1023
  msgid "Typically this error is because you have not set up and/or complete domain name verification for your Mailgun account."
1024
  msgstr ""
1025
 
1026
  #. translators: %s - Mailgun documentation URL.
 
1027
  #: src/Admin/Pages/TestTab.php:735
1028
  msgid "Go to our how-to guide for setting up <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Mailgun with WP Mail SMTP</a>."
1029
  msgstr ""
1030
 
 
1031
  #: src/Admin/Pages/TestTab.php:746
1032
  msgid "Complete the steps in section \"2. Verify Your Domain\"."
1033
  msgstr ""
1034
 
 
 
 
 
 
 
 
1035
  #: src/Admin/Pages/TestTab.php:756
1036
  #: src/Admin/Pages/TestTab.php:805
1037
  #: src/Admin/Pages/TestTab.php:825
1042
  msgid "Google API Error."
1043
  msgstr ""
1044
 
 
1045
  #: src/Admin/Pages/TestTab.php:757
1046
  msgid "You have not properly configured Gmail mailer."
1047
  msgstr ""
1048
 
 
1049
  #: src/Admin/Pages/TestTab.php:758
1050
  msgid "Make sure that you have clicked the \"Allow plugin to send emails using your Google account\" button under Gmail settings."
1051
  msgstr ""
1052
 
 
1053
  #: src/Admin/Pages/TestTab.php:761
1054
  msgid "Go to plugin Settings page and click the \"Allow plugin to send emails using your Google account\" button."
1055
  msgstr ""
1056
 
 
1057
  #: src/Admin/Pages/TestTab.php:762
1058
  msgid "After the click you should be redirected to a Gmail authorization screen, where you will be asked a permission to send emails on your behalf."
1059
  msgstr ""
1060
 
 
1061
  #: src/Admin/Pages/TestTab.php:763
1062
  msgid "Please click \"Agree\", if you see that button. If not - you will need to enable less secure apps first:"
1063
  msgstr ""
1064
 
1065
  #. translators: %s - Google support article URL.
 
1066
  #: src/Admin/Pages/TestTab.php:768
1067
  msgid "if you are using regular Gmail account, please <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">read this article</a> to proceed."
1068
  msgstr ""
1069
 
1070
  #. translators: %s - Google support article URL.
 
1071
  #: src/Admin/Pages/TestTab.php:783
1072
  msgid "if you are using G Suite, please <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">read this article</a> to proceed."
1073
  msgstr ""
1074
 
 
1075
  #: src/Admin/Pages/TestTab.php:806
1076
  msgid "Typically this error is because address the email was sent to is invalid or was empty."
1077
  msgstr ""
1078
 
 
1079
  #: src/Admin/Pages/TestTab.php:809
1080
  msgid "Check the \"Send To\" email address used and confirm it is a valid email and was not empty."
1081
  msgstr ""
1082
 
1083
  #. translators: 1 - correct email address example. 2 - incorrect email address example.
 
1084
  #: src/Admin/Pages/TestTab.php:811
1085
  msgid "It should be something like this: %1$s. These are incorrect values: %2$s."
1086
  msgstr ""
1087
 
 
1088
  #: src/Admin/Pages/TestTab.php:815
1089
  msgid "Make sure that the generated email has a TO header, useful when you are responsible for email creation."
1090
  msgstr ""
1091
 
 
1092
  #: src/Admin/Pages/TestTab.php:826
1093
  msgid "Unfortunately, this error can be due to many different reasons."
1094
  msgstr ""
1095
 
1096
  #. translators: %s - Blog article URL.
 
1097
  #: src/Admin/Pages/TestTab.php:831
1098
  msgid "Please <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">read this article</a> to learn more about what can cause this error and how it can be resolved."
1099
  msgstr ""
1100
 
 
1101
  #: src/Admin/Pages/TestTab.php:852
1102
  msgid "Authentication code that Google returned to you has already been used on your previous auth attempt."
1103
  msgstr ""
1104
 
 
1105
  #: src/Admin/Pages/TestTab.php:855
1106
  msgid "Make sure that you are not trying to manually clean up the plugin options to retry the \"Allow...\" step."
1107
  msgstr ""
1108
 
 
1109
  #: src/Admin/Pages/TestTab.php:856
1110
  msgid "Reinstall the plugin with clean plugin data turned on on Misc page. This will remove all the plugin options and you will be safe to retry."
1111
  msgstr ""
1112
 
 
1113
  #: src/Admin/Pages/TestTab.php:857
1114
  msgid "Make sure there is no aggressive caching on site admin area pages or try to clean cache between attempts."
1115
  msgstr ""
1116
 
 
1117
  #: src/Admin/Pages/TestTab.php:868
1118
  msgid "There are various reasons for that, please review the steps below."
1119
  msgstr ""
1120
 
1121
  #. translators: %s - Google G Suite Admin area URL.
 
1122
  #: src/Admin/Pages/TestTab.php:873
1123
  msgid "Make sure that your G Suite trial period has not expired. You can check the status <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>."
1124
  msgstr ""
1125
 
1126
  #. translators: %s - Google G Suite Admin area URL.
 
1127
  #: src/Admin/Pages/TestTab.php:886
1128
  msgid "Make sure that Gmail app in your G Suite is actually enabled. You can check that in Apps list in <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">G Suite Admin</a> area."
1129
  msgstr ""
1130
 
1131
  #. translators: %s - Google Developers Console URL.
 
1132
  #: src/Admin/Pages/TestTab.php:899
1133
  msgid "Make sure that you have Gmail API enabled, and you can do that <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>."
1134
  msgstr ""
1135
 
 
 
1136
  #: src/Admin/Pages/TestTab.php:922
1137
  #: src/Admin/Pages/TestTab.php:949
1138
  msgid "Make sure that the used Client ID/Secret correspond to a proper project that has Gmail API enabled."
1139
  msgstr ""
1140
 
1141
  #. translators: %s - Gmail documentation URL.
 
1142
  #: src/Admin/Pages/TestTab.php:925
1143
  msgid "Please follow our <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Gmail tutorial</a> to be sure that all the correct project and data is applied."
1144
  msgstr ""
1145
 
 
1146
  #: src/Admin/Pages/TestTab.php:946
1147
  msgid "You may have added a new API to a project"
1148
  msgstr ""
1149
 
 
1150
  #: src/Admin/Pages/TestTab.php:950
1151
  msgid "Try to use a separate project for your emails, so the project has only 1 Gmail API in it enabled. You will need to remove the old project and create a new one from scratch."
1152
  msgstr ""
1153
 
 
1154
  #: src/Admin/Pages/TestTab.php:960
1155
  msgid "SMTP.com API Error."
1156
  msgstr ""
1157
 
 
1158
  #: src/Admin/Pages/TestTab.php:961
1159
  msgid "Your Sender Name option is incorrect."
1160
  msgstr ""
1161
 
 
1162
  #: src/Admin/Pages/TestTab.php:964
1163
  msgid "Please make sure you entered an accurate Sender Name in WP Mail SMTP plugin settings."
1164
  msgstr ""
1165
 
 
1166
  #: src/Admin/Pages/TestTab.php:974
1167
  msgid "GuzzleHttp requirements."
1168
  msgstr ""
1169
 
 
1170
  #: src/Admin/Pages/TestTab.php:975
1171
  msgid "GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler."
1172
  msgstr ""
1173
 
 
1174
  #: src/Admin/Pages/TestTab.php:978
1175
  msgid "Edit your php.ini file on your hosting server."
1176
  msgstr ""
1177
 
 
1178
  #: src/Admin/Pages/TestTab.php:979
1179
  msgid "(Recommended) Enable PHP extension: cURL, by adding \"extension=curl\" to the php.ini file (without the quotation marks) OR"
1180
  msgstr ""
1181
 
 
1182
  #: src/Admin/Pages/TestTab.php:980
1183
  msgid "(If cURL can't be enabled on your hosting server) Enable PHP setting: allow_url_fopen, by adding \"allow_url_fopen = On\" to the php.ini file (without the quotation marks)"
1184
  msgstr ""
1185
 
 
1186
  #: src/Admin/Pages/TestTab.php:981
1187
  msgid "If you don't know how to do the above we strongly suggest contacting your hosting support and provide them the \"full Error Log for debugging\" below and these steps. They should be able to fix this issue for you."
1188
  msgstr ""
1189
 
 
1190
  #: src/Admin/Pages/TestTab.php:1003
1191
  msgid "PCRE library issue"
1192
  msgstr ""
1193
 
 
1194
  #: src/Admin/Pages/TestTab.php:1004
1195
  msgid "It looks like your server is running PHP version 7.4.x with an outdated PCRE library (libpcre2) that has a known issue with email address validation."
1196
  msgstr ""
1197
 
 
1198
  #: src/Admin/Pages/TestTab.php:1005
1199
  msgid "There is a known issue with PHP version 7.4.x, when using libpcre2 library version lower than 10.33."
1200
  msgstr ""
1201
 
 
1202
  #: src/Admin/Pages/TestTab.php:1008
1203
  msgid "Contact your web hosting provider and inform them you are having issues with libpcre2 library on PHP 7.4."
1204
  msgstr ""
1205
 
 
1206
  #: src/Admin/Pages/TestTab.php:1009
1207
  msgid "They should be able to resolve this issue for you."
1208
  msgstr ""
1209
 
 
1210
  #: src/Admin/Pages/TestTab.php:1010
1211
  msgid "For a quick fix, until your web hosting resolves this, you can downgrade to PHP version 7.3 on your server."
1212
  msgstr ""
1213
 
 
1214
  #: src/Admin/Pages/TestTab.php:1046
1215
  msgid "An issue was detected."
1216
  msgstr ""
1217
 
 
1218
  #: src/Admin/Pages/TestTab.php:1047
1219
  msgid "This means your test email was unable to be sent."
1220
  msgstr ""
1221
 
 
1222
  #: src/Admin/Pages/TestTab.php:1049
1223
  msgid "Plugin settings are incorrect (wrong SMTP settings, invalid Mailer configuration, etc)."
1224
  msgstr ""
1225
 
 
1226
  #: src/Admin/Pages/TestTab.php:1051
1227
  msgid "Your host is rejecting the connection."
1228
  msgstr ""
1229
 
 
1230
  #: src/Admin/Pages/TestTab.php:1054
1231
  msgid "Triple check the plugin settings, consider reconfiguring to make sure everything is correct (eg bad copy and paste)."
1232
  msgstr ""
1233
 
 
1234
  #: src/Admin/Pages/TestTab.php:1056
1235
  msgid "Contact your web hosting provider and ask them to verify your server can make outside connections. Additionally, ask them if a firewall or security policy may be preventing the connection - many shared hosts block certain ports.<br><strong>Note: this is the most common cause of this issue.</strong>"
1236
  msgstr ""
1237
 
 
1238
  #: src/Admin/Pages/TestTab.php:1062
1239
  msgid "Try using a different mailer."
1240
  msgstr ""
1241
 
 
1242
  #: src/Admin/Pages/TestTab.php:1081
1243
  msgid "There was a problem while sending the test email."
1244
  msgstr ""
1245
 
 
1246
  #: src/Admin/Pages/TestTab.php:1091
1247
  msgid "Recommended next steps:"
1248
  msgstr ""
1249
 
 
1250
  #: src/Admin/Pages/TestTab.php:1101
1251
  msgid "Need support?"
1252
  msgstr ""
1253
 
1254
  #. translators: %s - WPMailSMTP.com account area link.
 
1255
  #: src/Admin/Pages/TestTab.php:1109
1256
  msgid "As a WP Mail SMTP Pro user you have access to WP Mail SMTP priority support. Please log in to your WPMailSMTP.com account and <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">submit a support ticket</a>."
1257
  msgstr ""
1258
 
 
1259
  #: src/Admin/Pages/TestTab.php:1126
1260
  msgid "WP Mail SMTP is a free plugin, and the team behind WPForms maintains it to give back to the WordPress community."
1261
  msgstr ""
1262
 
1263
  #. translators: %s - WPMailSMTP.com URL.
 
1264
  #: src/Admin/Pages/TestTab.php:1133
1265
  msgid "To access our world class support, please <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">upgrade to WP Mail SMTP Pro</a>. Along with getting expert support, you will also get Notification controls, Email Logging, and integrations for Amazon SES, Office 365, and Outlook.com."
1266
  msgstr ""
1267
 
 
1268
  #: src/Admin/Pages/TestTab.php:1148
1269
  msgid "Additionally, you can take advantage of our White Glove Setup. Sit back and relax while we handle everything for you! If you simply don't have time or maybe you feel a bit in over your head - we got you covered."
1270
  msgstr ""
1271
 
 
1272
  #: src/Admin/Pages/TestTab.php:1154
1273
  msgid "As a valued WP Mail SMTP user, you will get <span class=\"price-off\">$50 off regular pricing</span>, automatically applied at checkout!"
1274
  msgstr ""
1275
 
1276
  #. translators: %1$s - WP Mail SMTP support policy URL, %2$s - WP Mail SMTP support forum URL, %3$s - WPMailSMTP.com URL.
 
1277
  #: src/Admin/Pages/TestTab.php:1168
1278
  msgid "Alternatively, we also offer <a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">limited support</a> on the WordPress.org support forums. You can <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">create a support thread</a> there, but please understand that free support is not guaranteed and is limited to simple issues. If you have an urgent or complex issue, then please consider <a href=\"%3$s\" target=\"_blank\" rel=\"noopener noreferrer\">upgrading to WP Mail SMTP Pro</a> to access our priority support ticket system."
1279
  msgstr ""
1280
 
 
1281
  #: src/Admin/Pages/TestTab.php:1189
1282
  msgid "Click here to view the full Error Log for debugging"
1283
  msgstr ""
1284
 
 
1285
  #: src/Admin/Pages/TestTab.php:1198
1286
  msgid "Please copy only the content of the error debug message above, identified with an orange left border, into the support forum topic if you experience any issues."
1287
  msgstr ""
1288
 
 
1289
  #: src/Admin/Review.php:119
1290
  msgid "Are you enjoying WP Mail SMTP?"
1291
  msgstr ""
1292
 
 
1293
  #: src/Admin/Review.php:121
1294
  msgid "Yes"
1295
  msgstr ""
1296
 
 
1297
  #: src/Admin/Review.php:122
1298
  msgid "Not Really"
1299
  msgstr ""
1300
 
 
1301
  #: src/Admin/Review.php:126
1302
  msgid "We're sorry to hear you aren't enjoying WP Mail SMTP. We would love a chance to improve. Could you take a minute and let us know what we can do better?"
1303
  msgstr ""
1304
 
 
1305
  #: src/Admin/Review.php:129
1306
  msgid "Give Feedback"
1307
  msgstr ""
1308
 
 
1309
  #: src/Admin/Review.php:132
1310
  msgid "No thanks"
1311
  msgstr ""
1312
 
 
1313
  #: src/Admin/Review.php:137
1314
  msgid "That’s awesome! Could you please do me a BIG favor and give it a 5-star rating on WordPress to help us spread the word and boost our motivation?"
1315
  msgstr ""
1316
 
 
1317
  #: src/Admin/Review.php:138
1318
  msgid "~ Jared Atchison<br>Lead Developer, WP Mail SMTP"
1319
  msgstr ""
1320
 
 
1321
  #: src/Admin/Review.php:141
1322
  msgid "Ok, you deserve it"
1323
  msgstr ""
1324
 
 
1325
  #: src/Admin/Review.php:143
1326
  msgid "Nope, maybe later"
1327
  msgstr ""
1328
 
 
1329
  #: src/Admin/Review.php:144
1330
  msgid "I already did"
1331
  msgstr ""
1332
 
1333
  #. translators: %1$s - Plugin name causing conflict; %2$s - Plugin name causing conflict.
 
1334
  #: src/Conflicts.php:159
1335
  msgid "Heads up! WP Mail SMTP has detected %1$s is activated. Please deactivate %2$s to prevent conflicts."
1336
  msgstr ""
1337
 
1338
  #. translators: %1$s - WP Mail SMTP plugin name; %2$s - WPMailSMTP.com URL to a related doc.
1339
+ #: src/Core.php:381
 
1340
  msgid "Your site is running an outdated version of PHP that is no longer supported and may cause issues with %1$s. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Read more</a> for additional information."
1341
  msgstr ""
1342
 
1343
+ #: src/Core.php:395
 
1344
  msgid "<strong>Please Note:</strong> Support for PHP 5.5 will be discontinued in 2020. After this, if no further action is taken, WP Mail SMTP functionality will be disabled."
1345
  msgstr ""
1346
 
1347
  #. translators: %s - plugin name and its version.
1348
+ #: src/Core.php:429
 
1349
  msgid "<strong>EMAILING DISABLED:</strong> The %s is currently blocking all emails from being sent."
1350
  msgstr ""
1351
 
1352
  #. translators: %1$s - constant name; %2$s - constant value.
1353
+ #: src/Core.php:440
 
1354
  msgid "To send emails, change the value of the %1$s constant to %2$s."
1355
  msgstr ""
1356
 
1357
  #. translators: %s - plugin Misc settings page URL.
1358
+ #: src/Core.php:451
 
1359
  msgid "To send emails, go to plugin <a href=\"%s\">Misc settings</a> and disable the \"Do Not Send\" option."
1360
  msgstr ""
1361
 
1362
  #. translators: %s - plugin name and its version.
1363
+ #: src/Core.php:482
 
1364
  msgid "<strong>EMAIL DELIVERY ERROR:</strong> the plugin %s logged this error during the last time it tried to send an email:"
1365
  msgstr ""
1366
 
1367
+ #: src/Core.php:512
 
1368
  msgid "Consider running an email test after fixing it."
1369
  msgstr ""
1370
 
1371
  #. translators: %1$s - WP Mail SMTP, %2$s - error message.
 
1372
  #: src/Migration.php:137
1373
  msgid "There was an error while upgrading the database. Please contact %1$s support with this information: %2$s."
1374
  msgstr ""
1375
 
 
1376
  #: src/Pro/Providers/Providers.php:158
1377
  msgid "OK"
1378
  msgstr ""
1379
 
 
1380
  #: src/Pro/SiteHealth.php:58
1381
  msgid "Is wpmailsmtp.com reachable?"
1382
  msgstr ""
1383
 
 
1384
  #: src/Providers/AmazonSES/Options.php:25
1385
  msgid "Amazon SES"
1386
  msgstr ""
1387
 
 
1388
  #: src/Providers/AmazonSES/Options.php:39
1389
  msgid "We're sorry, the Amazon SES mailer is not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features."
1390
  msgstr ""
1391
 
1392
+ #: src/Providers/Gmail/Auth.php:182
 
1393
  msgid "There was an error while processing the Google authentication request. Please make sure that you have Client ID and Client Secret both valid and saved."
1394
  msgstr ""
1395
 
1396
+ #: src/Providers/Gmail/Mailer.php:255
 
1397
  msgid "Please re-grant Google app permissions!"
1398
  msgstr ""
1399
 
1400
+ #: src/Providers/Gmail/Mailer.php:256
 
1401
  msgid "Go to WP Mail SMTP plugin settings page. Click the “Remove Connection” button."
1402
  msgstr ""
1403
 
1404
+ #: src/Providers/Gmail/Mailer.php:257
 
1405
  msgid "Then click the “Allow plugin to send emails using your Google account” button and re-enable access."
1406
  msgstr ""
1407
 
 
1408
  #: src/Providers/Gmail/Options.php:32
1409
  msgid "Gmail"
1410
  msgstr ""
1411
 
1412
  #. translators: %s - URL to our Gmail doc.
 
1413
  #: src/Providers/Gmail/Options.php:35
1414
  msgid "Send emails using your Gmail or G Suite (formerly Google Apps) account, all while keeping your login credentials safe. Other Google SMTP methods require enabling less secure apps in your account and entering your password. However, this integration uses the Google API to improve email delivery issues while keeping your site secure.<br><br>Read our <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Gmail documentation</a> to learn how to configure Gmail or G Suite."
1415
  msgstr ""
1416
 
 
1417
  #: src/Providers/Gmail/Options.php:48
1418
  msgid "The Gmail mailer works well for sites that send low numbers of emails. However, Gmail's API has rate limitations and a number of additional restrictions that can lead to challenges during setup. If you expect to send a high volume of emails, or if you find that your web host is not compatible with the Gmail API restrictions, then we recommend considering a different mailer option."
1419
  msgstr ""
1420
 
 
1421
  #: src/Providers/Gmail/Options.php:72
1422
  msgid "Client ID"
1423
  msgstr ""
1424
 
 
1425
  #: src/Providers/Gmail/Options.php:87
1426
  msgid "Client Secret"
1427
  msgstr ""
1428
 
 
1429
  #: src/Providers/Gmail/Options.php:109
1430
  msgid "Authorized redirect URI"
1431
  msgstr ""
1432
 
 
1433
  #: src/Providers/Gmail/Options.php:117
1434
  msgid "Copy URL to clipboard"
1435
  msgstr ""
1436
 
 
1437
  #: src/Providers/Gmail/Options.php:122
1438
  msgid "Please copy this URL into the \"Authorized redirect URIs\" field of your Google web application."
1439
  msgstr ""
1440
 
 
1441
  #: src/Providers/Gmail/Options.php:131
1442
  msgid "Authorization"
1443
  msgstr ""
1444
 
 
1445
  #: src/Providers/Gmail/Options.php:159
1446
  msgid "Allow plugin to send emails using your Google account"
1447
  msgstr ""
1448
 
 
1449
  #: src/Providers/Gmail/Options.php:162
1450
  msgid "Click the button above to confirm authorization."
1451
  msgstr ""
1452
 
 
1453
  #: src/Providers/Gmail/Options.php:168
1454
  msgid "Remove Connection"
1455
  msgstr ""
1456
 
1457
  #. translators: %s - email address, as received from Google API.
 
1458
  #: src/Providers/Gmail/Options.php:177
1459
  msgid "Connected as %s"
1460
  msgstr ""
1461
 
1462
+ #. translators: %s - URL to Google Gmail alias documentation page.
1463
+ #: src/Providers/Gmail/Options.php:187
1464
+ msgid "If you want to use a different From Email address you can set-up a Google email alias. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Follow these instructions</a> and then select the From Email at the top of this page."
1465
+ msgstr ""
1466
+
1467
+ #: src/Providers/Gmail/Options.php:201
1468
  msgid "Removing the connection will give you an ability to redo the connection or link to another Google account."
1469
  msgstr ""
1470
 
1471
+ #: src/Providers/Gmail/Options.php:209
 
1472
  msgid "You need to save settings with Client ID and Client Secret before you can proceed."
1473
  msgstr ""
1474
 
 
1475
  #: src/Providers/Mail/Options.php:25
1476
  msgid "Default (none)"
1477
  msgstr ""
1478
 
 
1479
  #: src/Providers/Mail/Options.php:37
1480
  msgid "You currently have the native WordPress option selected. Please select any other Mailer option above to continue the setup."
1481
  msgstr ""
1482
 
1483
+ #: src/Providers/Mailgun/Mailer.php:392
1484
+ msgid "Mailgun API request was successful, but it could not queue the email for delivery."
1485
+ msgstr ""
1486
+
1487
+ #: src/Providers/Mailgun/Mailer.php:393
1488
+ msgid "This could point to an incorrect Domain Name in the plugin settings."
1489
+ msgstr ""
1490
+
1491
+ #: src/Providers/Mailgun/Mailer.php:394
1492
+ msgid "Please check the WP Mail SMTP plugin settings and make sure the Mailgun Domain Name setting is correct."
1493
+ msgstr ""
1494
+
1495
  #: src/Providers/Mailgun/Options.php:25
1496
  msgid "Mailgun"
1497
  msgstr ""
1498
 
1499
  #. translators: %1$s - opening link tag; %2$s - closing link tag; %3$s - opening link tag; %4$s - closing link tag.
 
1500
  #: src/Providers/Mailgun/Options.php:29
1501
  msgid "%1$sMailgun%2$s is one of the leading transactional email services trusted by over 150,000+ businesses. They provide 5,000 free emails per month for 3 months.<br><br>Read our %3$sMailgun documentation%4$s to learn how to configure Mailgun and improve your email deliverability."
1502
  msgstr ""
1503
 
 
1504
  #: src/Providers/Mailgun/Options.php:57
1505
  msgid "Private API Key"
1506
  msgstr ""
1507
 
1508
  #. translators: %s - API key link.
 
1509
  #: src/Providers/Mailgun/Options.php:76
1510
  msgid "Follow this link to get an API Key from Mailgun: %s."
1511
  msgstr ""
1512
 
 
1513
  #: src/Providers/Mailgun/Options.php:78
1514
  msgid "Get a Private API Key"
1515
  msgstr ""
1516
 
 
1517
  #: src/Providers/Mailgun/Options.php:89
1518
  msgid "Domain Name"
1519
  msgstr ""
1520
 
1521
  #. translators: %s - Domain Name link.
 
1522
  #: src/Providers/Mailgun/Options.php:101
1523
  msgid "Follow this link to get a Domain Name from Mailgun: %s."
1524
  msgstr ""
1525
 
 
1526
  #: src/Providers/Mailgun/Options.php:103
1527
  msgid "Get a Domain Name"
1528
  msgstr ""
1529
 
 
1530
  #: src/Providers/Mailgun/Options.php:114
1531
  msgid "Region"
1532
  msgstr ""
1533
 
 
1534
  #: src/Providers/Mailgun/Options.php:124
1535
  msgid "US"
1536
  msgstr ""
1537
 
 
1538
  #: src/Providers/Mailgun/Options.php:133
1539
  msgid "EU"
1540
  msgstr ""
1541
 
 
1542
  #: src/Providers/Mailgun/Options.php:137
1543
  msgid "Define which endpoint you want to use for sending messages."
1544
  msgstr ""
1545
 
 
1546
  #: src/Providers/Mailgun/Options.php:138
1547
  msgid "If you are operating under EU laws, you may be required to use EU region."
1548
  msgstr ""
1549
 
1550
  #. translators: %s - URL to Mailgun.com page.
 
1551
  #: src/Providers/Mailgun/Options.php:143
1552
  msgid "<a href=\"%s\" rel=\"\" target=\"_blank\">More information</a> on Mailgun.com."
1553
  msgstr ""
1554
 
 
1555
  #: src/Providers/OptionsAbstract.php:186
1556
  msgid "SMTP Host"
1557
  msgstr ""
1558
 
 
1559
  #: src/Providers/OptionsAbstract.php:200
1560
  msgid "Encryption"
1561
  msgstr ""
1562
 
 
1563
  #: src/Providers/OptionsAbstract.php:210
1564
  msgid "None"
1565
  msgstr ""
1566
 
 
1567
  #: src/Providers/OptionsAbstract.php:219
1568
  msgid "SSL"
1569
  msgstr ""
1570
 
 
1571
  #: src/Providers/OptionsAbstract.php:228
1572
  msgid "TLS"
1573
  msgstr ""
1574
 
 
1575
  #: src/Providers/OptionsAbstract.php:232
1576
  msgid "For most servers TLS is the recommended option. If your SMTP provider offers both SSL and TLS options, we recommend using TLS."
1577
  msgstr ""
1578
 
 
1579
  #: src/Providers/OptionsAbstract.php:240
1580
  msgid "SMTP Port"
1581
  msgstr ""
1582
 
 
1583
  #: src/Providers/OptionsAbstract.php:254
1584
  msgid "Auto TLS"
1585
  msgstr ""
1586
 
 
1587
  #: src/Providers/OptionsAbstract.php:268
1588
  msgid "By default TLS encryption is automatically used if the server supports it, which is recommended. In some cases, due to server misconfigurations, this can cause issues and may need to be disabled."
1589
  msgstr ""
1590
 
 
1591
  #: src/Providers/OptionsAbstract.php:276
1592
  msgid "Authentication"
1593
  msgstr ""
1594
 
 
1595
  #: src/Providers/OptionsAbstract.php:295
1596
  msgid "SMTP Username"
1597
  msgstr ""
1598
 
 
1599
  #: src/Providers/OptionsAbstract.php:309
1600
  msgid "SMTP Password"
1601
  msgstr ""
1602
 
1603
  #. translators: %s - constant name: WPMS_SMTP_PASS.
 
1604
  #: src/Providers/OptionsAbstract.php:321
1605
  msgid "To change the password you need to change the value of the constant there: %s"
1606
  msgstr ""
1607
 
1608
  #. translators: %1$s - wp-config.php file, %2$s - WPMS_ON constant name.
 
1609
  #: src/Providers/OptionsAbstract.php:329
1610
  msgid "If you want to disable the use of constants, find in %1$s file the constant %2$s and turn if off:"
1611
  msgstr ""
1612
 
 
1613
  #: src/Providers/OptionsAbstract.php:339
1614
  msgid "All the defined constants will stop working and you will be able to change all the values on this page."
1615
  msgstr ""
1616
 
 
1617
  #: src/Providers/OptionsAbstract.php:347
1618
  msgid "The password will be stored in plain text. For improved security, we highly recommend using your site's WordPress configuration file to set your password."
1619
  msgstr ""
1620
 
 
1621
  #: src/Providers/OptionsAbstract.php:350
1622
  msgid "Learn More"
1623
  msgstr ""
1624
 
1625
  #. translators: %1$s - Provider name; %2$s - PHP version required by Provider; %3$s - current PHP version.
 
1626
  #: src/Providers/OptionsAbstract.php:410
1627
  msgid "%1$s requires PHP %2$s to work and does not support your current PHP version %3$s. Please contact your host and request a PHP upgrade to the latest one."
1628
  msgstr ""
1629
 
 
1630
  #: src/Providers/OptionsAbstract.php:417
1631
  msgid "Meanwhile you can switch to some other mailers."
1632
  msgstr ""
1633
 
1634
  #. translators: %s - Provider name
 
1635
  #: src/Providers/OptionsAbstract.php:436
1636
  msgid "%s requires an SSL certificate, and so is not currently compatible with your site. Please contact your host to request a SSL certificate, or check out <a href=\"https://www.wpbeginner.com/wp-tutorials/how-to-add-ssl-and-https-in-wordpress/\" target=\"_blank\">WPBeginner's tutorial on how to set up SSL</a>."
1637
  msgstr ""
1638
 
 
1639
  #: src/Providers/OptionsAbstract.php:449
1640
  msgid "If you'd prefer not to set up SSL, or need an SMTP solution in the meantime, please select a different mailer option."
1641
  msgstr ""
1642
 
 
1643
  #: src/Providers/Outlook/Options.php:25
1644
  msgid "Outlook"
1645
  msgstr ""
1646
 
 
1647
  #: src/Providers/Outlook/Options.php:39
1648
  msgid "We're sorry, the Microsoft Outlook mailer is not available on your plan. Please upgrade to the PRO plan to unlock all these awesome features."
1649
  msgstr ""
1650
 
 
1651
  #: src/Providers/Pepipost/Options.php:25
1652
  msgid "Pepipost SMTP"
1653
  msgstr ""
1654
 
1655
+ #: src/Providers/PepipostAPI/Mailer.php:339
1656
+ msgid "General error"
1657
+ msgstr ""
1658
+
1659
+ #: src/Providers/PepipostAPI/Mailer.php:340
1660
+ msgid "Error"
1661
+ msgstr ""
1662
+
1663
  #. translators: %1$s - URL to pepipost.com site.
 
1664
  #: src/Providers/PepipostAPI/Options.php:31
1665
  msgid "<strong><a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">Pepipost</a> is a recommended transactional email service.</strong> Every month Pepipost delivers over 8 billion emails from 20,000+ customers. Their mission is to reliably send emails in the most efficient way and at the most disruptive pricing ever. Pepipost provides users 30,000 free emails the first 30 days."
1666
  msgstr ""
1667
 
1668
  #. translators: %1$s - URL to wpmailsmtp.com doc.
 
1669
  #: src/Providers/PepipostAPI/Options.php:34
1670
  msgid "Read our <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Pepipost documentation</a> to learn how to configure Pepipost and improve your email deliverability."
1671
  msgstr ""
1672
 
 
1673
  #: src/Providers/PepipostAPI/Options.php:53
1674
  msgid "Get Started with Pepipost"
1675
  msgstr ""
1676
 
 
1677
  #: src/Providers/PepipostAPI/Options.php:61
1678
  msgid "Pepipost"
1679
  msgstr ""
1680
 
 
 
 
 
1681
  #: src/Providers/PepipostAPI/Options.php:88
1682
  #: src/Providers/Sendgrid/Options.php:57
1683
  #: src/Providers/Sendinblue/Options.php:76
1686
  msgstr ""
1687
 
1688
  #. translators: %s - link to get an API Key.
 
 
1689
  #: src/Providers/PepipostAPI/Options.php:107
1690
  #: src/Providers/Sendinblue/Options.php:95
1691
  msgid "Follow this link to get an API Key: %s."
1692
  msgstr ""
1693
 
 
1694
  #: src/Providers/PepipostAPI/Options.php:109
1695
  msgid "Get the API Key"
1696
  msgstr ""
1697
 
 
1698
  #: src/Providers/Sendgrid/Options.php:25
1699
  msgid "SendGrid"
1700
  msgstr ""
1701
 
1702
  #. translators: %1$s - opening link tag; %2$s - closing link tag; %3$s - opening link tag; %4$s - closing link tag.
 
1703
  #: src/Providers/Sendgrid/Options.php:29
1704
  msgid "%1$sSendGrid%2$s is one of the leading transactional email services, sending over 35 billion emails every month. They provide users 100 free emails per day.<br><br>Read our %3$sSendGrid documentation%4$s to learn how to set up SendGrid and improve your email deliverability."
1705
  msgstr ""
1706
 
1707
  #. translators: %s - API key link.
 
1708
  #: src/Providers/Sendgrid/Options.php:76
1709
  msgid "Follow this link to get an API Key from SendGrid: %s."
1710
  msgstr ""
1711
 
 
1712
  #: src/Providers/Sendgrid/Options.php:78
1713
  msgid "Create API Key"
1714
  msgstr ""
1715
 
1716
  #. translators: %s - SendGrid access level.
 
1717
  #: src/Providers/Sendgrid/Options.php:86
1718
  msgid "To send emails you will need only a %s access level for this API key."
1719
  msgstr ""
1720
 
 
1721
  #: src/Providers/Sendinblue/Options.php:33
1722
  msgid "Sendinblue"
1723
  msgstr ""
1724
 
1725
  #. translators: %1$s - URL to sendinblue.com site.
 
1726
  #: src/Providers/Sendinblue/Options.php:37
1727
  msgid "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">Sendinblue</a> serves 80,000+ growing companies around the world and sends over 30 million emails each day. They provide users 300 free emails per day."
1728
  msgstr ""
1729
 
1730
  #. translators: %2$s - URL to wpmailsmtp.com doc.
 
1731
  #: src/Providers/Sendinblue/Options.php:40
1732
  msgid "Read our <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Sendinblue documentation</a> to learn how to configure Sendinblue and improve your email deliverability."
1733
  msgstr ""
1734
 
 
1735
  #: src/Providers/Sendinblue/Options.php:97
1736
  msgid "Get v3 API Key"
1737
  msgstr ""
1738
 
 
1739
  #: src/Providers/SMTP/Options.php:25
1740
  msgid "Other SMTP"
1741
  msgstr ""
1742
 
1743
  #. translators: %s - URL to SMTP documentation.
 
1744
  #: src/Providers/SMTP/Options.php:29
1745
  msgid "Use the SMTP details provided by your hosting provider or email service.<br><br>To see recommended settings for the popular services as well as troubleshooting tips, check out our <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">SMTP documentation</a>."
1746
  msgstr ""
1747
 
1748
+ #: src/Providers/SMTPcom/Mailer.php:434
 
1749
  msgid "Api Key:"
1750
  msgstr ""
1751
 
1752
+ #: src/Providers/SMTPcom/Mailer.php:436
 
1753
  msgid "Channel:"
1754
  msgstr ""
1755
 
1756
  #. translators: %s - URL to smtp.com site.
 
1757
  #: src/Providers/SMTPcom/Options.php:41
1758
  msgid "<strong><a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">SMTP.com</a> is a recommended transactional email service.</strong> With a 22 years of track record of reliable email delivery, SMTP.com is a premiere solution for WordPress developers and website owners. SMTP.com has been around for almost as long as email itself. Their super simple integration interface makes it easy to get started while a powerful API and robust documentation make it a preferred choice among developers. Start a 30-day free trial with 50,000 emails."
1759
  msgstr ""
1760
 
1761
  #. translators: %s - URL to wpmailsmtp.com doc page for stmp.com.
 
1762
  #: src/Providers/SMTPcom/Options.php:49
1763
  msgid "Read our <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">SMTP.com documentation</a> to learn how to configure SMTP.com and improve your email deliverability."
1764
  msgstr ""
1765
 
 
1766
  #: src/Providers/SMTPcom/Options.php:59
1767
  msgid "Get Started with SMTP.com"
1768
  msgstr ""
1769
 
 
1770
  #: src/Providers/SMTPcom/Options.php:67
1771
  msgid "SMTP.com"
1772
  msgstr ""
1773
 
1774
  #. translators: %s - API key link.
 
1775
  #: src/Providers/SMTPcom/Options.php:101
1776
  msgid "Follow this link to get an API Key from SMTP.com: %s."
1777
  msgstr ""
1778
 
 
1779
  #: src/Providers/SMTPcom/Options.php:103
1780
  msgid "Get API Key"
1781
  msgstr ""
1782
 
 
1783
  #: src/Providers/SMTPcom/Options.php:114
1784
  msgid "Sender Name"
1785
  msgstr ""
1786
 
1787
  #. translators: %s - Channel/Sender Name link for smtp.com documentation.
 
1788
  #: src/Providers/SMTPcom/Options.php:130
1789
  msgid "Follow this link to get a Sender Name from SMTP.com: %s."
1790
  msgstr ""
1791
 
 
1792
  #: src/Providers/SMTPcom/Options.php:132
1793
  msgid "Get Sender Name"
1794
  msgstr ""
1795
 
 
1796
  #: src/SiteHealth.php:67
1797
  msgid "Is WP Mail SMTP mailer setup complete?"
1798
  msgstr ""
1799
 
1800
+ #: src/SiteHealth.php:72
1801
+ msgid "Do WP Mail SMTP DB tables exist?"
1802
+ msgstr ""
1803
+
1804
+ #: src/SiteHealth.php:98
1805
  msgid "Version"
1806
  msgstr ""
1807
 
1808
+ #: src/SiteHealth.php:102
 
1809
  msgid "License key type"
1810
  msgstr ""
1811
 
1812
+ #: src/SiteHealth.php:106
 
1813
  msgid "Debug"
1814
  msgstr ""
1815
 
1816
+ #: src/SiteHealth.php:107
 
1817
  msgid "No debug notices found."
1818
  msgstr ""
1819
 
1820
+ #: src/SiteHealth.php:110
1821
+ msgid "DB tables"
1822
+ msgstr ""
1823
+
1824
+ #: src/SiteHealth.php:112
1825
+ msgid "No DB tables found."
1826
+ msgstr ""
1827
+
1828
+ #: src/SiteHealth.php:142
1829
  msgid "Current mailer"
1830
  msgstr ""
1831
 
1832
+ #: src/SiteHealth.php:147
 
1833
  msgid "WP Mail SMTP mailer setup is complete"
1834
  msgstr ""
1835
 
1836
+ #: src/SiteHealth.php:156
 
1837
  msgid "The WP Mail SMTP plugin mailer setup is complete. You can send a test email, to make sure it's working properly."
1838
  msgstr ""
1839
 
1840
+ #: src/SiteHealth.php:161
 
1841
  msgid "Test email sending"
1842
  msgstr ""
1843
 
1844
+ #: src/SiteHealth.php:169
 
1845
  msgid "You currently have the default mailer selected, which means that you haven’t set up SMTP yet."
1846
  msgstr ""
1847
 
1848
+ #: src/SiteHealth.php:174
 
1849
  msgid "WP Mail SMTP mailer setup is incomplete"
1850
  msgstr ""
1851
 
1852
+ #: src/SiteHealth.php:180
 
1853
  msgid "The WP Mail SMTP plugin mailer setup is incomplete. Please click on the link below to access plugin settings and configure the mailer."
1854
  msgstr ""
1855
 
1856
+ #: src/SiteHealth.php:185
 
1857
  msgid "Configure mailer"
1858
  msgstr ""
1859
 
1860
+ #: src/SiteHealth.php:202
1861
+ msgid "WP Mail SMTP DB tables are created"
1862
+ msgstr ""
1863
+
1864
+ #: src/SiteHealth.php:208
1865
+ msgid "WP Mail SMTP is using custom database tables for some of its features. In order to work properly, the custom tables should be created, and it looks like they exist in your database."
1866
+ msgstr ""
1867
+
1868
+ #: src/SiteHealth.php:216
1869
+ msgid "WP Mail SMTP DB tables check has failed"
1870
+ msgstr ""
1871
+
1872
+ #. translators: %s - the list of missing tables separated by comma.
1873
+ #: src/SiteHealth.php:222
1874
+ msgid "Missing table: %s"
1875
+ msgid_plural "Missing tables: %s"
1876
+ msgstr[0] ""
1877
+ msgstr[1] ""
1878
+
1879
+ #: src/SiteHealth.php:225
1880
+ msgid "WP Mail SMTP is using custom database tables for some of its features. In order to work properly, the custom tables should be created, and it seems they are missing. Please try to re-install the WP Mail SMTP plugin. If this issue persists, please contact our support."
1881
+ msgstr ""
1882
+
1883
  #. translators: %1$s - date, \a\t - specially escaped "at", %2$s - time.
 
1884
  #: src/WP.php:190
1885
  msgid "%1$s \\a\\t %2$s"
1886
  msgstr ""
1887
 
 
1888
  #: wp_mail_smtp.php:135
1889
  msgid "Please deactivate the free version of the WP Mail SMTP plugin before activating WP Mail SMTP Pro."
1890
  msgstr ""
1891
 
1892
  #. translators: %1$s - WPBeginner URL for recommended WordPress hosting.
 
1893
  #: wp_mail_smtp.php:163
1894
  msgid "Your site is running an <strong>insecure version</strong> of PHP that is no longer supported. Please contact your web hosting provider to update your PHP version or switch to a <a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">recommended WordPress hosting company</a>."
1895
  msgstr ""
1896
 
1897
  #. translators: %s - WPMailSMTP.com docs URL with more details.
 
1898
  #: wp_mail_smtp.php:180
1899
  msgid "<strong>WP Mail SMTP plugin is disabled</strong> on your site until you fix the issue. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Read more for additional information.</a>"
1900
  msgstr ""
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: wpforms, jaredatch, smub, slaFFik
3
  Tags: smtp, wp mail smtp, wordpress smtp, gmail smtp, sendgrid smtp, mailgun smtp, mail, mailer, phpmailer, wp_mail, email, mailgun, sengrid, gmail, pepipost, sendinblue, wp smtp
4
  Requires at least: 4.9
5
  Tested up to: 5.4
6
- Stable tag: 2.1.1
7
  Requires PHP: 5.5.0
8
 
9
  The most popular WordPress SMTP and PHP Mailer plugin. Trusted by over 1 million sites.
@@ -229,6 +229,14 @@ By all means please contact us to discuss features or options you'd like to see
229
 
230
  == Changelog ==
231
 
 
 
 
 
 
 
 
 
232
  = 2.1.1 - 2020-06-08 =
233
  * Changed: Remove current automatic default reply-to address and add WP filter `wp_mail_smtp_processor_set_default_reply_to` for setting default reply-to addresses.
234
  * Changed: Improve description for several options with links to an article about how to properly use constants.
3
  Tags: smtp, wp mail smtp, wordpress smtp, gmail smtp, sendgrid smtp, mailgun smtp, mail, mailer, phpmailer, wp_mail, email, mailgun, sengrid, gmail, pepipost, sendinblue, wp smtp
4
  Requires at least: 4.9
5
  Tested up to: 5.4
6
+ Stable tag: 2.2.1
7
  Requires PHP: 5.5.0
8
 
9
  The most popular WordPress SMTP and PHP Mailer plugin. Trusted by over 1 million sites.
229
 
230
  == Changelog ==
231
 
232
+ = 2.2.1 - 2020-07-09 =
233
+ * Added: Gmail mailer now supports aliases.
234
+ * Added: Support both old PHPMailer v5 (WordPress <=5.4) and PHPMailer v6 (WordPress >=5.5).
235
+ * Changed: Pepipost mailer is now using the native API v5 instead of the SendGrid migration API.
236
+ * Fixed: Incorrect Mailgun Domain Name option was not showing an email delivery error.
237
+ * Fixed: Empty debug errors for the Sendinblue mailer are no more.
238
+ * Fixed: Properly compare From Email option value with a correct default email address from WP core.
239
+
240
  = 2.1.1 - 2020-06-08 =
241
  * Changed: Remove current automatic default reply-to address and add WP filter `wp_mail_smtp_processor_set_default_reply_to` for setting default reply-to addresses.
242
  * Changed: Improve description for several options with links to an article about how to properly use constants.
src/Admin/Area.php CHANGED
@@ -271,7 +271,7 @@ class Area {
271
  * @since 1.5.0 Added new assets for new pages.
272
  * @since 1.7.0 Added jQuery Confirm library css/js files.
273
  *
274
- * @param string $hook
275
  */
276
  public function enqueue_assets( $hook ) {
277
 
@@ -305,9 +305,7 @@ class Area {
305
  'title' => esc_html__( 'Heads up!', 'wp-mail-smtp' ),
306
  'content' => wp_kses(
307
  __( '<p>The Default (PHP) mailer is currently selected, but is not recommended because in most cases it does not resolve email delivery issues.</p><p>Please consider selecting and configuring one of the other mailers.</p>', 'wp-mail-smtp' ),
308
- array(
309
- 'p' => true,
310
- )
311
  ),
312
  'save_button' => esc_html__( 'Save Settings', 'wp-mail-smtp' ),
313
  'cancel_button' => esc_html__( 'Cancel', 'wp-mail-smtp' ),
@@ -322,11 +320,11 @@ class Area {
322
  'upgrade_bonus' => '<p>' .
323
  wp_kses(
324
  __( '<strong>Bonus:</strong> WP Mail SMTP users get <span>$50 off</span> regular price,<br>applied at checkout.', 'wp-mail-smtp' ),
325
- array(
326
- 'strong' => true,
327
- 'span' => true,
328
- 'br' => true,
329
- )
330
  )
331
  . '</p>',
332
  'upgrade_doc' => '<a href="https://wpmailsmtp.com/docs/how-to-upgrade-wp-mail-smtp-to-pro-version/?utm_source=WordPress&amp;utm_medium=link&amp;utm_campaign=liteplugin" target="_blank" rel="noopener noreferrer" class="already-purchased">
@@ -893,7 +891,7 @@ class Area {
893
  return add_query_arg(
894
  'page',
895
  $page,
896
- admin_url( 'admin.php' )
897
  );
898
  }
899
 
271
  * @since 1.5.0 Added new assets for new pages.
272
  * @since 1.7.0 Added jQuery Confirm library css/js files.
273
  *
274
+ * @param string $hook Current hook.
275
  */
276
  public function enqueue_assets( $hook ) {
277
 
305
  'title' => esc_html__( 'Heads up!', 'wp-mail-smtp' ),
306
  'content' => wp_kses(
307
  __( '<p>The Default (PHP) mailer is currently selected, but is not recommended because in most cases it does not resolve email delivery issues.</p><p>Please consider selecting and configuring one of the other mailers.</p>', 'wp-mail-smtp' ),
308
+ [ 'p' => [] ]
 
 
309
  ),
310
  'save_button' => esc_html__( 'Save Settings', 'wp-mail-smtp' ),
311
  'cancel_button' => esc_html__( 'Cancel', 'wp-mail-smtp' ),
320
  'upgrade_bonus' => '<p>' .
321
  wp_kses(
322
  __( '<strong>Bonus:</strong> WP Mail SMTP users get <span>$50 off</span> regular price,<br>applied at checkout.', 'wp-mail-smtp' ),
323
+ [
324
+ 'strong' => [],
325
+ 'span' => [],
326
+ 'br' => [],
327
+ ]
328
  )
329
  . '</p>',
330
  'upgrade_doc' => '<a href="https://wpmailsmtp.com/docs/how-to-upgrade-wp-mail-smtp-to-pro-version/?utm_source=WordPress&amp;utm_medium=link&amp;utm_campaign=liteplugin" target="_blank" rel="noopener noreferrer" class="already-purchased">
891
  return add_query_arg(
892
  'page',
893
  $page,
894
+ WP::admin_url( 'admin.php' )
895
  );
896
  }
897
 
src/Admin/PageAbstract.php CHANGED
@@ -1,87 +1,89 @@
1
- <?php
2
-
3
- namespace WPMailSMTP\Admin;
4
-
5
- /**
6
- * Class PageAbstract.
7
- *
8
- * @since 1.0.0
9
- */
10
- abstract class PageAbstract implements PageInterface {
11
-
12
- /**
13
- * @var string Slug of a tab.
14
- */
15
- protected $slug;
16
-
17
- /**
18
- * @inheritdoc
19
- */
20
- public function get_link() {
21
-
22
- return esc_url(
23
- add_query_arg(
24
- 'tab',
25
- $this->slug,
26
- admin_url( 'admin.php?page=' . Area::SLUG )
27
- )
28
- );
29
- }
30
-
31
- /**
32
- * Process tab form submission ($_POST ).
33
- *
34
- * @since 1.0.0
35
- *
36
- * @param array $data $_POST data specific for the plugin.
37
- */
38
- public function process_post( $data ) {
39
- }
40
-
41
- /**
42
- * Process tab & mailer specific Auth actions.
43
- *
44
- * @since 1.0.0
45
- */
46
- public function process_auth() {
47
- }
48
-
49
- /**
50
- * Print the nonce field for a specific tab.
51
- *
52
- * @since 1.0.0
53
- */
54
- public function wp_nonce_field() {
55
-
56
- wp_nonce_field( Area::SLUG . '-' . $this->slug );
57
- }
58
-
59
- /**
60
- * Make sure that a user was referred from plugin admin page.
61
- * To avoid security problems.
62
- *
63
- * @since 1.0.0
64
- */
65
- public function check_admin_referer() {
66
-
67
- check_admin_referer( Area::SLUG . '-' . $this->slug );
68
- }
69
-
70
- /**
71
- * Save button to be reused on other tabs.
72
- *
73
- * @since 1.5.0
74
- */
75
- public function display_save_btn() {
76
-
77
- ?>
78
-
79
- <p class="wp-mail-smtp-submit">
80
- <button type="submit" class="wp-mail-smtp-btn wp-mail-smtp-btn-md wp-mail-smtp-btn-orange">
81
- <?php esc_html_e( 'Save Settings', 'wp-mail-smtp' ); ?>
82
- </button>
83
- </p>
84
-
85
- <?php
86
- }
87
- }
 
 
1
+ <?php
2
+
3
+ namespace WPMailSMTP\Admin;
4
+
5
+ use WPMailSMTP\WP;
6
+
7
+ /**
8
+ * Class PageAbstract.
9
+ *
10
+ * @since 1.0.0
11
+ */
12
+ abstract class PageAbstract implements PageInterface {
13
+
14
+ /**
15
+ * @var string Slug of a tab.
16
+ */
17
+ protected $slug;
18
+
19
+ /**
20
+ * @inheritdoc
21
+ */
22
+ public function get_link() {
23
+
24
+ return esc_url(
25
+ add_query_arg(
26
+ 'tab',
27
+ $this->slug,
28
+ WP::admin_url( 'admin.php?page=' . Area::SLUG )
29
+ )
30
+ );
31
+ }
32
+
33
+ /**
34
+ * Process tab form submission ($_POST ).
35
+ *
36
+ * @since 1.0.0
37
+ *
38
+ * @param array $data $_POST data specific for the plugin.
39
+ */
40
+ public function process_post( $data ) {
41
+ }
42
+
43
+ /**
44
+ * Process tab & mailer specific Auth actions.
45
+ *
46
+ * @since 1.0.0
47
+ */
48
+ public function process_auth() {
49
+ }
50
+
51
+ /**
52
+ * Print the nonce field for a specific tab.
53
+ *
54
+ * @since 1.0.0
55
+ */
56
+ public function wp_nonce_field() {
57
+
58
+ wp_nonce_field( Area::SLUG . '-' . $this->slug );
59
+ }
60
+
61
+ /**
62
+ * Make sure that a user was referred from plugin admin page.
63
+ * To avoid security problems.
64
+ *
65
+ * @since 1.0.0
66
+ */
67
+ public function check_admin_referer() {
68
+
69
+ check_admin_referer( Area::SLUG . '-' . $this->slug );
70
+ }
71
+
72
+ /**
73
+ * Save button to be reused on other tabs.
74
+ *
75
+ * @since 1.5.0
76
+ */
77
+ public function display_save_btn() {
78
+
79
+ ?>
80
+
81
+ <p class="wp-mail-smtp-submit">
82
+ <button type="submit" class="wp-mail-smtp-btn wp-mail-smtp-btn-md wp-mail-smtp-btn-orange">
83
+ <?php esc_html_e( 'Save Settings', 'wp-mail-smtp' ); ?>
84
+ </button>
85
+ </p>
86
+
87
+ <?php
88
+ }
89
+ }
src/Admin/Pages/About.php CHANGED
@@ -6,6 +6,7 @@ use WPMailSMTP\Admin\Area;
6
  use WPMailSMTP\Admin\PageAbstract;
7
  use WPMailSMTP\Admin\PluginsInstallSkin;
8
  use WPMailSMTP\Admin\PluginsInstallUpgrader;
 
9
 
10
  /**
11
  * Class About to display a page with About Us and Versus content.
@@ -42,7 +43,7 @@ class About extends PageAbstract {
42
  return add_query_arg(
43
  'tab',
44
  $this->get_defined_tab( $tab ),
45
- admin_url( 'admin.php?page=' . Area::SLUG . '-' . $this->slug )
46
  );
47
  }
48
 
@@ -214,6 +215,24 @@ class About extends PageAbstract {
214
 
215
  </div>
216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
  <div class="wp-mail-smtp-admin-about-plugins">
218
  <div class="plugins-container">
219
  <?php
@@ -229,11 +248,16 @@ class About extends PageAbstract {
229
  $data = array_merge( $data, $this->get_about_plugins_data( $plugin, true ) );
230
  }
231
 
 
 
 
 
 
232
  ?>
233
  <div class="plugin-container">
234
  <div class="plugin-item">
235
  <div class="details wp-mail-smtp-clear">
236
- <img src="<?php echo \esc_url( $plugin['icon'] ); ?>">
237
  <h5 class="plugin-name">
238
  <?php echo $plugin['name']; ?>
239
  </h5>
@@ -430,7 +454,7 @@ class About extends PageAbstract {
430
  $error = \esc_html__( 'Could not install the plugin.', 'wp-mail-smtp' );
431
 
432
  // Check for permissions.
433
- if ( ! \current_user_can( 'activate_plugins' ) ) {
434
  \wp_send_json_error( $error );
435
  }
436
 
6
  use WPMailSMTP\Admin\PageAbstract;
7
  use WPMailSMTP\Admin\PluginsInstallSkin;
8
  use WPMailSMTP\Admin\PluginsInstallUpgrader;
9
+ use WPMailSMTP\WP;
10
 
11
  /**
12
  * Class About to display a page with About Us and Versus content.
43
  return add_query_arg(
44
  'tab',
45
  $this->get_defined_tab( $tab ),
46
+ WP::admin_url( 'admin.php?page=' . Area::SLUG . '-' . $this->slug )
47
  );
48
  }
49
 
215
 
216
  </div>
217
 
218
+ <?php
219
+
220
+ // Do not display the plugin section if the user can't install or activate them.
221
+ if ( ! current_user_can( 'install_plugins' ) && ! current_user_can( 'activate_plugins' ) ) {
222
+ return;
223
+ }
224
+
225
+ $this->display_plugins();
226
+ }
227
+
228
+ /**
229
+ * Display the plugins section.
230
+ *
231
+ * @since 2.2.0
232
+ */
233
+ protected function display_plugins() {
234
+ ?>
235
+
236
  <div class="wp-mail-smtp-admin-about-plugins">
237
  <div class="plugins-container">
238
  <?php
248
  $data = array_merge( $data, $this->get_about_plugins_data( $plugin, true ) );
249
  }
250
 
251
+ // Do not display a plugin which has to be installed and the user can't install it.
252
+ if ( ! current_user_can( 'install_plugins' ) && $data['status_class'] === 'status-download' ) {
253
+ continue;
254
+ }
255
+
256
  ?>
257
  <div class="plugin-container">
258
  <div class="plugin-item">
259
  <div class="details wp-mail-smtp-clear">
260
+ <img src="<?php echo \esc_url( $plugin['icon'] ); ?>" alt="<?php esc_attr_e( 'Plugin icon', 'wp-mail-smtp' ); ?>">
261
  <h5 class="plugin-name">
262
  <?php echo $plugin['name']; ?>
263
  </h5>
454
  $error = \esc_html__( 'Could not install the plugin.', 'wp-mail-smtp' );
455
 
456
  // Check for permissions.
457
+ if ( ! \current_user_can( 'install_plugins' ) ) {
458
  \wp_send_json_error( $error );
459
  }
460
 
src/Admin/Pages/Logs.php CHANGED
@@ -4,11 +4,10 @@ namespace WPMailSMTP\Admin\Pages;
4
 
5
  use WPMailSMTP\Admin\Area;
6
  use WPMailSMTP\Admin\PageAbstract;
 
7
 
8
  /**
9
  * Class Logs
10
- *
11
- * @since 1.5.0
12
  */
13
  class Logs extends PageAbstract {
14
 
@@ -34,7 +33,7 @@ class Logs extends PageAbstract {
34
  return add_query_arg(
35
  'tab',
36
  $this->slug,
37
- admin_url( 'admin.php?page=' . Area::SLUG )
38
  );
39
  }
40
 
4
 
5
  use WPMailSMTP\Admin\Area;
6
  use WPMailSMTP\Admin\PageAbstract;
7
+ use WPMailSMTP\WP;
8
 
9
  /**
10
  * Class Logs
 
 
11
  */
12
  class Logs extends PageAbstract {
13
 
33
  return add_query_arg(
34
  'tab',
35
  $this->slug,
36
+ WP::admin_url( 'admin.php?page=' . Area::SLUG )
37
  );
38
  }
39
 
src/Admin/Pages/MiscTab.php CHANGED
@@ -198,7 +198,12 @@ class MiscTab extends PageAbstract {
198
  }
199
 
200
  /**
201
- * @inheritdoc
 
 
 
 
 
202
  */
203
  public function process_post( $data ) {
204
 
@@ -207,14 +212,20 @@ class MiscTab extends PageAbstract {
207
  $options = new Options();
208
 
209
  // Unchecked checkboxes doesn't exist in $_POST, so we need to ensure we actually have them in data to save.
 
 
 
210
  if ( empty( $data['general']['am_notifications_hidden'] ) ) {
211
  $data['general']['am_notifications_hidden'] = false;
212
  }
 
 
 
213
  if ( empty( $data['general']['uninstall'] ) ) {
214
  $data['general']['uninstall'] = false;
215
  }
216
 
217
- $to_save = array_merge( $options->get_all(), $data );
218
 
219
  // All the sanitization is done there.
220
  $options->set( $to_save );
198
  }
199
 
200
  /**
201
+ * Process tab form submission ($_POST).
202
+ *
203
+ * @since 1.0.0
204
+ * @since 2.2.0 Fixed checkbox saving and use the correct merge to prevent breaking other 'general' checkboxes.
205
+ *
206
+ * @param array $data Tab data specific for the plugin ($_POST).
207
  */
208
  public function process_post( $data ) {
209
 
212
  $options = new Options();
213
 
214
  // Unchecked checkboxes doesn't exist in $_POST, so we need to ensure we actually have them in data to save.
215
+ if ( empty( $data['general']['do_not_send'] ) ) {
216
+ $data['general']['do_not_send'] = false;
217
+ }
218
  if ( empty( $data['general']['am_notifications_hidden'] ) ) {
219
  $data['general']['am_notifications_hidden'] = false;
220
  }
221
+ if ( empty( $data['general']['email_delivery_errors_hidden'] ) ) {
222
+ $data['general']['email_delivery_errors_hidden'] = false;
223
+ }
224
  if ( empty( $data['general']['uninstall'] ) ) {
225
  $data['general']['uninstall'] = false;
226
  }
227
 
228
+ $to_save = Options::array_merge_recursive( $options->get_all(), $data );
229
 
230
  // All the sanitization is done there.
231
  $options->set( $to_save );
src/Admin/Pages/SettingsTab.php CHANGED
@@ -5,6 +5,7 @@ namespace WPMailSMTP\Admin\Pages;
5
  use WPMailSMTP\Admin\PageAbstract;
6
  use WPMailSMTP\Debug;
7
  use WPMailSMTP\Options;
 
8
  use WPMailSMTP\WP;
9
 
10
  /**
@@ -58,6 +59,8 @@ class SettingsTab extends PageAbstract {
58
  <form method="POST" action="" autocomplete="off">
59
  <?php $this->wp_nonce_field(); ?>
60
 
 
 
61
  <!-- License Section Title -->
62
  <div class="wp-mail-smtp-setting-row wp-mail-smtp-setting-row-content wp-mail-smtp-clear section-heading" id="wp-mail-smtp-setting-row-license-heading">
63
  <div class="wp-mail-smtp-setting-field">
@@ -92,16 +95,37 @@ class SettingsTab extends PageAbstract {
92
  <label for="wp-mail-smtp-setting-from_email"><?php esc_html_e( 'From Email', 'wp-mail-smtp' ); ?></label>
93
  </div>
94
  <div class="wp-mail-smtp-setting-field">
95
- <input name="wp-mail-smtp[mail][from_email]" type="email"
96
- value="<?php echo esc_attr( $options->get( 'mail', 'from_email' ) ); ?>"
97
- <?php echo $options->is_const_defined( 'mail', 'from_email' ) || ! empty( $disabled_email ) ? 'disabled' : ''; ?>
98
- id="wp-mail-smtp-setting-from_email" spellcheck="false"
99
- placeholder="<?php echo esc_attr( wp_mail_smtp()->get_processor()->get_default_email() ); ?>">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
 
101
  <?php if ( empty( $disabled_email ) ) : ?>
102
  <p class="desc">
103
  <?php esc_html_e( 'The email address which emails are sent from.', 'wp-mail-smtp' ); ?><br/>
104
- <?php esc_html_e( 'If you using an email provider (Gmail, Yahoo, Outlook.com, etc) this should be your email address for that account.', 'wp-mail-smtp' ); ?>
105
  </p>
106
  <p class="desc">
107
  <?php esc_html_e( 'Please note that other plugins can change this, to prevent this use the setting below.', 'wp-mail-smtp' ); ?>
@@ -110,10 +134,16 @@ class SettingsTab extends PageAbstract {
110
 
111
  <hr class="wp-mail-smtp-setting-mid-row-sep">
112
 
113
- <input name="wp-mail-smtp[mail][from_email_force]" type="checkbox"
114
- value="true" <?php checked( true, (bool) $options->get( 'mail', 'from_email_force' ) ); ?>
115
- <?php echo $options->is_const_defined( 'mail', 'from_email_force' ) || ! empty( $disabled_email ) ? 'disabled' : ''; ?>
116
- id="wp-mail-smtp-setting-from_email_force">
 
 
 
 
 
 
117
 
118
  <label for="wp-mail-smtp-setting-from_email_force">
119
  <?php esc_html_e( 'Force From Email', 'wp-mail-smtp' ); ?>
@@ -121,7 +151,13 @@ class SettingsTab extends PageAbstract {
121
 
122
  <?php if ( ! empty( $disabled_email ) ) : ?>
123
  <p class="desc">
124
- <?php esc_html_e( 'Current provider will automatically force From Email to be the email address that you use to set up the connection below.', 'wp-mail-smtp' ); ?>
 
 
 
 
 
 
125
  </p>
126
  <?php else : ?>
127
  <p class="desc">
@@ -292,6 +328,11 @@ class SettingsTab extends PageAbstract {
292
 
293
  </div>
294
 
 
 
 
 
 
295
  <?php $this->display_save_btn(); ?>
296
 
297
  </form>
@@ -525,6 +566,8 @@ class SettingsTab extends PageAbstract {
525
  }
526
  }
527
 
 
 
528
  // New gmail clients data will be added from new $data.
529
  $to_save = Options::array_merge_recursive( $old_opt, $data );
530
 
5
  use WPMailSMTP\Admin\PageAbstract;
6
  use WPMailSMTP\Debug;
7
  use WPMailSMTP\Options;
8
+ use WPMailSMTP\Providers\Gmail\Auth;
9
  use WPMailSMTP\WP;
10
 
11
  /**
59
  <form method="POST" action="" autocomplete="off">
60
  <?php $this->wp_nonce_field(); ?>
61
 
62
+ <?php ob_start(); ?>
63
+
64
  <!-- License Section Title -->
65
  <div class="wp-mail-smtp-setting-row wp-mail-smtp-setting-row-content wp-mail-smtp-clear section-heading" id="wp-mail-smtp-setting-row-license-heading">
66
  <div class="wp-mail-smtp-setting-field">
95
  <label for="wp-mail-smtp-setting-from_email"><?php esc_html_e( 'From Email', 'wp-mail-smtp' ); ?></label>
96
  </div>
97
  <div class="wp-mail-smtp-setting-field">
98
+ <?php if ( 'gmail' !== $mailer ) : ?>
99
+ <input name="wp-mail-smtp[mail][from_email]" type="email"
100
+ value="<?php echo esc_attr( $options->get( 'mail', 'from_email' ) ); ?>"
101
+ <?php echo $options->is_const_defined( 'mail', 'from_email' ) || ! empty( $disabled_email ) ? 'disabled' : ''; ?>
102
+ id="wp-mail-smtp-setting-from_email" spellcheck="false"
103
+ placeholder="<?php echo esc_attr( wp_mail_smtp()->get_processor()->get_default_email() ); ?>">
104
+ <?php else : ?>
105
+ <?php
106
+ // Gmail mailer From Email selector.
107
+ $gmail_auth = new Auth();
108
+ $gmail_aliases = $gmail_auth->is_clients_saved() ? $gmail_auth->get_user_possible_send_from_addresses() : [];
109
+ ?>
110
+
111
+ <?php if ( empty( $gmail_aliases ) ) : ?>
112
+ <select name="wp-mail-smtp[mail][from_email]" id="wp-mail-smtp-setting-from_email" disabled>
113
+ <option value=""><?php esc_html_e( 'Please first authorize the Gmail mailer below', 'wp-mail-smtp' ); ?></option>
114
+ </select>
115
+ <?php else : ?>
116
+ <select name="wp-mail-smtp[mail][from_email]" id="wp-mail-smtp-setting-from_email">
117
+ <?php foreach ( $gmail_aliases as $gmail_email_address ) : ?>
118
+ <option value="<?php echo esc_attr( $gmail_email_address ); ?>" <?php selected( $options->get( 'mail', 'from_email' ), $gmail_email_address ); ?>><?php echo esc_html( $gmail_email_address ); ?></option>
119
+ <?php endforeach; ?>
120
+ </select>
121
+ <?php endif; ?>
122
+
123
+ <?php endif; ?>
124
 
125
  <?php if ( empty( $disabled_email ) ) : ?>
126
  <p class="desc">
127
  <?php esc_html_e( 'The email address which emails are sent from.', 'wp-mail-smtp' ); ?><br/>
128
+ <?php esc_html_e( 'If you\'re using an email provider (Yahoo, Outlook.com, etc) this should be your email address for that account.', 'wp-mail-smtp' ); ?>
129
  </p>
130
  <p class="desc">
131
  <?php esc_html_e( 'Please note that other plugins can change this, to prevent this use the setting below.', 'wp-mail-smtp' ); ?>
134
 
135
  <hr class="wp-mail-smtp-setting-mid-row-sep">
136
 
137
+ <?php if ( 'gmail' !== $mailer ) : ?>
138
+ <input name="wp-mail-smtp[mail][from_email_force]" type="checkbox"
139
+ value="true" <?php checked( true, (bool) $options->get( 'mail', 'from_email_force' ) ); ?>
140
+ <?php echo $options->is_const_defined( 'mail', 'from_email_force' ) || ! empty( $disabled_email ) ? 'disabled' : ''; ?>
141
+ id="wp-mail-smtp-setting-from_email_force">
142
+ <?php else : ?>
143
+ <input name="wp-mail-smtp[mail][from_email_force]" type="checkbox"
144
+ value="true" checked="checked" disabled
145
+ id="wp-mail-smtp-setting-from_email_force">
146
+ <?php endif; ?>
147
 
148
  <label for="wp-mail-smtp-setting-from_email_force">
149
  <?php esc_html_e( 'Force From Email', 'wp-mail-smtp' ); ?>
151
 
152
  <?php if ( ! empty( $disabled_email ) ) : ?>
153
  <p class="desc">
154
+ <?php
155
+ if ( 'gmail' !== $mailer ) :
156
+ esc_html_e( 'Current provider will automatically force From Email to be the email address that you use to set up the connection below.', 'wp-mail-smtp' );
157
+ else :
158
+ esc_html_e( 'Gmail mailer will automatically force From Email to be the email address that you selected above.', 'wp-mail-smtp' );
159
+ endif;
160
+ ?>
161
  </p>
162
  <?php else : ?>
163
  <p class="desc">
328
 
329
  </div>
330
 
331
+ <?php
332
+ $settings_content = apply_filters( 'wp_mail_smtp_admin_settings_tab_display', ob_get_clean() );
333
+ echo $settings_content; // phpcs:ignore
334
+ ?>
335
+
336
  <?php $this->display_save_btn(); ?>
337
 
338
  </form>
566
  }
567
  }
568
 
569
+ $data = apply_filters( 'wp_mail_smtp_settings_tab_process_post', $data );
570
+
571
  // New gmail clients data will be added from new $data.
572
  $to_save = Options::array_merge_recursive( $old_opt, $data );
573
 
src/Admin/Pages/TestTab.php CHANGED
@@ -4,7 +4,7 @@ namespace WPMailSMTP\Admin\Pages;
4
 
5
  use WPMailSMTP\Conflicts;
6
  use WPMailSMTP\Debug;
7
- use WPMailSMTP\MailCatcher;
8
  use WPMailSMTP\Options;
9
  use WPMailSMTP\WP;
10
  use WPMailSMTP\Admin\PageAbstract;
@@ -393,8 +393,8 @@ Lead Developer, WP Mail SMTP';
393
  *
394
  * @since 1.0.0
395
  *
396
- * @param MailCatcher $phpmailer
397
- * @param string $smtp_debug
398
  *
399
  * @return string
400
  */
4
 
5
  use WPMailSMTP\Conflicts;
6
  use WPMailSMTP\Debug;
7
+ use WPMailSMTP\MailCatcherInterface;
8
  use WPMailSMTP\Options;
9
  use WPMailSMTP\WP;
10
  use WPMailSMTP\Admin\PageAbstract;
393
  *
394
  * @since 1.0.0
395
  *
396
+ * @param MailCatcherInterface $phpmailer The MailCatcher object.
397
+ * @param string $smtp_debug The SMTP debug message.
398
  *
399
  * @return string
400
  */
src/Core.php CHANGED
@@ -59,6 +59,10 @@ class Core {
59
  if ( $this->is_not_loadable() ) {
60
  add_action( 'admin_notices', 'wp_mail_smtp_insecure_php_version_notice' );
61
 
 
 
 
 
62
  return;
63
  }
64
 
@@ -95,8 +99,13 @@ class Core {
95
  */
96
  public function hooks() {
97
 
 
 
 
 
 
98
  // Action Scheduler requires a special early loading procedure.
99
- add_action( 'plugins_loaded', array( $this, 'load_action_scheduler' ), -10 );
100
 
101
  // Activation hook.
102
  register_activation_hook( WPMS_PLUGIN_FILE, array( $this, 'activate' ) );
@@ -148,6 +157,11 @@ class Core {
148
  if ( current_user_can( 'manage_options' ) ) {
149
  add_action( 'admin_notices', array( '\WPMailSMTP\WP', 'display_admin_notices' ) );
150
  add_action( 'admin_notices', array( $this, 'display_general_notices' ) );
 
 
 
 
 
151
  }
152
  }
153
 
@@ -455,7 +469,6 @@ class Core {
455
  }
456
 
457
  if ( wp_mail_smtp()->get_admin()->is_error_delivery_notice_enabled() ) {
458
-
459
  $notice = Debug::get_last();
460
 
461
  if ( ! empty( $notice ) ) {
@@ -556,7 +569,7 @@ class Core {
556
  *
557
  * @since 1.0.0
558
  *
559
- * @return \WPMailSMTP\MailCatcher
560
  */
561
  public function replace_phpmailer() {
562
 
@@ -573,11 +586,11 @@ class Core {
573
  *
574
  * @param null $obj PhpMailer object to override with own implementation.
575
  *
576
- * @return \WPMailSMTP\MailCatcher
577
  */
578
  protected function replace_w_fake_phpmailer( &$obj = null ) {
579
 
580
- $obj = new MailCatcher( true );
581
 
582
  return $obj;
583
  }
@@ -725,7 +738,7 @@ class Core {
725
  /**
726
  * Require the action scheduler in an early plugins_loaded hook (-10).
727
  *
728
- * @see https://actionscheduler.org/usage/#load-order
729
  *
730
  * @since 2.1.0
731
  */
@@ -733,4 +746,99 @@ class Core {
733
 
734
  require_once $this->plugin_path . '/vendor/woocommerce/action-scheduler/action-scheduler.php';
735
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
736
  }
59
  if ( $this->is_not_loadable() ) {
60
  add_action( 'admin_notices', 'wp_mail_smtp_insecure_php_version_notice' );
61
 
62
+ if ( WP::use_global_plugin_settings() ) {
63
+ add_action( 'network_admin_notices', 'wp_mail_smtp_insecure_php_version_notice' );
64
+ }
65
+
66
  return;
67
  }
68
 
99
  */
100
  public function hooks() {
101
 
102
+ // Force from_email_force to always return true if current mailer is Gmail.
103
+ if ( ( new Options() )->get( 'mail', 'mailer' ) === 'gmail' ) {
104
+ add_filter( 'wp_mail_smtp_options_get', [ $this, 'gmail_mailer_get_from_email_force' ], 1, 3 );
105
+ }
106
+
107
  // Action Scheduler requires a special early loading procedure.
108
+ add_action( 'plugins_loaded', array( $this, 'load_action_scheduler' ), - 10 );
109
 
110
  // Activation hook.
111
  register_activation_hook( WPMS_PLUGIN_FILE, array( $this, 'activate' ) );
157
  if ( current_user_can( 'manage_options' ) ) {
158
  add_action( 'admin_notices', array( '\WPMailSMTP\WP', 'display_admin_notices' ) );
159
  add_action( 'admin_notices', array( $this, 'display_general_notices' ) );
160
+
161
+ if ( WP::use_global_plugin_settings() ) {
162
+ add_action( 'network_admin_notices', array( '\WPMailSMTP\WP', 'display_admin_notices' ) );
163
+ add_action( 'network_admin_notices', array( $this, 'display_general_notices' ) );
164
+ }
165
  }
166
  }
167
 
469
  }
470
 
471
  if ( wp_mail_smtp()->get_admin()->is_error_delivery_notice_enabled() ) {
 
472
  $notice = Debug::get_last();
473
 
474
  if ( ! empty( $notice ) ) {
569
  *
570
  * @since 1.0.0
571
  *
572
+ * @return MailCatcherInterface
573
  */
574
  public function replace_phpmailer() {
575
 
586
  *
587
  * @param null $obj PhpMailer object to override with own implementation.
588
  *
589
+ * @return MailCatcherInterface
590
  */
591
  protected function replace_w_fake_phpmailer( &$obj = null ) {
592
 
593
+ $obj = $this->generate_mail_catcher( true );
594
 
595
  return $obj;
596
  }
738
  /**
739
  * Require the action scheduler in an early plugins_loaded hook (-10).
740
  *
741
+ * @see https://actionscheduler.org/usage/#load-order
742
  *
743
  * @since 2.1.0
744
  */
746
 
747
  require_once $this->plugin_path . '/vendor/woocommerce/action-scheduler/action-scheduler.php';
748
  }
749
+
750
+ /**
751
+ * Get the list of all custom DB tables that should be present in the DB.
752
+ *
753
+ * @since 2.1.2
754
+ *
755
+ * @return array List of table names.
756
+ */
757
+ public function get_custom_db_tables() {
758
+
759
+ $tables = [
760
+ \WPMailSMTP\Tasks\Meta::get_table_name(),
761
+ ];
762
+
763
+ return apply_filters( 'wp_mail_smtp_core_get_custom_db_tables', $tables );
764
+ }
765
+
766
+ /**
767
+ * Generate the correct MailCatcher object based on the PHPMailer version used in WP.
768
+ *
769
+ * Also conditionally require the needed class files.
770
+ *
771
+ * @see https://make.wordpress.org/core/2020/07/01/external-library-updates-in-wordpress-5-5-call-for-testing/
772
+ *
773
+ * @since 2.2.0
774
+ *
775
+ * @param bool $exceptions True if external exceptions should be thrown.
776
+ *
777
+ * @return MailCatcherInterface
778
+ */
779
+ public function generate_mail_catcher( $exceptions = null ) {
780
+
781
+ if ( version_compare( get_bloginfo( 'version' ), '5.5-alpha', '<' ) ) {
782
+ if ( ! class_exists( '\PHPMailer', false ) ) {
783
+ require_once ABSPATH . WPINC . '/class-phpmailer.php';
784
+ }
785
+
786
+ $mail_catcher = new MailCatcher( $exceptions );
787
+ } else {
788
+ if ( ! class_exists( '\PHPMailer\PHPMailer\PHPMailer', false ) ) {
789
+ require_once ABSPATH . WPINC . '/PHPMailer/PHPMailer.php';
790
+ }
791
+
792
+ if ( ! class_exists( '\PHPMailer\PHPMailer\Exception', false ) ) {
793
+ require_once ABSPATH . WPINC . '/PHPMailer/Exception.php';
794
+ }
795
+
796
+ if ( ! class_exists( '\PHPMailer\PHPMailer\SMTP', false ) ) {
797
+ require_once ABSPATH . WPINC . '/PHPMailer/SMTP.php';
798
+ }
799
+
800
+ $mail_catcher = new MailCatcherV6( $exceptions );
801
+ }
802
+
803
+ return $mail_catcher;
804
+ }
805
+
806
+ /**
807
+ * Check if the passed object is a valid PHPMailer object.
808
+ *
809
+ * @since 2.2.0
810
+ *
811
+ * @param object $phpmailer A potential PHPMailer object to be tested.
812
+ *
813
+ * @return bool
814
+ */
815
+ public function is_valid_phpmailer( $phpmailer ) {
816
+
817
+ return $phpmailer instanceof MailCatcherInterface ||
818
+ $phpmailer instanceof \PHPMailer ||
819
+ $phpmailer instanceof \PHPMailer\PHPMailer\PHPMailer;
820
+ }
821
+
822
+ /**
823
+ * Force the `mail.from_email_force` plugin option to always return true if the current saved mailer is Gmail.
824
+ * Alters the plugin options retrieving via the Options::get method.
825
+ *
826
+ * The gmail mailer check is performed when this filter is added.
827
+ *
828
+ * @since 2.2.0
829
+ *
830
+ * @param mixed $value The value of the plugin option that is being retrieved via Options::get method.
831
+ * @param string $group The group of the plugin option that is being retrieved via Options::get method.
832
+ * @param string $key The key of the plugin option that is being retrieved via Options::get method.
833
+ *
834
+ * @return mixed
835
+ */
836
+ public function gmail_mailer_get_from_email_force( $value, $group, $key ) {
837
+
838
+ if ( $group === 'mail' && $key === 'from_email_force' ) {
839
+ $value = true;
840
+ }
841
+
842
+ return $value;
843
+ }
844
  }
src/MailCatcher.php CHANGED
@@ -13,7 +13,7 @@ if ( ! class_exists( 'PHPMailer', false ) ) {
13
  *
14
  * @since 1.0.0
15
  */
16
- class MailCatcher extends \PHPMailer {
17
 
18
  /**
19
  * Callback Action function name.
@@ -77,6 +77,9 @@ class MailCatcher extends \PHPMailer {
77
  $mail_mailer === 'pepipost'
78
  ) {
79
  try {
 
 
 
80
  // Prepare all the headers.
81
  if ( ! $this->preSend() ) {
82
  return false;
@@ -151,4 +154,16 @@ class MailCatcher extends \PHPMailer {
151
 
152
  return $this->CustomHeader;
153
  }
 
 
 
 
 
 
 
 
 
 
 
 
154
  }
13
  *
14
  * @since 1.0.0
15
  */
16
+ class MailCatcher extends \PHPMailer implements MailCatcherInterface {
17
 
18
  /**
19
  * Callback Action function name.
77
  $mail_mailer === 'pepipost'
78
  ) {
79
  try {
80
+ // Allow to hook early to catch any early failed emails.
81
+ do_action( 'wp_mail_smtp_mailcatcher_smtp_pre_send_before', $this );
82
+
83
  // Prepare all the headers.
84
  if ( ! $this->preSend() ) {
85
  return false;
154
 
155
  return $this->CustomHeader;
156
  }
157
+
158
+ /**
159
+ * Get the PHPMailer line ending.
160
+ *
161
+ * @since 2.2.0
162
+ *
163
+ * @return string
164
+ */
165
+ public function get_line_ending() {
166
+
167
+ return $this->LE; // phpcs:ignore
168
+ }
169
  }
src/MailCatcherInterface.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPMailSMTP;
4
+
5
+ /**
6
+ * Interface MailCatcherInterface.
7
+ *
8
+ * @since 2.2.0
9
+ */
10
+ interface MailCatcherInterface {
11
+
12
+ /**
13
+ * Modify the default send() behaviour.
14
+ * For those mailers, that relies on PHPMailer class - call it directly.
15
+ * For others - init the correct provider and process it.
16
+ *
17
+ * @since 2.2.0
18
+ *
19
+ * @throws \phpmailerException|\PHPMailer\PHPMailer\Exception When sending via PhpMailer fails for some reason.
20
+ *
21
+ * @return bool
22
+ */
23
+ public function send();
24
+
25
+ /**
26
+ * Get the PHPMailer line ending.
27
+ *
28
+ * @since 2.2.0
29
+ *
30
+ * @return string
31
+ */
32
+ public function get_line_ending();
33
+ }
src/MailCatcherV6.php ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPMailSMTP;
4
+
5
+ /**
6
+ * Class MailCatcher replaces the \PHPMailer\PHPMailer\PHPMailer introduced in WP 5.5 and
7
+ * modifies the email sending logic. Thus, we can use other mailers API to do what we need, or stop emails completely.
8
+ *
9
+ * @since 2.2.0
10
+ */
11
+ class MailCatcherV6 extends \PHPMailer\PHPMailer\PHPMailer implements MailCatcherInterface {
12
+
13
+ /**
14
+ * Callback Action function name.
15
+ *
16
+ * The function that handles the result of the send email action.
17
+ * It is called out by send() for each email sent.
18
+ *
19
+ * @since 2.2.0
20
+ *
21
+ * @var string
22
+ */
23
+ public $action_function = '\WPMailSMTP\Processor::send_callback';
24
+
25
+ /**
26
+ * Modify the default send() behaviour.
27
+ * For those mailers, that relies on PHPMailer class - call it directly.
28
+ * For others - init the correct provider and process it.
29
+ *
30
+ * @since 2.2.0
31
+ *
32
+ * @throws \PHPMailer\PHPMailer\Exception When sending via PhpMailer fails for some reason.
33
+ *
34
+ * @return bool
35
+ */
36
+ public function send() { // phpcs:ignore
37
+
38
+ $options = new Options();
39
+ $mail_mailer = sanitize_key( $options->get( 'mail', 'mailer' ) );
40
+
41
+ $is_emailing_blocked = false;
42
+
43
+ if ( wp_mail_smtp()->is_blocked() ) {
44
+ $is_emailing_blocked = true;
45
+ }
46
+
47
+ // Always allow a test email - check for the specific header.
48
+ foreach ( (array) $this->getCustomHeaders() as $header ) {
49
+ if (
50
+ ! empty( $header[0] ) &&
51
+ ! empty( $header[1] ) &&
52
+ $header[0] === 'X-Mailer-Type' &&
53
+ trim( $header[1] ) === 'WPMailSMTP/Admin/Test'
54
+ ) {
55
+ $is_emailing_blocked = false;
56
+ }
57
+ };
58
+
59
+ // Do not send emails if admin desired that.
60
+ if ( $is_emailing_blocked ) {
61
+ return false;
62
+ }
63
+
64
+ // Define a custom header, that will be used to identify the plugin and the mailer.
65
+ $this->XMailer = 'WPMailSMTP/Mailer/' . $mail_mailer . ' ' . WPMS_PLUGIN_VER; // phpcs:ignore
66
+
67
+ // Use the default PHPMailer, as we inject our settings there for certain providers.
68
+ if (
69
+ $mail_mailer === 'mail' ||
70
+ $mail_mailer === 'smtp' ||
71
+ $mail_mailer === 'pepipost'
72
+ ) {
73
+ try {
74
+ // Allow to hook early to catch any early failed emails.
75
+ do_action( 'wp_mail_smtp_mailcatcher_smtp_pre_send_before', $this );
76
+
77
+ // Prepare all the headers.
78
+ if ( ! $this->preSend() ) {
79
+ return false;
80
+ }
81
+
82
+ // Allow to hook after all the preparation before the actual sending.
83
+ do_action( 'wp_mail_smtp_mailcatcher_smtp_send_before', $this );
84
+
85
+ return $this->postSend();
86
+ } catch ( \PHPMailer\PHPMailer\Exception $e ) {
87
+ $this->mailHeader = ''; // phpcs:ignore
88
+ $this->setError( $e->getMessage() );
89
+
90
+ // Set the debug error, but not for default PHP mailer.
91
+ if ( $mail_mailer !== 'mail' ) {
92
+ Debug::set(
93
+ 'Mailer: ' . esc_html( wp_mail_smtp()->get_providers()->get_options( $mail_mailer )->get_title() ) . PHP_EOL .
94
+ $e->getMessage()
95
+ );
96
+ }
97
+
98
+ if ( $this->exceptions ) {
99
+ throw $e;
100
+ }
101
+
102
+ return false;
103
+ }
104
+ }
105
+
106
+ // We need this so that the PHPMailer class will correctly prepare all the headers.
107
+ $this->Mailer = 'mail'; // phpcs:ignore
108
+
109
+ // Prepare everything (including the message) for sending.
110
+ if ( ! $this->preSend() ) {
111
+ return false;
112
+ }
113
+
114
+ $mailer = wp_mail_smtp()->get_providers()->get_mailer( $mail_mailer, $this );
115
+
116
+ if ( ! $mailer ) {
117
+ return false;
118
+ }
119
+
120
+ if ( ! $mailer->is_php_compatible() ) {
121
+ return false;
122
+ }
123
+
124
+ /*
125
+ * Send the actual email.
126
+ * We reuse everything, that was preprocessed for usage in PHPMailer.
127
+ */
128
+ $mailer->send();
129
+
130
+ $is_sent = $mailer->is_email_sent();
131
+
132
+ // Allow to perform any actions with the data.
133
+ do_action( 'wp_mail_smtp_mailcatcher_send_after', $mailer, $this );
134
+
135
+ return $is_sent;
136
+ }
137
+
138
+ /**
139
+ * Get the PHPMailer line ending.
140
+ *
141
+ * @since 2.2.0
142
+ *
143
+ * @return string
144
+ */
145
+ public function get_line_ending() {
146
+
147
+ return static::$LE; // phpcs:ignore
148
+ }
149
+ }
src/Options.php CHANGED
@@ -170,9 +170,11 @@ class Options {
170
  * Retrieve all options of the plugin.
171
  *
172
  * @since 1.0.0
 
173
  */
174
  protected function populate_options() {
175
- $this->_options = get_option( self::META_KEY, array() );
 
176
  }
177
 
178
  /**
170
  * Retrieve all options of the plugin.
171
  *
172
  * @since 1.0.0
173
+ * @since 2.2.0 Added the filter.
174
  */
175
  protected function populate_options() {
176
+
177
+ $this->_options = apply_filters( 'wp_mail_smtp_populate_options', get_option( self::META_KEY, [] ) );
178
  }
179
 
180
  /**
src/Processor.php CHANGED
@@ -146,28 +146,19 @@ class Processor {
146
  $forced = $options->get( 'mail', 'from_email_force' );
147
  $from_email = $options->get( 'mail', 'from_email' );
148
 
149
- if ( ! empty( $reply_to ) ) {
150
  return false;
151
  }
152
 
153
- if ( in_array( $mailer, array( 'gmail', 'outlook' ), true ) ) {
154
  $forced = true;
155
-
156
- switch ( $mailer ) {
157
- case 'gmail':
158
- $sender = wp_mail_smtp()->get_providers()->get_auth( 'gmail' )->get_user_info();
159
- break;
160
-
161
- case 'outlook':
162
- $sender = $options->get( 'outlook', 'user_details' );
163
- break;
164
- }
165
-
166
  $from_email = ! empty( $sender['email'] ) ? $sender['email'] : '';
 
167
  }
168
 
169
  if (
170
- empty( $this->wp_mail_from ) ||
171
  $from_email === $this->wp_mail_from ||
172
  ! $forced
173
  ) {
@@ -213,7 +204,7 @@ class Processor {
213
  * @since 1.3.0 Forcing email rewrite if option is selected.
214
  * @since 1.7.0 Default email may be empty, so pay attention to that as well.
215
  *
216
- * @param string $wp_email
217
  *
218
  * @return string
219
  */
@@ -222,11 +213,11 @@ class Processor {
222
  $options = new Options();
223
  $forced = $options->get( 'mail', 'from_email_force' );
224
  $from_email = $options->get( 'mail', 'from_email' );
225
- $def_email = $this->get_default_email();
226
 
227
  // Save the "original" set WP email from address for later use.
228
  if ( $wp_email !== $def_email ) {
229
- $this->wp_mail_from = $wp_email;
230
  }
231
 
232
  // Return FROM EMAIL if forced in settings.
@@ -308,7 +299,7 @@ class Processor {
308
  *
309
  * @since 1.9.0
310
  *
311
- * @return \WPMailSMTP\MailCatcher
312
  */
313
  public function get_phpmailer() {
314
 
@@ -316,8 +307,7 @@ class Processor {
316
 
317
  // Make sure the PHPMailer class has been instantiated.
318
  if ( ! is_object( $phpmailer ) || ! is_a( $phpmailer, 'PHPMailer' ) ) {
319
- require_once ABSPATH . WPINC . '/class-phpmailer.php';
320
- $phpmailer = new MailCatcher( true ); // phpcs:ignore
321
  }
322
 
323
  return $phpmailer;
@@ -330,7 +320,7 @@ class Processor {
330
  *
331
  * @since 2.1.1
332
  *
333
- * @param \PHPMailer $phpmailer The PHPMailer object.
334
  */
335
  private function set_default_reply_to( $phpmailer ) {
336
 
146
  $forced = $options->get( 'mail', 'from_email_force' );
147
  $from_email = $options->get( 'mail', 'from_email' );
148
 
149
+ if ( ! empty( $reply_to ) || empty( $this->wp_mail_from ) ) {
150
  return false;
151
  }
152
 
153
+ if ( $mailer === 'gmail' ) {
154
  $forced = true;
155
+ } elseif ( $mailer === 'outlook' ) {
156
+ $sender = $options->get( 'outlook', 'user_details' );
 
 
 
 
 
 
 
 
 
157
  $from_email = ! empty( $sender['email'] ) ? $sender['email'] : '';
158
+ $forced = true;
159
  }
160
 
161
  if (
 
162
  $from_email === $this->wp_mail_from ||
163
  ! $forced
164
  ) {
204
  * @since 1.3.0 Forcing email rewrite if option is selected.
205
  * @since 1.7.0 Default email may be empty, so pay attention to that as well.
206
  *
207
+ * @param string $wp_email The email address passed by the filter.
208
  *
209
  * @return string
210
  */
213
  $options = new Options();
214
  $forced = $options->get( 'mail', 'from_email_force' );
215
  $from_email = $options->get( 'mail', 'from_email' );
216
+ $def_email = WP::get_default_email();
217
 
218
  // Save the "original" set WP email from address for later use.
219
  if ( $wp_email !== $def_email ) {
220
+ $this->wp_mail_from = filter_var( $wp_email, FILTER_VALIDATE_EMAIL );
221
  }
222
 
223
  // Return FROM EMAIL if forced in settings.
299
  *
300
  * @since 1.9.0
301
  *
302
+ * @return MailCatcherInterface
303
  */
304
  public function get_phpmailer() {
305
 
307
 
308
  // Make sure the PHPMailer class has been instantiated.
309
  if ( ! is_object( $phpmailer ) || ! is_a( $phpmailer, 'PHPMailer' ) ) {
310
+ $phpmailer = wp_mail_smtp()->generate_mail_catcher( true ); // phpcs:ignore
 
311
  }
312
 
313
  return $phpmailer;
320
  *
321
  * @since 2.1.1
322
  *
323
+ * @param MailCatcherInterface $phpmailer The PHPMailer object.
324
  */
325
  private function set_default_reply_to( $phpmailer ) {
326
 
src/Providers/Gmail/Auth.php CHANGED
@@ -1,283 +1,331 @@
1
- <?php
2
-
3
- namespace WPMailSMTP\Providers\Gmail;
4
-
5
- use WPMailSMTP\Admin\Area;
6
- use WPMailSMTP\Debug;
7
- use WPMailSMTP\Options as PluginOptions;
8
- use WPMailSMTP\Providers\AuthAbstract;
9
-
10
- /**
11
- * Class Auth to request access and refresh tokens.
12
- *
13
- * @since 1.0.0
14
- */
15
- class Auth extends AuthAbstract {
16
-
17
- /**
18
- * Auth constructor.
19
- *
20
- * @since 1.0.0
21
- */
22
- public function __construct() {
23
-
24
- $options = new PluginOptions();
25
- $this->mailer_slug = $options->get( 'mail', 'mailer' );
26
-
27
- if ( $this->mailer_slug !== Options::SLUG ) {
28
- return;
29
- }
30
-
31
- $this->options = $options->get_group( $this->mailer_slug );
32
-
33
- if ( $this->is_clients_saved() ) {
34
-
35
- $this->include_vendor_lib();
36
-
37
- $this->client = $this->get_client();
38
- }
39
- }
40
-
41
- /**
42
- * Get the url, that users will be redirected back to finish the OAuth process.
43
- *
44
- * @since 1.5.2 Returned to the old, pre-1.5, structure of the link to preserve BC.
45
- *
46
- * @return string
47
- */
48
- public static function get_plugin_auth_url() {
49
-
50
- return add_query_arg(
51
- array(
52
- 'page' => Area::SLUG,
53
- 'tab' => 'auth',
54
- ),
55
- admin_url( 'options-general.php' )
56
- );
57
- }
58
-
59
- /**
60
- * Init and get the Google Client object.
61
- *
62
- * @since 1.0.0
63
- * @since 1.5.0 Add ability to apply custom options to the client via a filter.
64
- *
65
- * @return \Google_Client
66
- */
67
- public function get_client() {
68
-
69
- // Doesn't load client twice + gives ability to overwrite.
70
- if ( ! empty( $this->client ) ) {
71
- return $this->client;
72
- }
73
-
74
- $this->include_vendor_lib();
75
-
76
- $client = new \Google_Client(
77
- array(
78
- 'client_id' => $this->options['client_id'],
79
- 'client_secret' => $this->options['client_secret'],
80
- 'redirect_uris' => array(
81
- self::get_plugin_auth_url(),
82
- ),
83
- )
84
- );
85
- $client->setApplicationName( 'WP Mail SMTP v' . WPMS_PLUGIN_VER );
86
- $client->setAccessType( 'offline' );
87
- $client->setApprovalPrompt( 'force' );
88
- $client->setIncludeGrantedScopes( true );
89
- // We request only the sending capability, as it's what we only need to do.
90
- $client->setScopes( array( \Google_Service_Gmail::MAIL_GOOGLE_COM ) );
91
- $client->setRedirectUri( self::get_plugin_auth_url() );
92
-
93
- // Apply custom options to the client.
94
- $client = apply_filters( 'wp_mail_smtp_providers_gmail_auth_get_client_custom_options', $client );
95
-
96
- if (
97
- $this->is_auth_required() &&
98
- ! empty( $this->options['auth_code'] )
99
- ) {
100
- try {
101
- $creds = $client->fetchAccessTokenWithAuthCode( $this->options['auth_code'] );
102
- } catch ( \Exception $e ) {
103
- $creds['error'] = $e->getMessage();
104
- Debug::set(
105
- 'Mailer: Gmail' . "\r\n" .
106
- $creds['error']
107
- );
108
- }
109
-
110
- // Bail if we have an error.
111
- if ( ! empty( $creds['error'] ) ) {
112
- return $client;
113
- }
114
-
115
- $this->update_access_token( $client->getAccessToken() );
116
- $this->update_refresh_token( $client->getRefreshToken() );
117
- }
118
-
119
- if ( ! empty( $this->options['access_token'] ) ) {
120
- $client->setAccessToken( $this->options['access_token'] );
121
- }
122
-
123
- // Refresh the token if it's expired.
124
- if ( $client->isAccessTokenExpired() ) {
125
- $refresh = $client->getRefreshToken();
126
- if ( empty( $refresh ) && isset( $this->options['refresh_token'] ) ) {
127
- $refresh = $this->options['refresh_token'];
128
- }
129
-
130
- if ( ! empty( $refresh ) ) {
131
- try {
132
- $creds = $client->fetchAccessTokenWithRefreshToken( $refresh );
133
- } catch ( \Exception $e ) {
134
- $creds['error'] = $e->getMessage();
135
- Debug::set(
136
- 'Mailer: Gmail' . "\r\n" .
137
- $e->getMessage()
138
- );
139
- }
140
-
141
- // Bail if we have an error.
142
- if ( ! empty( $creds['error'] ) ) {
143
- return $client;
144
- }
145
-
146
- $this->update_access_token( $client->getAccessToken() );
147
- $this->update_refresh_token( $client->getRefreshToken() );
148
- }
149
- }
150
-
151
- return $client;
152
- }
153
-
154
- /**
155
- * Get the auth code from the $_GET and save it.
156
- * Redirect user back to settings with an error message, if failed.
157
- *
158
- * @since 1.0.0
159
- */
160
- public function process() {
161
-
162
- if ( ! ( isset( $_GET['tab'] ) && $_GET['tab'] === 'auth' ) ) {
163
- wp_safe_redirect( wp_mail_smtp()->get_admin()->get_admin_page_url() );
164
- exit;
165
- }
166
-
167
- // We can't process without saved client_id/secret.
168
- if ( ! $this->is_clients_saved() ) {
169
- Debug::set(
170
- esc_html__( 'There was an error while processing the Google authentication request. Please make sure that you have Client ID and Client Secret both valid and saved.', 'wp-mail-smtp' )
171
- );
172
- wp_safe_redirect(
173
- add_query_arg(
174
- 'error',
175
- 'google_no_clients',
176
- wp_mail_smtp()->get_admin()->get_admin_page_url()
177
- )
178
- );
179
- exit;
180
- }
181
-
182
- $this->include_vendor_lib();
183
-
184
- $code = '';
185
- $scope = '';
186
- $error = '';
187
-
188
- if ( isset( $_GET['error'] ) ) {
189
- $error = sanitize_key( $_GET['error'] );
190
- }
191
-
192
- // In case of any error: display a message to a user.
193
- if ( ! empty( $error ) ) {
194
- wp_safe_redirect(
195
- add_query_arg(
196
- 'error',
197
- 'google_' . $error,
198
- wp_mail_smtp()->get_admin()->get_admin_page_url()
199
- )
200
- );
201
- exit;
202
- }
203
-
204
- if ( isset( $_GET['code'] ) ) {
205
- $code = $_GET['code'];
206
- }
207
- if ( isset( $_GET['scope'] ) ) {
208
- $scope = urldecode( $_GET['scope'] );
209
- }
210
-
211
- // Let's try to get the access token.
212
- if (
213
- ! empty( $code ) &&
214
- (
215
- $scope === \Google_Service_Gmail::MAIL_GOOGLE_COM . ' ' . \Google_Service_Gmail::GMAIL_SEND ||
216
- $scope === \Google_Service_Gmail::GMAIL_SEND . ' ' . \Google_Service_Gmail::MAIL_GOOGLE_COM ||
217
- $scope === \Google_Service_Gmail::GMAIL_SEND ||
218
- $scope === \Google_Service_Gmail::MAIL_GOOGLE_COM
219
- )
220
- ) {
221
- // Save the auth code. So \Google_Client can reuse it to retrieve the access token.
222
- $this->update_auth_code( $code );
223
- } else {
224
- wp_safe_redirect(
225
- add_query_arg(
226
- 'error',
227
- 'google_no_code_scope',
228
- wp_mail_smtp()->get_admin()->get_admin_page_url()
229
- )
230
- );
231
- exit;
232
- }
233
-
234
- wp_safe_redirect(
235
- add_query_arg(
236
- 'success',
237
- 'google_site_linked',
238
- wp_mail_smtp()->get_admin()->get_admin_page_url()
239
- )
240
- );
241
- exit;
242
- }
243
-
244
- /**
245
- * Get the auth URL used to proceed to Provider to request access to send emails.
246
- *
247
- * @since 1.0.0
248
- *
249
- * @return string
250
- */
251
- public function get_auth_url() {
252
-
253
- if (
254
- ! empty( $this->client ) &&
255
- class_exists( 'Google_Client', false ) &&
256
- $this->client instanceof \Google_Client
257
- ) {
258
- return filter_var( $this->client->createAuthUrl(), FILTER_SANITIZE_URL );
259
- }
260
-
261
- return '#';
262
- }
263
-
264
- /**
265
- * Get user information (like email etc) that is associated with the current connection.
266
- *
267
- * @since 1.5.0
268
- *
269
- * @return array
270
- */
271
- public function get_user_info() {
272
-
273
- $gmail = new \Google_Service_Gmail( $this->get_client() );
274
-
275
- try {
276
- $email = $gmail->users->getProfile( 'me' )->getEmailAddress();
277
- } catch ( \Exception $e ) {
278
- $email = '';
279
- }
280
-
281
- return array( 'email' => $email );
282
- }
283
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPMailSMTP\Providers\Gmail;
4
+
5
+ use WPMailSMTP\Admin\Area;
6
+ use WPMailSMTP\Debug;
7
+ use WPMailSMTP\Options as PluginOptions;
8
+ use WPMailSMTP\Providers\AuthAbstract;
9
+
10
+ /**
11
+ * Class Auth to request access and refresh tokens.
12
+ *
13
+ * @since 1.0.0
14
+ */
15
+ class Auth extends AuthAbstract {
16
+
17
+ /**
18
+ * List of all possible "from email" email addresses (aliases).
19
+ *
20
+ * @since 2.2.0
21
+ *
22
+ * @var null|array
23
+ */
24
+ private $aliases = null;
25
+
26
+ /**
27
+ * Auth constructor.
28
+ *
29
+ * @since 1.0.0
30
+ */
31
+ public function __construct() {
32
+
33
+ $options = new PluginOptions();
34
+ $this->mailer_slug = $options->get( 'mail', 'mailer' );
35
+
36
+ if ( $this->mailer_slug !== Options::SLUG ) {
37
+ return;
38
+ }
39
+
40
+ $this->options = $options->get_group( $this->mailer_slug );
41
+
42
+ if ( $this->is_clients_saved() ) {
43
+
44
+ $this->include_vendor_lib();
45
+
46
+ $this->client = $this->get_client();
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Get the url, that users will be redirected back to finish the OAuth process.
52
+ *
53
+ * @since 1.5.2 Returned to the old, pre-1.5, structure of the link to preserve BC.
54
+ *
55
+ * @return string
56
+ */
57
+ public static function get_plugin_auth_url() {
58
+
59
+ return apply_filters(
60
+ 'wp_mail_smtp_gmail_get_plugin_auth_url',
61
+ add_query_arg(
62
+ array(
63
+ 'page' => Area::SLUG,
64
+ 'tab' => 'auth',
65
+ ),
66
+ admin_url( 'options-general.php' )
67
+ )
68
+ );
69
+ }
70
+
71
+ /**
72
+ * Init and get the Google Client object.
73
+ *
74
+ * @since 1.0.0
75
+ * @since 1.5.0 Add ability to apply custom options to the client via a filter.
76
+ *
77
+ * @return \Google_Client
78
+ */
79
+ public function get_client() {
80
+
81
+ // Doesn't load client twice + gives ability to overwrite.
82
+ if ( ! empty( $this->client ) ) {
83
+ return $this->client;
84
+ }
85
+
86
+ $this->include_vendor_lib();
87
+
88
+ $client = new \Google_Client(
89
+ array(
90
+ 'client_id' => $this->options['client_id'],
91
+ 'client_secret' => $this->options['client_secret'],
92
+ 'redirect_uris' => array(
93
+ self::get_plugin_auth_url(),
94
+ ),
95
+ )
96
+ );
97
+ $client->setApplicationName( 'WP Mail SMTP v' . WPMS_PLUGIN_VER );
98
+ $client->setAccessType( 'offline' );
99
+ $client->setApprovalPrompt( 'force' );
100
+ $client->setIncludeGrantedScopes( true );
101
+ // We request only the sending capability, as it's what we only need to do.
102
+ $client->setScopes( array( \Google_Service_Gmail::MAIL_GOOGLE_COM ) );
103
+ $client->setRedirectUri( self::get_plugin_auth_url() );
104
+
105
+ // Apply custom options to the client.
106
+ $client = apply_filters( 'wp_mail_smtp_providers_gmail_auth_get_client_custom_options', $client );
107
+
108
+ if (
109
+ $this->is_auth_required() &&
110
+ ! empty( $this->options['auth_code'] )
111
+ ) {
112
+ try {
113
+ $creds = $client->fetchAccessTokenWithAuthCode( $this->options['auth_code'] );
114
+ } catch ( \Exception $e ) {
115
+ $creds['error'] = $e->getMessage();
116
+ Debug::set(
117
+ 'Mailer: Gmail' . "\r\n" .
118
+ $creds['error']
119
+ );
120
+ }
121
+
122
+ // Bail if we have an error.
123
+ if ( ! empty( $creds['error'] ) ) {
124
+ return $client;
125
+ }
126
+
127
+ $this->update_access_token( $client->getAccessToken() );
128
+ $this->update_refresh_token( $client->getRefreshToken() );
129
+ }
130
+
131
+ if ( ! empty( $this->options['access_token'] ) ) {
132
+ $client->setAccessToken( $this->options['access_token'] );
133
+ }
134
+
135
+ // Refresh the token if it's expired.
136
+ if ( $client->isAccessTokenExpired() ) {
137
+ $refresh = $client->getRefreshToken();
138
+ if ( empty( $refresh ) && isset( $this->options['refresh_token'] ) ) {
139
+ $refresh = $this->options['refresh_token'];
140
+ }
141
+
142
+ if ( ! empty( $refresh ) ) {
143
+ try {
144
+ $creds = $client->fetchAccessTokenWithRefreshToken( $refresh );
145
+ } catch ( \Exception $e ) {
146
+ $creds['error'] = $e->getMessage();
147
+ Debug::set(
148
+ 'Mailer: Gmail' . "\r\n" .
149
+ $e->getMessage()
150
+ );
151
+ }
152
+
153
+ // Bail if we have an error.
154
+ if ( ! empty( $creds['error'] ) ) {
155
+ return $client;
156
+ }
157
+
158
+ $this->update_access_token( $client->getAccessToken() );
159
+ $this->update_refresh_token( $client->getRefreshToken() );
160
+ }
161
+ }
162
+
163
+ return $client;
164
+ }
165
+
166
+ /**
167
+ * Get the auth code from the $_GET and save it.
168
+ * Redirect user back to settings with an error message, if failed.
169
+ *
170
+ * @since 1.0.0
171
+ */
172
+ public function process() {
173
+
174
+ if ( ! ( isset( $_GET['tab'] ) && $_GET['tab'] === 'auth' ) ) {
175
+ wp_safe_redirect( wp_mail_smtp()->get_admin()->get_admin_page_url() );
176
+ exit;
177
+ }
178
+
179
+ // We can't process without saved client_id/secret.
180
+ if ( ! $this->is_clients_saved() ) {
181
+ Debug::set(
182
+ esc_html__( 'There was an error while processing the Google authentication request. Please make sure that you have Client ID and Client Secret both valid and saved.', 'wp-mail-smtp' )
183
+ );
184
+ wp_safe_redirect(
185
+ add_query_arg(
186
+ 'error',
187
+ 'google_no_clients',
188
+ wp_mail_smtp()->get_admin()->get_admin_page_url()
189
+ )
190
+ );
191
+ exit;
192
+ }
193
+
194
+ $this->include_vendor_lib();
195
+
196
+ $code = '';
197
+ $scope = '';
198
+ $error = '';
199
+
200
+ if ( isset( $_GET['error'] ) ) {
201
+ $error = sanitize_key( $_GET['error'] );
202
+ }
203
+
204
+ // In case of any error: display a message to a user.
205
+ if ( ! empty( $error ) ) {
206
+ wp_safe_redirect(
207
+ add_query_arg(
208
+ 'error',
209
+ 'google_' . $error,
210
+ wp_mail_smtp()->get_admin()->get_admin_page_url()
211
+ )
212
+ );
213
+ exit;
214
+ }
215
+
216
+ if ( isset( $_GET['code'] ) ) {
217
+ $code = $_GET['code'];
218
+ }
219
+ if ( isset( $_GET['scope'] ) ) {
220
+ $scope = urldecode( $_GET['scope'] );
221
+ }
222
+
223
+ // Let's try to get the access token.
224
+ if (
225
+ ! empty( $code ) &&
226
+ (
227
+ $scope === \Google_Service_Gmail::MAIL_GOOGLE_COM . ' ' . \Google_Service_Gmail::GMAIL_SEND ||
228
+ $scope === \Google_Service_Gmail::GMAIL_SEND . ' ' . \Google_Service_Gmail::MAIL_GOOGLE_COM ||
229
+ $scope === \Google_Service_Gmail::GMAIL_SEND ||
230
+ $scope === \Google_Service_Gmail::MAIL_GOOGLE_COM
231
+ )
232
+ ) {
233
+ // Save the auth code. So \Google_Client can reuse it to retrieve the access token.
234
+ $this->update_auth_code( $code );
235
+ } else {
236
+ wp_safe_redirect(
237
+ add_query_arg(
238
+ 'error',
239
+ 'google_no_code_scope',
240
+ wp_mail_smtp()->get_admin()->get_admin_page_url()
241
+ )
242
+ );
243
+ exit;
244
+ }
245
+
246
+ wp_safe_redirect(
247
+ add_query_arg(
248
+ 'success',
249
+ 'google_site_linked',
250
+ wp_mail_smtp()->get_admin()->get_admin_page_url()
251
+ )
252
+ );
253
+ exit;
254
+ }
255
+
256
+ /**
257
+ * Get the auth URL used to proceed to Provider to request access to send emails.
258
+ *
259
+ * @since 1.0.0
260
+ *
261
+ * @return string
262
+ */
263
+ public function get_auth_url() {
264
+
265
+ if (
266
+ ! empty( $this->client ) &&
267
+ class_exists( 'Google_Client', false ) &&
268
+ $this->client instanceof \Google_Client
269
+ ) {
270
+ return filter_var( $this->client->createAuthUrl(), FILTER_SANITIZE_URL );
271
+ }
272
+
273
+ return '#';
274
+ }
275
+
276
+ /**
277
+ * Get user information (like email etc) that is associated with the current connection.
278
+ *
279
+ * @since 1.5.0
280
+ *
281
+ * @return array
282
+ */
283
+ public function get_user_info() {
284
+
285
+ $gmail = new \Google_Service_Gmail( $this->get_client() );
286
+
287
+ try {
288
+ $email = $gmail->users->getProfile( 'me' )->getEmailAddress();
289
+ } catch ( \Exception $e ) {
290
+ $email = '';
291
+ }
292
+
293
+ return array( 'email' => $email );
294
+ }
295
+
296
+ /**
297
+ * Get the registered email addresses that the user can use as the "from email".
298
+ *
299
+ * @since 2.2.0
300
+ *
301
+ * @return array The list of possible from email addresses.
302
+ */
303
+ public function get_user_possible_send_from_addresses() {
304
+
305
+ if ( isset( $this->aliases ) ) {
306
+ return $this->aliases;
307
+ }
308
+
309
+ $gmail = new \Google_Service_Gmail( $this->get_client() );
310
+
311
+ try {
312
+ $response = $gmail->users_settings_sendAs->listUsersSettingsSendAs( 'me' ); // phpcs:ignore
313
+
314
+ // phpcs:disable
315
+ if ( isset( $response->sendAs ) ) {
316
+ $this->aliases = array_map(
317
+ function( $sendAsObject ) {
318
+ return $sendAsObject->sendAsEmail;
319
+ },
320
+ $response->sendAs
321
+ );
322
+ }
323
+ // phpcs:enable
324
+
325
+ } catch ( \Exception $exception ) {
326
+ $this->aliases = [];
327
+ }
328
+
329
+ return $this->aliases;
330
+ }
331
+ }
src/Providers/Gmail/Mailer.php CHANGED
@@ -3,7 +3,7 @@
3
  namespace WPMailSMTP\Providers\Gmail;
4
 
5
  use WPMailSMTP\Debug;
6
- use WPMailSMTP\MailCatcher;
7
  use WPMailSMTP\Providers\MailerAbstract;
8
 
9
  /**
@@ -37,10 +37,11 @@ class Mailer extends MailerAbstract {
37
  *
38
  * @since 1.0.0
39
  *
40
- * @param \WPMailSMTP\MailCatcher $phpmailer
41
  */
42
  public function __construct( $phpmailer ) {
43
- parent::__construct( $phpmailer );
 
44
 
45
  if ( ! $this->is_php_compatible() ) {
46
  return;
@@ -52,14 +53,12 @@ class Mailer extends MailerAbstract {
52
  *
53
  * @since 1.2.0
54
  *
55
- * @param \WPMailSMTP\MailCatcher $phpmailer
56
  */
57
  public function process_phpmailer( $phpmailer ) {
58
- // Make sure that we have access to MailCatcher class methods.
59
- if (
60
- ! $phpmailer instanceof MailCatcher &&
61
- ! $phpmailer instanceof \PHPMailer
62
- ) {
63
  return;
64
  }
65
 
@@ -79,25 +78,23 @@ class Mailer extends MailerAbstract {
79
  $auth = new Auth();
80
  $message = new \Google_Service_Gmail_Message();
81
 
82
- /*
83
- * Right now Gmail doesn't allow to redefine From and Sender email headers.
84
- * It always uses the email address that was used to connect to its API.
85
- * With code below we are making sure that Email Log archive and single Email Log
86
- * have the save value for From email header.
87
- */
88
- $gmail_creds = $auth->get_user_info();
89
-
90
- if ( ! empty( $gmail_creds['email'] ) ) {
91
- $this->phpmailer->From = $gmail_creds['email'];
92
- $this->phpmailer->Sender = $gmail_creds['email'];
93
  }
94
 
95
  try {
96
- // Prepare a message for sending.
97
  $this->phpmailer->preSend();
98
 
99
- // Get the raw MIME email using MailCatcher data.
100
- // We need here to make base64URL-safe string.
101
  $base64 = str_replace(
102
  [ '+', '/', '=' ],
103
  [ '-', '_', '' ],
3
  namespace WPMailSMTP\Providers\Gmail;
4
 
5
  use WPMailSMTP\Debug;
6
+ use WPMailSMTP\MailCatcherInterface;
7
  use WPMailSMTP\Providers\MailerAbstract;
8
 
9
  /**
37
  *
38
  * @since 1.0.0
39
  *
40
+ * @param MailCatcherInterface $phpmailer The MailCatcher object.
41
  */
42
  public function __construct( $phpmailer ) {
43
+
44
+ parent::__construct( $phpmailer );
45
 
46
  if ( ! $this->is_php_compatible() ) {
47
  return;
53
  *
54
  * @since 1.2.0
55
  *
56
+ * @param MailCatcherInterface $phpmailer The MailCatcher object.
57
  */
58
  public function process_phpmailer( $phpmailer ) {
59
+
60
+ // Make sure that we have access to PHPMailer class methods.
61
+ if ( ! wp_mail_smtp()->is_valid_phpmailer( $phpmailer ) ) {
 
 
62
  return;
63
  }
64
 
78
  $auth = new Auth();
79
  $message = new \Google_Service_Gmail_Message();
80
 
81
+ // Set the authorized Gmail email address as the "from email" if the set email is not on the list of aliases.
82
+ $possible_from_emails = $auth->get_user_possible_send_from_addresses();
83
+
84
+ if ( ! in_array( $this->phpmailer->From, $possible_from_emails, true ) ) {
85
+ $user_info = $auth->get_user_info();
86
+
87
+ if ( ! empty( $user_info['email'] ) ) {
88
+ $this->phpmailer->From = $user_info['email'];
89
+ $this->phpmailer->Sender = $user_info['email'];
90
+ }
 
91
  }
92
 
93
  try {
94
+ // Prepare a message for sending if any changes happened above.
95
  $this->phpmailer->preSend();
96
 
97
+ // Get the raw MIME email using MailCatcher data. We need to make base64URL-safe string.
 
98
  $base64 = str_replace(
99
  [ '+', '/', '=' ],
100
  [ '-', '_', '' ],
src/Providers/Gmail/Options.php CHANGED
@@ -1,234 +1,251 @@
1
- <?php
2
-
3
- namespace WPMailSMTP\Providers\Gmail;
4
-
5
- use WPMailSMTP\Providers\OptionsAbstract;
6
-
7
- /**
8
- * Class Option.
9
- *
10
- * @since 1.0.0
11
- */
12
- class Options extends OptionsAbstract {
13
-
14
- /**
15
- * Mailer slug.
16
- *
17
- * @since 1.5.0
18
- */
19
- const SLUG = 'gmail';
20
-
21
- /**
22
- * Gmail Options constructor.
23
- *
24
- * @since 1.0.0
25
- */
26
- public function __construct() {
27
-
28
- parent::__construct(
29
- array(
30
- 'logo_url' => wp_mail_smtp()->assets_url . '/images/providers/google.svg',
31
- 'slug' => self::SLUG,
32
- 'title' => esc_html__( 'Gmail', 'wp-mail-smtp' ),
33
- 'description' => sprintf(
34
- wp_kses( /* translators: %s - URL to our Gmail doc. */
35
- __( 'Send emails using your Gmail or G Suite (formerly Google Apps) account, all while keeping your login credentials safe. Other Google SMTP methods require enabling less secure apps in your account and entering your password. However, this integration uses the Google API to improve email delivery issues while keeping your site secure.<br><br>Read our <a href="%s" target="_blank" rel="noopener noreferrer">Gmail documentation</a> to learn how to configure Gmail or G Suite.', 'wp-mail-smtp' ),
36
- array(
37
- 'br' => array(),
38
- 'a' => array(
39
- 'href' => array(),
40
- 'rel' => array(),
41
- 'target' => array(),
42
- ),
43
- )
44
- ),
45
- 'https://wpmailsmtp.com/docs/how-to-set-up-the-gmail-mailer-in-wp-mail-smtp/'
46
- ),
47
- 'notices' => array(
48
- 'educational' => esc_html__( 'The Gmail mailer works well for sites that send low numbers of emails. However, Gmail\'s API has rate limitations and a number of additional restrictions that can lead to challenges during setup. If you expect to send a high volume of emails, or if you find that your web host is not compatible with the Gmail API restrictions, then we recommend considering a different mailer option.', 'wp-mail-smtp' ),
49
- ),
50
- 'php' => '5.5',
51
- )
52
- );
53
- }
54
-
55
- /**
56
- * @inheritdoc
57
- */
58
- public function display_options() {
59
-
60
- // Do not display options if PHP version is not correct.
61
- if ( ! $this->is_php_correct() ) {
62
- $this->display_php_warning();
63
-
64
- return;
65
- }
66
- ?>
67
-
68
- <!-- Client ID -->
69
- <div id="wp-mail-smtp-setting-row-<?php echo esc_attr( $this->get_slug() ); ?>-client_id"
70
- class="wp-mail-smtp-setting-row wp-mail-smtp-setting-row-text wp-mail-smtp-clear">
71
- <div class="wp-mail-smtp-setting-label">
72
- <label for="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_id"><?php esc_html_e( 'Client ID', 'wp-mail-smtp' ); ?></label>
73
- </div>
74
- <div class="wp-mail-smtp-setting-field">
75
- <input name="wp-mail-smtp[<?php echo esc_attr( $this->get_slug() ); ?>][client_id]" type="text"
76
- value="<?php echo esc_attr( $this->options->get( $this->get_slug(), 'client_id' ) ); ?>"
77
- <?php echo $this->options->is_const_defined( $this->get_slug(), 'client_id' ) ? 'disabled' : ''; ?>
78
- id="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_id" spellcheck="false"
79
- />
80
- </div>
81
- </div>
82
-
83
- <!-- Client Secret -->
84
- <div id="wp-mail-smtp-setting-row-<?php echo esc_attr( $this->get_slug() ); ?>-client_secret"
85
- class="wp-mail-smtp-setting-row wp-mail-smtp-setting-row-text wp-mail-smtp-clear">
86
- <div class="wp-mail-smtp-setting-label">
87
- <label for="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_secret"><?php esc_html_e( 'Client Secret', 'wp-mail-smtp' ); ?></label>
88
- </div>
89
- <div class="wp-mail-smtp-setting-field">
90
- <?php if ( $this->options->is_const_defined( $this->get_slug(), 'client_secret' ) ) : ?>
91
- <input type="text" disabled value="****************************************"
92
- id="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_secret"
93
- />
94
- <?php $this->display_const_set_message( 'WPMS_GMAIL_CLIENT_SECRET' ); ?>
95
- <?php else : ?>
96
- <input type="password" spellcheck="false"
97
- name="wp-mail-smtp[<?php echo esc_attr( $this->get_slug() ); ?>][client_secret]"
98
- value="<?php echo esc_attr( $this->options->get( $this->get_slug(), 'client_secret' ) ); ?>"
99
- id="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_secret"
100
- />
101
- <?php endif; ?>
102
- </div>
103
- </div>
104
-
105
- <!-- Authorized redirect URI -->
106
- <div id="wp-mail-smtp-setting-row-<?php echo esc_attr( $this->get_slug() ); ?>-client_redirect"
107
- class="wp-mail-smtp-setting-row wp-mail-smtp-setting-row-text wp-mail-smtp-clear">
108
- <div class="wp-mail-smtp-setting-label">
109
- <label for="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_redirect"><?php esc_html_e( 'Authorized redirect URI', 'wp-mail-smtp' ); ?></label>
110
- </div>
111
- <div class="wp-mail-smtp-setting-field">
112
- <input type="text" readonly="readonly"
113
- value="<?php echo esc_attr( Auth::get_plugin_auth_url() ); ?>"
114
- id="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_redirect"
115
- />
116
- <button type="button" class="wp-mail-smtp-btn wp-mail-smtp-btn-md wp-mail-smtp-btn-light-grey wp-mail-smtp-setting-copy"
117
- title="<?php esc_attr_e( 'Copy URL to clipboard', 'wp-mail-smtp' ); ?>"
118
- data-source_id="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_redirect">
119
- <span class="dashicons dashicons-admin-page"></span>
120
- </button>
121
- <p class="desc">
122
- <?php esc_html_e( 'Please copy this URL into the "Authorized redirect URIs" field of your Google web application.', 'wp-mail-smtp' ); ?>
123
- </p>
124
- </div>
125
- </div>
126
-
127
- <!-- Auth users button -->
128
- <div id="wp-mail-smtp-setting-row-<?php echo esc_attr( $this->get_slug() ); ?>-authorize"
129
- class="wp-mail-smtp-setting-row wp-mail-smtp-setting-row-text wp-mail-smtp-clear">
130
- <div class="wp-mail-smtp-setting-label">
131
- <label><?php esc_html_e( 'Authorization', 'wp-mail-smtp' ); ?></label>
132
- </div>
133
- <div class="wp-mail-smtp-setting-field">
134
- <?php $this->display_auth_setting_action(); ?>
135
- </div>
136
- </div>
137
-
138
- <?php
139
- }
140
-
141
- /**
142
- * Display either an "Allow..." or "Remove..." button.
143
- *
144
- * @since 1.3.0
145
- */
146
- protected function display_auth_setting_action() {
147
-
148
- // Do the processing on the fly, as having ajax here is too complicated.
149
- $this->process_provider_remove();
150
-
151
- $auth = new Auth();
152
- ?>
153
-
154
- <?php if ( $auth->is_clients_saved() ) : ?>
155
-
156
- <?php if ( $auth->is_auth_required() ) : ?>
157
-
158
- <a href="<?php echo esc_url( $auth->get_auth_url() ); ?>" class="wp-mail-smtp-btn wp-mail-smtp-btn-md wp-mail-smtp-btn-orange">
159
- <?php esc_html_e( 'Allow plugin to send emails using your Google account', 'wp-mail-smtp' ); ?>
160
- </a>
161
- <p class="desc">
162
- <?php esc_html_e( 'Click the button above to confirm authorization.', 'wp-mail-smtp' ); ?>
163
- </p>
164
-
165
- <?php else : ?>
166
-
167
- <a href="<?php echo esc_url( wp_nonce_url( wp_mail_smtp()->get_admin()->get_admin_page_url(), 'gmail_remove', 'gmail_remove_nonce' ) ); ?>#wp-mail-smtp-setting-row-<?php echo esc_attr( $this->get_slug() ); ?>-authorize" class="wp-mail-smtp-btn wp-mail-smtp-btn-md wp-mail-smtp-btn-red js-wp-mail-smtp-provider-remove">
168
- <?php esc_html_e( 'Remove Connection', 'wp-mail-smtp' ); ?>
169
- </a>
170
- <span class="connected-as">
171
- <?php
172
- $user = $auth->get_user_info();
173
-
174
- if ( ! empty( $user['email'] ) ) {
175
- printf(
176
- /* translators: %s - email address, as received from Google API. */
177
- esc_html__( 'Connected as %s', 'wp-mail-smtp' ),
178
- '<code>' . esc_html( $user['email'] ) . '</code>'
179
- );
180
- }
181
- ?>
182
- </span>
183
- <p class="desc">
184
- <?php esc_html_e( 'Removing the connection will give you an ability to redo the connection or link to another Google account.', 'wp-mail-smtp' ); ?>
185
- </p>
186
-
187
- <?php endif; ?>
188
-
189
- <?php else : ?>
190
-
191
- <p class="inline-notice inline-error">
192
- <?php esc_html_e( 'You need to save settings with Client ID and Client Secret before you can proceed.', 'wp-mail-smtp' ); ?>
193
- </p>
194
-
195
- <?php
196
- endif;
197
- }
198
-
199
- /**
200
- * Remove Provider connection.
201
- *
202
- * @since 1.3.0
203
- */
204
- public function process_provider_remove() {
205
-
206
- if ( ! is_super_admin() ) {
207
- return;
208
- }
209
-
210
- if (
211
- ! isset( $_GET['gmail_remove_nonce'] ) ||
212
- ! wp_verify_nonce( $_GET['gmail_remove_nonce'], 'gmail_remove' ) // phpcs:ignore
213
- ) {
214
- return;
215
- }
216
-
217
- $options = new \WPMailSMTP\Options();
218
-
219
- if ( $options->get( 'mail', 'mailer' ) !== $this->get_slug() ) {
220
- return;
221
- }
222
-
223
- $old_opt = $options->get_all();
224
-
225
- foreach ( $old_opt[ $this->get_slug() ] as $key => $value ) {
226
- // Unset everything except Client ID and Secret.
227
- if ( ! in_array( $key, array( 'client_id', 'client_secret' ), true ) ) {
228
- unset( $old_opt[ $this->get_slug() ][ $key ] );
229
- }
230
- }
231
-
232
- $options->set( $old_opt );
233
- }
234
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPMailSMTP\Providers\Gmail;
4
+
5
+ use WPMailSMTP\Providers\OptionsAbstract;
6
+
7
+ /**
8
+ * Class Option.
9
+ *
10
+ * @since 1.0.0
11
+ */
12
+ class Options extends OptionsAbstract {
13
+
14
+ /**
15
+ * Mailer slug.
16
+ *
17
+ * @since 1.5.0
18
+ */
19
+ const SLUG = 'gmail';
20
+
21
+ /**
22
+ * Gmail Options constructor.
23
+ *
24
+ * @since 1.0.0
25
+ */
26
+ public function __construct() {
27
+
28
+ parent::__construct(
29
+ array(
30
+ 'logo_url' => wp_mail_smtp()->assets_url . '/images/providers/google.svg',
31
+ 'slug' => self::SLUG,
32
+ 'title' => esc_html__( 'Gmail', 'wp-mail-smtp' ),
33
+ 'description' => sprintf(
34
+ wp_kses( /* translators: %s - URL to our Gmail doc. */
35
+ __( 'Send emails using your Gmail or G Suite (formerly Google Apps) account, all while keeping your login credentials safe. Other Google SMTP methods require enabling less secure apps in your account and entering your password. However, this integration uses the Google API to improve email delivery issues while keeping your site secure.<br><br>Read our <a href="%s" target="_blank" rel="noopener noreferrer">Gmail documentation</a> to learn how to configure Gmail or G Suite.', 'wp-mail-smtp' ),
36
+ array(
37
+ 'br' => array(),
38
+ 'a' => array(
39
+ 'href' => array(),
40
+ 'rel' => array(),
41
+ 'target' => array(),
42
+ ),
43
+ )
44
+ ),
45
+ 'https://wpmailsmtp.com/docs/how-to-set-up-the-gmail-mailer-in-wp-mail-smtp/'
46
+ ),
47
+ 'notices' => array(
48
+ 'educational' => esc_html__( 'The Gmail mailer works well for sites that send low numbers of emails. However, Gmail\'s API has rate limitations and a number of additional restrictions that can lead to challenges during setup. If you expect to send a high volume of emails, or if you find that your web host is not compatible with the Gmail API restrictions, then we recommend considering a different mailer option.', 'wp-mail-smtp' ),
49
+ ),
50
+ 'php' => '5.5',
51
+ )
52
+ );
53
+ }
54
+
55
+ /**
56
+ * @inheritdoc
57
+ */
58
+ public function display_options() {
59
+
60
+ // Do not display options if PHP version is not correct.
61
+ if ( ! $this->is_php_correct() ) {
62
+ $this->display_php_warning();
63
+
64
+ return;
65
+ }
66
+ ?>
67
+
68
+ <!-- Client ID -->
69
+ <div id="wp-mail-smtp-setting-row-<?php echo esc_attr( $this->get_slug() ); ?>-client_id"
70
+ class="wp-mail-smtp-setting-row wp-mail-smtp-setting-row-text wp-mail-smtp-clear">
71
+ <div class="wp-mail-smtp-setting-label">
72
+ <label for="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_id"><?php esc_html_e( 'Client ID', 'wp-mail-smtp' ); ?></label>
73
+ </div>
74
+ <div class="wp-mail-smtp-setting-field">
75
+ <input name="wp-mail-smtp[<?php echo esc_attr( $this->get_slug() ); ?>][client_id]" type="text"
76
+ value="<?php echo esc_attr( $this->options->get( $this->get_slug(), 'client_id' ) ); ?>"
77
+ <?php echo $this->options->is_const_defined( $this->get_slug(), 'client_id' ) ? 'disabled' : ''; ?>
78
+ id="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_id" spellcheck="false"
79
+ />
80
+ </div>
81
+ </div>
82
+
83
+ <!-- Client Secret -->
84
+ <div id="wp-mail-smtp-setting-row-<?php echo esc_attr( $this->get_slug() ); ?>-client_secret"
85
+ class="wp-mail-smtp-setting-row wp-mail-smtp-setting-row-text wp-mail-smtp-clear">
86
+ <div class="wp-mail-smtp-setting-label">
87
+ <label for="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_secret"><?php esc_html_e( 'Client Secret', 'wp-mail-smtp' ); ?></label>
88
+ </div>
89
+ <div class="wp-mail-smtp-setting-field">
90
+ <?php if ( $this->options->is_const_defined( $this->get_slug(), 'client_secret' ) ) : ?>
91
+ <input type="text" disabled value="****************************************"
92
+ id="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_secret"
93
+ />
94
+ <?php $this->display_const_set_message( 'WPMS_GMAIL_CLIENT_SECRET' ); ?>
95
+ <?php else : ?>
96
+ <input type="password" spellcheck="false"
97
+ name="wp-mail-smtp[<?php echo esc_attr( $this->get_slug() ); ?>][client_secret]"
98
+ value="<?php echo esc_attr( $this->options->get( $this->get_slug(), 'client_secret' ) ); ?>"
99
+ id="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_secret"
100
+ />
101
+ <?php endif; ?>
102
+ </div>
103
+ </div>
104
+
105
+ <!-- Authorized redirect URI -->
106
+ <div id="wp-mail-smtp-setting-row-<?php echo esc_attr( $this->get_slug() ); ?>-client_redirect"
107
+ class="wp-mail-smtp-setting-row wp-mail-smtp-setting-row-text wp-mail-smtp-clear">
108
+ <div class="wp-mail-smtp-setting-label">
109
+ <label for="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_redirect"><?php esc_html_e( 'Authorized redirect URI', 'wp-mail-smtp' ); ?></label>
110
+ </div>
111
+ <div class="wp-mail-smtp-setting-field">
112
+ <input type="text" readonly="readonly"
113
+ value="<?php echo esc_attr( Auth::get_plugin_auth_url() ); ?>"
114
+ id="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_redirect"
115
+ />
116
+ <button type="button" class="wp-mail-smtp-btn wp-mail-smtp-btn-md wp-mail-smtp-btn-light-grey wp-mail-smtp-setting-copy"
117
+ title="<?php esc_attr_e( 'Copy URL to clipboard', 'wp-mail-smtp' ); ?>"
118
+ data-source_id="wp-mail-smtp-setting-<?php echo esc_attr( $this->get_slug() ); ?>-client_redirect">
119
+ <span class="dashicons dashicons-admin-page"></span>
120
+ </button>
121
+ <p class="desc">
122
+ <?php esc_html_e( 'Please copy this URL into the "Authorized redirect URIs" field of your Google web application.', 'wp-mail-smtp' ); ?>
123
+ </p>
124
+ </div>
125
+ </div>
126
+
127
+ <!-- Auth users button -->
128
+ <div id="wp-mail-smtp-setting-row-<?php echo esc_attr( $this->get_slug() ); ?>-authorize"
129
+ class="wp-mail-smtp-setting-row wp-mail-smtp-setting-row-text wp-mail-smtp-clear">
130
+ <div class="wp-mail-smtp-setting-label">
131
+ <label><?php esc_html_e( 'Authorization', 'wp-mail-smtp' ); ?></label>
132
+ </div>
133
+ <div class="wp-mail-smtp-setting-field">
134
+ <?php $this->display_auth_setting_action(); ?>
135
+ </div>
136
+ </div>
137
+
138
+ <?php
139
+ }
140
+
141
+ /**
142
+ * Display either an "Allow..." or "Remove..." button.
143
+ *
144
+ * @since 1.3.0
145
+ */
146
+ protected function display_auth_setting_action() {
147
+
148
+ // Do the processing on the fly, as having ajax here is too complicated.
149
+ $this->process_provider_remove();
150
+
151
+ $auth = new Auth();
152
+ ?>
153
+
154
+ <?php if ( $auth->is_clients_saved() ) : ?>
155
+
156
+ <?php if ( $auth->is_auth_required() ) : ?>
157
+
158
+ <a href="<?php echo esc_url( $auth->get_auth_url() ); ?>" class="wp-mail-smtp-btn wp-mail-smtp-btn-md wp-mail-smtp-btn-orange">
159
+ <?php esc_html_e( 'Allow plugin to send emails using your Google account', 'wp-mail-smtp' ); ?>
160
+ </a>
161
+ <p class="desc">
162
+ <?php esc_html_e( 'Click the button above to confirm authorization.', 'wp-mail-smtp' ); ?>
163
+ </p>
164
+
165
+ <?php else : ?>
166
+
167
+ <a href="<?php echo esc_url( wp_nonce_url( wp_mail_smtp()->get_admin()->get_admin_page_url(), 'gmail_remove', 'gmail_remove_nonce' ) ); ?>#wp-mail-smtp-setting-row-<?php echo esc_attr( $this->get_slug() ); ?>-authorize" class="wp-mail-smtp-btn wp-mail-smtp-btn-md wp-mail-smtp-btn-red js-wp-mail-smtp-provider-remove">
168
+ <?php esc_html_e( 'Remove Connection', 'wp-mail-smtp' ); ?>
169
+ </a>
170
+ <span class="connected-as">
171
+ <?php
172
+ $user = $auth->get_user_info();
173
+
174
+ if ( ! empty( $user['email'] ) ) {
175
+ printf(
176
+ /* translators: %s - email address, as received from Google API. */
177
+ esc_html__( 'Connected as %s', 'wp-mail-smtp' ),
178
+ '<code>' . esc_html( $user['email'] ) . '</code>'
179
+ );
180
+ }
181
+ ?>
182
+ </span>
183
+ <p class="desc">
184
+ <?php
185
+ printf(
186
+ wp_kses( /* translators: %s - URL to Google Gmail alias documentation page. */
187
+ __( 'If you want to use a different From Email address you can set-up a Google email alias. <a href="%s" target="_blank" rel="noopener noreferrer">Follow these instructions</a> and then select the From Email at the top of this page.', 'wp-mail-smtp' ),
188
+ [
189
+ 'a' => [
190
+ 'href' => [],
191
+ 'rel' => [],
192
+ 'target' => [],
193
+ ],
194
+ ]
195
+ ),
196
+ 'https://support.google.com/a/answer/33327'
197
+ );
198
+ ?>
199
+ </p>
200
+ <p class="desc">
201
+ <?php esc_html_e( 'Removing the connection will give you an ability to redo the connection or link to another Google account.', 'wp-mail-smtp' ); ?>
202
+ </p>
203
+
204
+ <?php endif; ?>
205
+
206
+ <?php else : ?>
207
+
208
+ <p class="inline-notice inline-error">
209
+ <?php esc_html_e( 'You need to save settings with Client ID and Client Secret before you can proceed.', 'wp-mail-smtp' ); ?>
210
+ </p>
211
+
212
+ <?php
213
+ endif;
214
+ }
215
+
216
+ /**
217
+ * Remove Provider connection.
218
+ *
219
+ * @since 1.3.0
220
+ */
221
+ public function process_provider_remove() {
222
+
223
+ if ( ! is_super_admin() ) {
224
+ return;
225
+ }
226
+
227
+ if (
228
+ ! isset( $_GET['gmail_remove_nonce'] ) ||
229
+ ! wp_verify_nonce( $_GET['gmail_remove_nonce'], 'gmail_remove' ) // phpcs:ignore
230
+ ) {
231
+ return;
232
+ }
233
+
234
+ $options = new \WPMailSMTP\Options();
235
+
236
+ if ( $options->get( 'mail', 'mailer' ) !== $this->get_slug() ) {
237
+ return;
238
+ }
239
+
240
+ $old_opt = $options->get_all();
241
+
242
+ foreach ( $old_opt[ $this->get_slug() ] as $key => $value ) {
243
+ // Unset everything except Client ID and Secret.
244
+ if ( ! in_array( $key, array( 'client_id', 'client_secret' ), true ) ) {
245
+ unset( $old_opt[ $this->get_slug() ][ $key ] );
246
+ }
247
+ }
248
+
249
+ $options->set( $old_opt );
250
+ }
251
+ }
src/Providers/Loader.php CHANGED
@@ -3,7 +3,7 @@
3
  namespace WPMailSMTP\Providers;
4
 
5
  use WPMailSMTP\Debug;
6
- use WPMailSMTP\MailCatcher;
7
  use WPMailSMTP\Options;
8
 
9
  /**
@@ -39,7 +39,7 @@ class Loader {
39
  /**
40
  * @since 1.0.0
41
  *
42
- * @var MailCatcher
43
  */
44
  private $phpmailer;
45
 
@@ -132,17 +132,14 @@ class Loader {
132
  *
133
  * @since 1.0.0
134
  *
135
- * @param string $provider The provider name.
136
- * @param MailCatcher|\PHPMailer $phpmailer The MailCatcher object.
137
  *
138
  * @return MailerAbstract|null
139
  */
140
  public function get_mailer( $provider, $phpmailer ) {
141
 
142
- if (
143
- $phpmailer instanceof MailCatcher ||
144
- $phpmailer instanceof \PHPMailer
145
- ) {
146
  $this->phpmailer = $phpmailer;
147
  }
148
 
3
  namespace WPMailSMTP\Providers;
4
 
5
  use WPMailSMTP\Debug;
6
+ use WPMailSMTP\MailCatcherInterface;
7
  use WPMailSMTP\Options;
8
 
9
  /**
39
  /**
40
  * @since 1.0.0
41
  *
42
+ * @var MailCatcherInterface
43
  */
44
  private $phpmailer;
45
 
132
  *
133
  * @since 1.0.0
134
  *
135
+ * @param string $provider The provider name.
136
+ * @param MailCatcherInterface $phpmailer The MailCatcher object.
137
  *
138
  * @return MailerAbstract|null
139
  */
140
  public function get_mailer( $provider, $phpmailer ) {
141
 
142
+ if ( wp_mail_smtp()->is_valid_phpmailer( $phpmailer ) ) {
 
 
 
143
  $this->phpmailer = $phpmailer;
144
  }
145
 
src/Providers/MailerAbstract.php CHANGED
@@ -4,7 +4,7 @@ namespace WPMailSMTP\Providers;
4
 
5
  use WPMailSMTP\Conflicts;
6
  use WPMailSMTP\Debug;
7
- use WPMailSMTP\MailCatcher;
8
  use WPMailSMTP\Options;
9
  use WPMailSMTP\WP;
10
 
@@ -32,7 +32,7 @@ abstract class MailerAbstract implements MailerInterface {
32
  /**
33
  * @since 1.0.0
34
  *
35
- * @var MailCatcher
36
  */
37
  protected $phpmailer;
38
  /**
@@ -74,9 +74,9 @@ abstract class MailerAbstract implements MailerInterface {
74
  *
75
  * @since 1.0.0
76
  *
77
- * @param MailCatcher $phpmailer
78
  */
79
- public function __construct( MailCatcher $phpmailer ) {
80
 
81
  $this->options = new Options();
82
  $this->mailer = $this->options->get( 'mail', 'mailer' );
@@ -94,15 +94,12 @@ abstract class MailerAbstract implements MailerInterface {
94
  *
95
  * @since 1.0.0
96
  *
97
- * @param MailCatcher $phpmailer
98
  */
99
  public function process_phpmailer( $phpmailer ) {
100
 
101
- // Make sure that we have access to MailCatcher class methods.
102
- if (
103
- ! $phpmailer instanceof MailCatcher &&
104
- ! $phpmailer instanceof \PHPMailer
105
- ) {
106
  return;
107
  }
108
 
4
 
5
  use WPMailSMTP\Conflicts;
6
  use WPMailSMTP\Debug;
7
+ use WPMailSMTP\MailCatcherInterface;
8
  use WPMailSMTP\Options;
9
  use WPMailSMTP\WP;
10
 
32
  /**
33
  * @since 1.0.0
34
  *
35
+ * @var MailCatcherInterface
36
  */
37
  protected $phpmailer;
38
  /**
74
  *
75
  * @since 1.0.0
76
  *
77
+ * @param MailCatcherInterface $phpmailer The MailCatcher object.
78
  */
79
+ public function __construct( MailCatcherInterface $phpmailer ) {
80
 
81
  $this->options = new Options();
82
  $this->mailer = $this->options->get( 'mail', 'mailer' );
94
  *
95
  * @since 1.0.0
96
  *
97
+ * @param MailCatcherInterface $phpmailer The MailCatcher object.
98
  */
99
  public function process_phpmailer( $phpmailer ) {
100
 
101
+ // Make sure that we have access to PHPMailer class methods.
102
+ if ( ! wp_mail_smtp()->is_valid_phpmailer( $phpmailer ) ) {
 
 
 
103
  return;
104
  }
105
 
src/Providers/MailerInterface.php CHANGED
@@ -1,83 +1,86 @@
1
- <?php
2
-
3
- namespace WPMailSMTP\Providers;
4
-
5
- /**
6
- * Interface MailerInterface.
7
- *
8
- * @since 1.0.0
9
- */
10
- interface MailerInterface {
11
-
12
- /**
13
- * Send the email.
14
- *
15
- * @since 1.0.0
16
- */
17
- public function send();
18
-
19
- /**
20
- * Whether the email is sent or not.
21
- * We basically check the response code from a request to provider.
22
- * Might not be 100% correct, not guarantees that email is delivered.
23
- *
24
- * @since 1.0.0
25
- *
26
- * @return bool
27
- */
28
- public function is_email_sent();
29
-
30
- /**
31
- * Whether the mailer supports the current PHP version or not.
32
- *
33
- * @since 1.0.0
34
- *
35
- * @return bool
36
- */
37
- public function is_php_compatible();
38
-
39
- /**
40
- * Whether the mailer has all its settings correctly set up and saved.
41
- *
42
- * @since 1.4.0
43
- *
44
- * @return bool
45
- */
46
- public function is_mailer_complete();
47
-
48
- /**
49
- * Get the email body.
50
- *
51
- * @since 1.0.0
52
- *
53
- * @return string|array
54
- */
55
- public function get_body();
56
-
57
- /**
58
- * Get the email headers.
59
- *
60
- * @since 1.0.0
61
- *
62
- * @return array
63
- */
64
- public function get_headers();
65
-
66
- /**
67
- * Get an array of all debug information relevant to the mailer.
68
- *
69
- * @since 1.2.0
70
- *
71
- * @return array
72
- */
73
- public function get_debug_info();
74
-
75
- /**
76
- * Re-use the MailCatcher class methods and properties.
77
- *
78
- * @since 1.2.0
79
- *
80
- * @param \WPMailSMTP\MailCatcher $phpmailer
81
- */
82
- public function process_phpmailer( $phpmailer );
83
- }
 
 
 
1
+ <?php
2
+
3
+ namespace WPMailSMTP\Providers;
4
+
5
+ use WPMailSMTP\MailCatcher;
6
+ use WPMailSMTP\MailCatcherV6;
7
+
8
+ /**
9
+ * Interface MailerInterface.
10
+ *
11
+ * @since 1.0.0
12
+ */
13
+ interface MailerInterface {
14
+
15
+ /**
16
+ * Send the email.
17
+ *
18
+ * @since 1.0.0
19
+ */
20
+ public function send();
21
+
22
+ /**
23
+ * Whether the email is sent or not.
24
+ * We basically check the response code from a request to provider.
25
+ * Might not be 100% correct, not guarantees that email is delivered.
26
+ *
27
+ * @since 1.0.0
28
+ *
29
+ * @return bool
30
+ */
31
+ public function is_email_sent();
32
+
33
+ /**
34
+ * Whether the mailer supports the current PHP version or not.
35
+ *
36
+ * @since 1.0.0
37
+ *
38
+ * @return bool
39
+ */
40
+ public function is_php_compatible();
41
+
42
+ /**
43
+ * Whether the mailer has all its settings correctly set up and saved.
44
+ *
45
+ * @since 1.4.0
46
+ *
47
+ * @return bool
48
+ */
49
+ public function is_mailer_complete();
50
+
51
+ /**
52
+ * Get the email body.
53
+ *
54
+ * @since 1.0.0
55
+ *
56
+ * @return string|array
57
+ */
58
+ public function get_body();
59
+
60
+ /**
61
+ * Get the email headers.
62
+ *
63
+ * @since 1.0.0
64
+ *
65
+ * @return array
66
+ */
67
+ public function get_headers();
68
+
69
+ /**
70
+ * Get an array of all debug information relevant to the mailer.
71
+ *
72
+ * @since 1.2.0
73
+ *
74
+ * @return array
75
+ */
76
+ public function get_debug_info();
77
+
78
+ /**
79
+ * Re-use the MailCatcher class methods and properties.
80
+ *
81
+ * @since 1.2.0
82
+ *
83
+ * @param MailCatcherInterface $phpmailer The MailCatcher object.
84
+ */
85
+ public function process_phpmailer( $phpmailer );
86
+ }
src/Providers/Mailgun/Mailer.php CHANGED
@@ -1,431 +1,466 @@
1
- <?php
2
-
3
- namespace WPMailSMTP\Providers\Mailgun;
4
-
5
- use WPMailSMTP\Providers\MailerAbstract;
6
- use WPMailSMTP\WP;
7
-
8
- /**
9
- * Class Mailer.
10
- *
11
- * @since 1.0.0
12
- */
13
- class Mailer extends MailerAbstract {
14
-
15
- /**
16
- * Which response code from HTTP provider is considered to be successful?
17
- *
18
- * @since 1.0.0
19
- *
20
- * @var int
21
- */
22
- protected $email_sent_code = 200;
23
-
24
- /**
25
- * API endpoint used for sites from all regions.
26
- *
27
- * @since 1.4.0
28
- *
29
- * @var string
30
- */
31
- const API_BASE_US = 'https://api.mailgun.net/v3/';
32
-
33
- /**
34
- * API endpoint used for sites from EU region.
35
- *
36
- * @since 1.4.0
37
- *
38
- * @var string
39
- */
40
- const API_BASE_EU = 'https://api.eu.mailgun.net/v3/';
41
-
42
- /**
43
- * URL to make an API request to.
44
- *
45
- * @since 1.0.0
46
- *
47
- * @var string
48
- */
49
- protected $url = '';
50
-
51
- /**
52
- * @inheritdoc
53
- */
54
- public function __construct( $phpmailer ) {
55
-
56
- // Default value should be defined before the parent class contructor fires.
57
- $this->url = self::API_BASE_US;
58
-
59
- // We want to prefill everything from \WPMailSMTP\MailCatcher class, which extends \PHPMailer.
60
- parent::__construct( $phpmailer );
61
-
62
- // We have a special API URL to query in case of EU region.
63
- if ( 'EU' === $this->options->get( $this->mailer, 'region' ) ) {
64
- $this->url = self::API_BASE_EU;
65
- }
66
-
67
- /*
68
- * Append the url with a domain,
69
- * to avoid passing the domain name as a query parameter with all requests.
70
- */
71
- $this->url .= sanitize_text_field( $this->options->get( $this->mailer, 'domain' ) . '/messages' );
72
-
73
- $this->set_header( 'Authorization', 'Basic ' . base64_encode( 'api:' . $this->options->get( $this->mailer, 'api_key' ) ) );
74
- }
75
-
76
- /**
77
- * @inheritdoc
78
- */
79
- public function set_from( $email, $name = '' ) {
80
-
81
- if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
82
- return;
83
- }
84
-
85
- if ( ! empty( $name ) ) {
86
- $this->set_body_param(
87
- array(
88
- 'from' => $name . ' <' . $email . '>',
89
- )
90
- );
91
- } else {
92
- $this->set_body_param(
93
- array(
94
- 'from' => $email,
95
- )
96
- );
97
- }
98
- }
99
-
100
- /**
101
- * @inheritdoc
102
- */
103
- public function set_recipients( $recipients ) {
104
-
105
- if ( empty( $recipients ) ) {
106
- return;
107
- }
108
-
109
- $default = array( 'to', 'cc', 'bcc' );
110
-
111
- foreach ( $recipients as $kind => $emails ) {
112
- if (
113
- ! in_array( $kind, $default, true ) ||
114
- empty( $emails ) ||
115
- ! is_array( $emails )
116
- ) {
117
- continue;
118
- }
119
-
120
- $data = array();
121
-
122
- foreach ( $emails as $email ) {
123
- $addr = isset( $email[0] ) ? $email[0] : false;
124
- $name = isset( $email[1] ) ? $email[1] : false;
125
-
126
- if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) {
127
- continue;
128
- }
129
-
130
- if ( ! empty( $name ) ) {
131
- $data[] = $name . ' <' . $addr . '>';
132
- } else {
133
- $data[] = $addr;
134
- }
135
- }
136
-
137
- if ( ! empty( $data ) ) {
138
- $this->set_body_param(
139
- array(
140
- $kind => implode( ', ', $data ),
141
- )
142
- );
143
- }
144
- }
145
- }
146
-
147
- /**
148
- * @inheritdoc
149
- */
150
- public function set_content( $content ) {
151
-
152
- if ( is_array( $content ) ) {
153
-
154
- $default = array( 'text', 'html' );
155
-
156
- foreach ( $content as $type => $mail ) {
157
- if (
158
- ! in_array( $type, $default, true ) ||
159
- empty( $mail )
160
- ) {
161
- continue;
162
- }
163
-
164
- $this->set_body_param(
165
- array(
166
- $type => $mail,
167
- )
168
- );
169
- }
170
- } else {
171
-
172
- $type = 'html';
173
-
174
- if ( $this->phpmailer->ContentType === 'text/plain' ) {
175
- $type = 'text';
176
- }
177
-
178
- if ( ! empty( $content ) ) {
179
- $this->set_body_param(
180
- array(
181
- $type => $content,
182
- )
183
- );
184
- }
185
- }
186
- }
187
-
188
- /**
189
- * Redefine the way custom headers are process for this mailer - they should be in body.
190
- *
191
- * @since 1.5.0
192
- *
193
- * @param array $headers
194
- */
195
- public function set_headers( $headers ) {
196
-
197
- foreach ( $headers as $header ) {
198
- $name = isset( $header[0] ) ? $header[0] : false;
199
- $value = isset( $header[1] ) ? $header[1] : false;
200
-
201
- $this->set_body_header( $name, $value );
202
- }
203
-
204
- // Add custom PHPMailer-specific header.
205
- $this->set_body_header( 'X-Mailer', 'WPMailSMTP/Mailer/' . $this->mailer . ' ' . WPMS_PLUGIN_VER );
206
- }
207
-
208
- /**
209
- * This mailer supports email-related custom headers inside a body of the message with a special prefix "h:".
210
- *
211
- * @since 1.5.0
212
- */
213
- public function set_body_header( $name, $value ) {
214
-
215
- $name = sanitize_text_field( $name );
216
-
217
- $this->set_body_param(
218
- array(
219
- 'h:' . $name => WP::sanitize_value( $value ),
220
- )
221
- );
222
- }
223
-
224
- /**
225
- * It's the last one, so we can modify the whole body.
226
- *
227
- * @since 1.0.0
228
- *
229
- * @param array $attachments
230
- */
231
- public function set_attachments( $attachments ) {
232
-
233
- if ( empty( $attachments ) ) {
234
- return;
235
- }
236
-
237
- $payload = '';
238
- $data = array();
239
-
240
- foreach ( $attachments as $attachment ) {
241
- $file = false;
242
-
243
- /*
244
- * We are not using WP_Filesystem API as we can't reliably work with it.
245
- * It is not always available, same as credentials for FTP.
246
- */
247
- try {
248
- if ( is_file( $attachment[0] ) && is_readable( $attachment[0] ) ) {
249
- $file = file_get_contents( $attachment[0] );
250
- }
251
- }
252
- catch ( \Exception $e ) {
253
- $file = false;
254
- }
255
-
256
- if ( $file === false ) {
257
- continue;
258
- }
259
-
260
- $data[] = array(
261
- 'content' => $file,
262
- 'name' => $attachment[2],
263
- );
264
- }
265
-
266
- if ( ! empty( $data ) ) {
267
-
268
- // First, generate a boundary for the multipart message.
269
- $boundary = base_convert( uniqid( 'boundary', true ), 10, 36 );
270
-
271
- // Iterate through pre-built params and build a payload.
272
- foreach ( $this->body as $key => $value ) {
273
- if ( is_array( $value ) ) {
274
- foreach ( $value as $child_key => $child_value ) {
275
- $payload .= '--' . $boundary;
276
- $payload .= "\r\n";
277
- $payload .= 'Content-Disposition: form-data; name="' . $key . "\"\r\n\r\n";
278
- $payload .= $child_value;
279
- $payload .= "\r\n";
280
- }
281
- } else {
282
- $payload .= '--' . $boundary;
283
- $payload .= "\r\n";
284
- $payload .= 'Content-Disposition: form-data; name="' . $key . '"' . "\r\n\r\n";
285
- $payload .= $value;
286
- $payload .= "\r\n";
287
- }
288
- }
289
-
290
- // Now iterate through our attachments, and add them too.
291
- foreach ( $data as $key => $attachment ) {
292
- $payload .= '--' . $boundary;
293
- $payload .= "\r\n";
294
- $payload .= 'Content-Disposition: form-data; name="attachment[' . $key . ']"; filename="' . $attachment['name'] . '"' . "\r\n\r\n";
295
- $payload .= $attachment['content'];
296
- $payload .= "\r\n";
297
- }
298
-
299
- $payload .= '--' . $boundary . '--';
300
-
301
- // Redefine the body the "dirty way".
302
- $this->body = $payload;
303
-
304
- $this->set_header( 'Content-Type', 'multipart/form-data; boundary=' . $boundary );
305
- }
306
- }
307
-
308
- /**
309
- * @inheritdoc
310
- */
311
- public function set_reply_to( $reply_to ) {
312
-
313
- if ( empty( $reply_to ) ) {
314
- return;
315
- }
316
-
317
- $data = array();
318
-
319
- foreach ( $reply_to as $key => $emails ) {
320
- if (
321
- empty( $emails ) ||
322
- ! is_array( $emails )
323
- ) {
324
- continue;
325
- }
326
-
327
- $addr = isset( $emails[0] ) ? $emails[0] : false;
328
- $name = isset( $emails[1] ) ? $emails[1] : false;
329
-
330
- if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) {
331
- continue;
332
- }
333
-
334
- if ( ! empty( $name ) ) {
335
- $data[] = $name . ' <' . $addr . '>';
336
- } else {
337
- $data[] = $addr;
338
- }
339
- }
340
-
341
- if ( ! empty( $data ) ) {
342
- $this->set_body_param(
343
- array(
344
- 'h:Reply-To' => implode( ',', $data ),
345
- )
346
- );
347
- }
348
- }
349
-
350
- /**
351
- * @inheritdoc
352
- */
353
- public function set_return_path( $email ) {
354
-
355
- if (
356
- $this->options->get( 'mail', 'return_path' ) !== true ||
357
- ! filter_var( $email, FILTER_VALIDATE_EMAIL )
358
- ) {
359
- return;
360
- }
361
-
362
- $this->set_body_param(
363
- array(
364
- 'sender' => $email,
365
- )
366
- );
367
- }
368
-
369
- /**
370
- * Get a Mailgun-specific response with a helpful error.
371
- *
372
- * @since 1.2.0
373
- *
374
- * @return string
375
- */
376
- protected function get_response_error() {
377
-
378
- $body = (array) wp_remote_retrieve_body( $this->response );
379
-
380
- $error_text = array();
381
-
382
- if ( ! empty( $body['message'] ) ) {
383
- if ( is_string( $body['message'] ) ) {
384
- $error_text[] = $body['message'];
385
- } else {
386
- $error_text[] = \json_encode( $body['message'] );
387
- }
388
- } elseif ( ! empty( $body[0] ) ) {
389
- if ( is_string( $body[0] ) ) {
390
- $error_text[] = $body[0];
391
- } else {
392
- $error_text[] = \json_encode( $body[0] );
393
- }
394
- }
395
-
396
- return implode( '<br>', array_map( 'esc_textarea', $error_text ) );
397
- }
398
-
399
- /**
400
- * @inheritdoc
401
- */
402
- public function get_debug_info() {
403
-
404
- $mg_text = array();
405
-
406
- $options = new \WPMailSMTP\Options();
407
- $mailgun = $options->get_group( 'mailgun' );
408
-
409
- $mg_text[] = '<strong>Api Key / Domain:</strong> ' . ( ! empty( $mailgun['api_key'] ) && ! empty( $mailgun['domain'] ) ? 'Yes' : 'No' );
410
-
411
- return implode( '<br>', $mg_text );
412
- }
413
-
414
- /**
415
- * @inheritdoc
416
- */
417
- public function is_mailer_complete() {
418
-
419
- $options = $this->options->get_group( $this->mailer );
420
-
421
- // API key is the only required option.
422
- if (
423
- ! empty( $options['api_key'] ) &&
424
- ! empty( $options['domain'] )
425
- ) {
426
- return true;
427
- }
428
-
429
- return false;
430
- }
431
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPMailSMTP\Providers\Mailgun;
4
+
5
+ use WPMailSMTP\Debug;
6
+ use WPMailSMTP\Providers\MailerAbstract;
7
+ use WPMailSMTP\WP;
8
+
9
+ /**
10
+ * Class Mailer.
11
+ *
12
+ * @since 1.0.0
13
+ */
14
+ class Mailer extends MailerAbstract {
15
+
16
+ /**
17
+ * Which response code from HTTP provider is considered to be successful?
18
+ *
19
+ * @since 1.0.0
20
+ *
21
+ * @var int
22
+ */
23
+ protected $email_sent_code = 200;
24
+
25
+ /**
26
+ * API endpoint used for sites from all regions.
27
+ *
28
+ * @since 1.4.0
29
+ *
30
+ * @var string
31
+ */
32
+ const API_BASE_US = 'https://api.mailgun.net/v3/';
33
+
34
+ /**
35
+ * API endpoint used for sites from EU region.
36
+ *
37
+ * @since 1.4.0
38
+ *
39
+ * @var string
40
+ */
41
+ const API_BASE_EU = 'https://api.eu.mailgun.net/v3/';
42
+
43
+ /**
44
+ * URL to make an API request to.
45
+ *
46
+ * @since 1.0.0
47
+ *
48
+ * @var string
49
+ */
50
+ protected $url = '';
51
+
52
+ /**
53
+ * @inheritdoc
54
+ */
55
+ public function __construct( $phpmailer ) {
56
+
57
+ // Default value should be defined before the parent class contructor fires.
58
+ $this->url = self::API_BASE_US;
59
+
60
+ // We want to prefill everything from MailCatcher class, which extends PHPMailer.
61
+ parent::__construct( $phpmailer );
62
+
63
+ // We have a special API URL to query in case of EU region.
64
+ if ( 'EU' === $this->options->get( $this->mailer, 'region' ) ) {
65
+ $this->url = self::API_BASE_EU;
66
+ }
67
+
68
+ /*
69
+ * Append the url with a domain,
70
+ * to avoid passing the domain name as a query parameter with all requests.
71
+ */
72
+ $this->url .= sanitize_text_field( $this->options->get( $this->mailer, 'domain' ) . '/messages' );
73
+
74
+ $this->set_header( 'Authorization', 'Basic ' . base64_encode( 'api:' . $this->options->get( $this->mailer, 'api_key' ) ) );
75
+ }
76
+
77
+ /**
78
+ * @inheritdoc
79
+ */
80
+ public function set_from( $email, $name = '' ) {
81
+
82
+ if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
83
+ return;
84
+ }
85
+
86
+ if ( ! empty( $name ) ) {
87
+ $this->set_body_param(
88
+ array(
89
+ 'from' => $name . ' <' . $email . '>',
90
+ )
91
+ );
92
+ } else {
93
+ $this->set_body_param(
94
+ array(
95
+ 'from' => $email,
96
+ )
97
+ );
98
+ }
99
+ }
100
+
101
+ /**
102
+ * @inheritdoc
103
+ */
104
+ public function set_recipients( $recipients ) {
105
+
106
+ if ( empty( $recipients ) ) {
107
+ return;
108
+ }
109
+
110
+ $default = array( 'to', 'cc', 'bcc' );
111
+
112
+ foreach ( $recipients as $kind => $emails ) {
113
+ if (
114
+ ! in_array( $kind, $default, true ) ||
115
+ empty( $emails ) ||
116
+ ! is_array( $emails )
117
+ ) {
118
+ continue;
119
+ }
120
+
121
+ $data = array();
122
+
123
+ foreach ( $emails as $email ) {
124
+ $addr = isset( $email[0] ) ? $email[0] : false;
125
+ $name = isset( $email[1] ) ? $email[1] : false;
126
+
127
+ if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) {
128
+ continue;
129
+ }
130
+
131
+ if ( ! empty( $name ) ) {
132
+ $data[] = $name . ' <' . $addr . '>';
133
+ } else {
134
+ $data[] = $addr;
135
+ }
136
+ }
137
+
138
+ if ( ! empty( $data ) ) {
139
+ $this->set_body_param(
140
+ array(
141
+ $kind => implode( ', ', $data ),
142
+ )
143
+ );
144
+ }
145
+ }
146
+ }
147
+
148
+ /**
149
+ * @inheritdoc
150
+ */
151
+ public function set_content( $content ) {
152
+
153
+ if ( is_array( $content ) ) {
154
+
155
+ $default = array( 'text', 'html' );
156
+
157
+ foreach ( $content as $type => $mail ) {
158
+ if (
159
+ ! in_array( $type, $default, true ) ||
160
+ empty( $mail )
161
+ ) {
162
+ continue;
163
+ }
164
+
165
+ $this->set_body_param(
166
+ array(
167
+ $type => $mail,
168
+ )
169
+ );
170
+ }
171
+ } else {
172
+
173
+ $type = 'html';
174
+
175
+ if ( $this->phpmailer->ContentType === 'text/plain' ) {
176
+ $type = 'text';
177
+ }
178
+
179
+ if ( ! empty( $content ) ) {
180
+ $this->set_body_param(
181
+ array(
182
+ $type => $content,
183
+ )
184
+ );
185
+ }
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Redefine the way custom headers are process for this mailer - they should be in body.
191
+ *
192
+ * @since 1.5.0
193
+ *
194
+ * @param array $headers
195
+ */
196
+ public function set_headers( $headers ) {
197
+
198
+ foreach ( $headers as $header ) {
199
+ $name = isset( $header[0] ) ? $header[0] : false;
200
+ $value = isset( $header[1] ) ? $header[1] : false;
201
+
202
+ $this->set_body_header( $name, $value );
203
+ }
204
+
205
+ // Add custom PHPMailer-specific header.
206
+ $this->set_body_header( 'X-Mailer', 'WPMailSMTP/Mailer/' . $this->mailer . ' ' . WPMS_PLUGIN_VER );
207
+ }
208
+
209
+ /**
210
+ * This mailer supports email-related custom headers inside a body of the message with a special prefix "h:".
211
+ *
212
+ * @since 1.5.0
213
+ */
214
+ public function set_body_header( $name, $value ) {
215
+
216
+ $name = sanitize_text_field( $name );
217
+
218
+ $this->set_body_param(
219
+ array(
220
+ 'h:' . $name => WP::sanitize_value( $value ),
221
+ )
222
+ );
223
+ }
224
+
225
+ /**
226
+ * It's the last one, so we can modify the whole body.
227
+ *
228
+ * @since 1.0.0
229
+ *
230
+ * @param array $attachments
231
+ */
232
+ public function set_attachments( $attachments ) {
233
+
234
+ if ( empty( $attachments ) ) {
235
+ return;
236
+ }
237
+
238
+ $payload = '';
239
+ $data = array();
240
+
241
+ foreach ( $attachments as $attachment ) {
242
+ $file = false;
243
+
244
+ /*
245
+ * We are not using WP_Filesystem API as we can't reliably work with it.
246
+ * It is not always available, same as credentials for FTP.
247
+ */
248
+ try {
249
+ if ( is_file( $attachment[0] ) && is_readable( $attachment[0] ) ) {
250
+ $file = file_get_contents( $attachment[0] );
251
+ }
252
+ }
253
+ catch ( \Exception $e ) {
254
+ $file = false;
255
+ }
256
+
257
+ if ( $file === false ) {
258
+ continue;
259
+ }
260
+
261
+ $data[] = array(
262
+ 'content' => $file,
263
+ 'name' => $attachment[2],
264
+ );
265
+ }
266
+
267
+ if ( ! empty( $data ) ) {
268
+
269
+ // First, generate a boundary for the multipart message.
270
+ $boundary = base_convert( uniqid( 'boundary', true ), 10, 36 );
271
+
272
+ // Iterate through pre-built params and build a payload.
273
+ foreach ( $this->body as $key => $value ) {
274
+ if ( is_array( $value ) ) {
275
+ foreach ( $value as $child_key => $child_value ) {
276
+ $payload .= '--' . $boundary;
277
+ $payload .= "\r\n";
278
+ $payload .= 'Content-Disposition: form-data; name="' . $key . "\"\r\n\r\n";
279
+ $payload .= $child_value;
280
+ $payload .= "\r\n";
281
+ }
282
+ } else {
283
+ $payload .= '--' . $boundary;
284
+ $payload .= "\r\n";
285
+ $payload .= 'Content-Disposition: form-data; name="' . $key . '"' . "\r\n\r\n";
286
+ $payload .= $value;
287
+ $payload .= "\r\n";
288
+ }
289
+ }
290
+
291
+ // Now iterate through our attachments, and add them too.
292
+ foreach ( $data as $key => $attachment ) {
293
+ $payload .= '--' . $boundary;
294
+ $payload .= "\r\n";
295
+ $payload .= 'Content-Disposition: form-data; name="attachment[' . $key . ']"; filename="' . $attachment['name'] . '"' . "\r\n\r\n";
296
+ $payload .= $attachment['content'];
297
+ $payload .= "\r\n";
298
+ }
299
+
300
+ $payload .= '--' . $boundary . '--';
301
+
302
+ // Redefine the body the "dirty way".
303
+ $this->body = $payload;
304
+
305
+ $this->set_header( 'Content-Type', 'multipart/form-data; boundary=' . $boundary );
306
+ }
307
+ }
308
+
309
+ /**
310
+ * @inheritdoc
311
+ */
312
+ public function set_reply_to( $reply_to ) {
313
+
314
+ if ( empty( $reply_to ) ) {
315
+ return;
316
+ }
317
+
318
+ $data = array();
319
+
320
+ foreach ( $reply_to as $key => $emails ) {
321
+ if (
322
+ empty( $emails ) ||
323
+ ! is_array( $emails )
324
+ ) {
325
+ continue;
326
+ }
327
+
328
+ $addr = isset( $emails[0] ) ? $emails[0] : false;
329
+ $name = isset( $emails[1] ) ? $emails[1] : false;
330
+
331
+ if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) {
332
+ continue;
333
+ }
334
+
335
+ if ( ! empty( $name ) ) {
336
+ $data[] = $name . ' <' . $addr . '>';
337
+ } else {
338
+ $data[] = $addr;
339
+ }
340
+ }
341
+
342
+ if ( ! empty( $data ) ) {
343
+ $this->set_body_param(
344
+ array(
345
+ 'h:Reply-To' => implode( ',', $data ),
346
+ )
347
+ );
348
+ }
349
+ }
350
+
351
+ /**
352
+ * @inheritdoc
353
+ */
354
+ public function set_return_path( $email ) {
355
+
356
+ if (
357
+ $this->options->get( 'mail', 'return_path' ) !== true ||
358
+ ! filter_var( $email, FILTER_VALIDATE_EMAIL )
359
+ ) {
360
+ return;
361
+ }
362
+
363
+ $this->set_body_param(
364
+ array(
365
+ 'sender' => $email,
366
+ )
367
+ );
368
+ }
369
+
370
+ /**
371
+ * Whether the email is sent or not.
372
+ * We basically check the response code from a request to provider.
373
+ * Might not be 100% correct, not guarantees that email is delivered.
374
+ *
375
+ * In Mailgun's case it looks like we have to check if the response body has the message ID.
376
+ * All successful API responses should have `id` key in the response body.
377
+ *
378
+ * @since 2.2.0
379
+ *
380
+ * @return bool
381
+ */
382
+ public function is_email_sent() {
383
+
384
+ $is_sent = parent::is_email_sent();
385
+
386
+ if (
387
+ $is_sent &&
388
+ isset( $this->response['body'] ) &&
389
+ ! array_key_exists( 'id', (array) $this->response['body'] )
390
+ ) {
391
+ $message = 'Mailer: Mailgun' . PHP_EOL .
392
+ esc_html__( 'Mailgun API request was successful, but it could not queue the email for delivery.', 'wp-mail-smtp' ) . PHP_EOL .
393
+ esc_html__( 'This could point to an incorrect Domain Name in the plugin settings.', 'wp-mail-smtp' ) . PHP_EOL .
394
+ esc_html__( 'Please check the WP Mail SMTP plugin settings and make sure the Mailgun Domain Name setting is correct.', 'wp-mail-smtp' );
395
+
396
+ Debug::set( $message );
397
+
398
+ return false;
399
+ }
400
+
401
+ return $is_sent;
402
+ }
403
+
404
+ /**
405
+ * Get a Mailgun-specific response with a helpful error.
406
+ *
407
+ * @since 1.2.0
408
+ *
409
+ * @return string
410
+ */
411
+ protected function get_response_error() {
412
+
413
+ $body = (array) wp_remote_retrieve_body( $this->response );
414
+
415
+ $error_text = array();
416
+
417
+ if ( ! empty( $body['message'] ) ) {
418
+ if ( is_string( $body['message'] ) ) {
419
+ $error_text[] = $body['message'];
420
+ } else {
421
+ $error_text[] = \json_encode( $body['message'] );
422
+ }
423
+ } elseif ( ! empty( $body[0] ) ) {
424
+ if ( is_string( $body[0] ) ) {
425
+ $error_text[] = $body[0];
426
+ } else {
427
+ $error_text[] = \json_encode( $body[0] );
428
+ }
429
+ }
430
+
431
+ return implode( '<br>', array_map( 'esc_textarea', $error_text ) );
432
+ }
433
+
434
+ /**
435
+ * @inheritdoc
436
+ */
437
+ public function get_debug_info() {
438
+
439
+ $mg_text = array();
440
+
441
+ $options = new \WPMailSMTP\Options();
442
+ $mailgun = $options->get_group( 'mailgun' );
443
+
444
+ $mg_text[] = '<strong>Api Key / Domain:</strong> ' . ( ! empty( $mailgun['api_key'] ) && ! empty( $mailgun['domain'] ) ? 'Yes' : 'No' );
445
+
446
+ return implode( '<br>', $mg_text );
447
+ }
448
+
449
+ /**
450
+ * @inheritdoc
451
+ */
452
+ public function is_mailer_complete() {
453
+
454
+ $options = $this->options->get_group( $this->mailer );
455
+
456
+ // API key is the only required option.
457
+ if (
458
+ ! empty( $options['api_key'] ) &&
459
+ ! empty( $options['domain'] )
460
+ ) {
461
+ return true;
462
+ }
463
+
464
+ return false;
465
+ }
466
+ }
src/Providers/PepipostAPI/Mailer.php CHANGED
@@ -2,14 +2,16 @@
2
 
3
  namespace WPMailSMTP\Providers\PepipostAPI;
4
 
 
 
5
  use WPMailSMTP\Providers\MailerAbstract;
6
  use WPMailSMTP\WP;
7
 
8
  /**
9
- * Class Mailer is basically a Sendgrid copy-paste, as Pepipost support SG migration.
10
- * In the future we may rewrite the class to use the native Pepipost API.
11
  *
12
- * @since 1.8.0
 
13
  */
14
  class Mailer extends MailerAbstract {
15
 
@@ -26,24 +28,26 @@ class Mailer extends MailerAbstract {
26
  * URL to make an API request to.
27
  *
28
  * @since 1.8.0
 
29
  *
30
  * @var string
31
  */
32
- protected $url = 'https://sgapi.pepipost.com/v3/mail/send';
33
 
34
  /**
35
  * Mailer constructor.
36
  *
37
  * @since 1.8.0
 
38
  *
39
- * @param \WPMailSMTP\MailCatcher $phpmailer
40
  */
41
  public function __construct( $phpmailer ) {
42
 
43
- // We want to prefill everything from \WPMailSMTP\MailCatcher class, which extends \PHPMailer.
44
  parent::__construct( $phpmailer );
45
 
46
- $this->set_header( 'Authorization', 'Bearer ' . $this->options->get( $this->mailer, 'api_key' ) );
47
  $this->set_header( 'content-type', 'application/json' );
48
  }
49
 
@@ -67,6 +71,7 @@ class Mailer extends MailerAbstract {
67
  * Set the FROM header of the email.
68
  *
69
  * @since 1.8.0
 
70
  *
71
  * @param string $email From mail.
72
  * @param string $name From name.
@@ -84,9 +89,9 @@ class Mailer extends MailerAbstract {
84
  }
85
 
86
  $this->set_body_param(
87
- array(
88
  'from' => $from,
89
- )
90
  );
91
  }
92
 
@@ -94,6 +99,7 @@ class Mailer extends MailerAbstract {
94
  * Set the names/emails of people who will receive the email.
95
  *
96
  * @since 1.8.0
 
97
  *
98
  * @param array $recipients List of recipients: cc/bcc/to.
99
  */
@@ -103,62 +109,29 @@ class Mailer extends MailerAbstract {
103
  return;
104
  }
105
 
106
- // Allow for now only these recipient types.
107
- $default = array( 'to', 'cc', 'bcc' );
108
- $data = array();
109
 
110
- foreach ( $recipients as $type => $emails ) {
111
- if (
112
- ! in_array( $type, $default, true ) ||
113
- empty( $emails ) ||
114
- ! is_array( $emails )
115
- ) {
116
- continue;
117
- }
118
-
119
- $data[ $type ] = array();
120
-
121
- // Iterate over all emails for each type.
122
- // There might be multiple cc/to/bcc emails.
123
- foreach ( $emails as $email ) {
124
- $holder = array();
125
- $addr = isset( $email[0] ) ? $email[0] : false;
126
- $name = isset( $email[1] ) ? $email[1] : false;
127
-
128
- if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) {
129
- continue;
130
- }
131
-
132
- $holder['email'] = $addr;
133
- if ( ! empty( $name ) ) {
134
- $holder['name'] = $name;
135
- }
136
-
137
- array_push( $data[ $type ], $holder );
138
- }
139
  }
140
 
141
- if ( ! empty( $data ) ) {
142
- $this->set_body_param(
143
- array(
144
- 'personalizations' => array( $data ),
145
- )
146
- );
147
 
148
- if ( ! empty( $data['bcc'] ) ) {
149
- // Only the 1st BCC email address, ignore the rest - is not supported by Pepipost.
150
- $bcc['mail_settings']['bcc']['email'] = $data['bcc'][0]['email'];
151
- $this->set_body_param(
152
- $bcc
153
- );
154
- }
155
  }
 
 
156
  }
157
 
158
  /**
159
  * Set the email content.
 
160
  *
161
  * @since 1.8.0
 
162
  *
163
  * @param array|string $content Email content.
164
  */
@@ -168,117 +141,100 @@ class Mailer extends MailerAbstract {
168
  return;
169
  }
170
 
171
- if ( is_array( $content ) ) {
172
-
173
- $default = array( 'text', 'html' );
174
- $data = array();
175
-
176
- foreach ( $content as $type => $body ) {
177
- if (
178
- ! in_array( $type, $default, true ) ||
179
- empty( $body )
180
- ) {
181
- continue;
182
- }
183
-
184
- $content_type = 'text/plain';
185
- $content_value = $body;
186
 
187
- if ( $type === 'html' ) {
188
- $content_type = 'text/html';
189
- } else {
190
- $content_value = nl2br( $content_value );
191
- }
192
 
193
- $data[] = array(
194
- 'type' => $content_type,
195
- 'value' => $content_value,
196
- );
197
  }
198
-
199
- $this->set_body_param(
200
- array(
201
- 'content' => $data,
202
- )
203
- );
204
  } else {
205
- $data['type'] = 'text/html';
206
- $data['value'] = $content;
207
 
208
- if ( $this->phpmailer->ContentType === 'text/plain' ) {
209
- $data['type'] = 'text/plain';
210
- $data['value'] = nl2br( $data['value'] );
 
211
  }
212
-
213
- $this->set_body_param(
214
- array(
215
- 'content' => array( $data ),
216
- )
217
- );
218
  }
 
 
 
 
 
 
 
 
 
 
 
219
  }
220
 
221
  /**
222
- * Redefine the way custom headers are processed for this mailer - they should be in body.
223
  *
224
  * @since 1.8.0
 
225
  *
226
- * @param array $headers
227
  */
228
  public function set_headers( $headers ) {
229
 
 
 
230
  foreach ( $headers as $header ) {
231
  $name = isset( $header[0] ) ? $header[0] : false;
232
  $value = isset( $header[1] ) ? $header[1] : false;
233
 
234
- $this->set_body_header( $name, $value );
235
  }
236
 
237
  // Add custom PHPMailer-specific header.
238
- $this->set_body_header( 'X-Mailer', 'WPMailSMTP/Mailer/' . $this->mailer . ' ' . WPMS_PLUGIN_VER );
 
 
 
 
239
  }
240
 
241
  /**
242
- * This mailer supports email-related custom headers inside a body of the message.
 
243
  *
244
  * @since 1.8.0
 
245
  *
246
- * @param string $name
247
- * @param string $value
248
  */
249
- public function set_body_header( $name, $value ) {
250
 
251
- $name = sanitize_text_field( $name );
252
- if ( empty( $name ) ) {
253
  return;
254
  }
255
 
256
- $headers = isset( $this->body['headers'] ) ? (array) $this->body['headers'] : array();
257
-
258
- $headers[ $name ] = WP::sanitize_value( $value );
259
 
260
- $this->set_body_param(
261
- array(
262
- 'headers' => $headers,
263
- )
264
- );
 
 
265
  }
266
 
267
  /**
268
- * Pepipost accepts an array of files content in body, so we will include all files and send.
269
- * Doesn't handle exceeding the limits etc, as this is done and reported by SendGrid API.
270
  *
271
- * @since 1.8.0
 
 
272
  *
273
- * @param array $attachments
274
  */
275
- public function set_attachments( $attachments ) {
276
-
277
- if ( empty( $attachments ) ) {
278
- return;
279
- }
280
 
281
- $data = array();
282
 
283
  foreach ( $attachments as $attachment ) {
284
  $file = false;
@@ -291,8 +247,7 @@ class Mailer extends MailerAbstract {
291
  if ( is_file( $attachment[0] ) && is_readable( $attachment[0] ) ) {
292
  $file = file_get_contents( $attachment[0] ); // phpcs:ignore
293
  }
294
- }
295
- catch ( \Exception $e ) {
296
  $file = false;
297
  }
298
 
@@ -300,27 +255,21 @@ class Mailer extends MailerAbstract {
300
  continue;
301
  }
302
 
303
- $data[] = array(
304
- 'content' => base64_encode( $file ),
305
- 'type' => $attachment[4],
306
- 'filename' => $attachment[2],
307
- 'disposition' => $attachment[6],
308
- );
309
  }
310
 
311
- if ( ! empty( $data ) ) {
312
- $this->set_body_param(
313
- array(
314
- 'attachments' => $data,
315
- )
316
- );
317
- }
318
  }
319
 
320
  /**
321
  * Set the reply-to property of the email.
 
322
  *
323
  * @since 1.8.0
 
324
  *
325
  * @param array $reply_to Name/email for reply-to feature.
326
  */
@@ -330,54 +279,44 @@ class Mailer extends MailerAbstract {
330
  return;
331
  }
332
 
333
- $data = array();
334
 
335
- foreach ( $reply_to as $key => $emails ) {
336
- if (
337
- empty( $emails ) ||
338
- ! is_array( $emails )
339
- ) {
340
- continue;
341
- }
342
-
343
- $addr = isset( $emails[0] ) ? $emails[0] : false;
344
- $name = isset( $emails[1] ) ? $emails[1] : false;
345
 
346
- if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) {
347
- continue;
348
- }
349
 
350
- $data['email'] = $addr;
351
- if ( ! empty( $name ) ) {
352
- $data['name'] = $name;
353
- }
354
  }
355
 
356
- if ( ! empty( $data ) ) {
357
  $this->set_body_param(
358
- array(
359
- 'reply_to' => $data,
360
- )
361
  );
362
  }
363
  }
364
 
365
  /**
366
- * Pepipost doesn't support sender or return_path params.
367
  * So we do nothing.
368
  *
369
  * @since 1.8.0
370
  *
371
- * @param string $from_email
372
  */
373
  public function set_return_path( $from_email ) {}
374
 
375
  /**
376
  * Get a Pepipost-specific response with a helpful error.
377
  *
378
- * @see https://developers.pepipost.com/migration-api/new-subpage/errorcodes
379
  *
380
  * @since 1.8.0
 
381
  *
382
  * @return string
383
  */
@@ -385,27 +324,26 @@ class Mailer extends MailerAbstract {
385
 
386
  $body = (array) wp_remote_retrieve_body( $this->response );
387
 
388
- $error_text = array();
389
-
390
- if ( ! empty( $body['errors'] ) ) {
391
- foreach ( $body['errors'] as $error ) {
392
- if ( property_exists( $error, 'message' ) ) {
393
- // Prepare additional information from SendGrid API.
394
- $extra = '';
395
- if ( property_exists( $error, 'field' ) && ! empty( $error->field ) ) {
396
- $extra .= $error->field . '; ';
397
- }
398
- if ( property_exists( $error, 'help' ) && ! empty( $error->help ) ) {
399
- $extra .= $error->help;
400
- }
401
-
402
- // Assign both the main message and perhaps extra information, if exists.
403
- $error_text[] = $error->message . ( ! empty( $extra ) ? ' - ' . $extra : '' );
404
- }
405
  }
406
  }
407
 
408
- return implode( '<br>', array_map( 'esc_textarea', $error_text ) );
409
  }
410
 
411
  /**
@@ -440,4 +378,98 @@ class Mailer extends MailerAbstract {
440
 
441
  return false;
442
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
443
  }
2
 
3
  namespace WPMailSMTP\Providers\PepipostAPI;
4
 
5
+ use WPMailSMTP\MailCatcherInterface;
6
+ use WPMailSMTP\Options as PluginOptions;
7
  use WPMailSMTP\Providers\MailerAbstract;
8
  use WPMailSMTP\WP;
9
 
10
  /**
11
+ * Pepipost API mailer.
 
12
  *
13
+ * @since 1.8.0 Pepipost - SendGrid migration API.
14
+ * @since 2.2.0 Rewrote this class to use native Pepipost API.
15
  */
16
  class Mailer extends MailerAbstract {
17
 
28
  * URL to make an API request to.
29
  *
30
  * @since 1.8.0
31
+ * @since 2.2.0 Changed the API url to Pepipost API v5.
32
  *
33
  * @var string
34
  */
35
+ protected $url = 'https://api.pepipost.com/v5/mail/send';
36
 
37
  /**
38
  * Mailer constructor.
39
  *
40
  * @since 1.8.0
41
+ * @since 2.2.0 Changed the API key header (API v5 changes).
42
  *
43
+ * @param MailCatcherInterface $phpmailer The MailCatcher instance.
44
  */
45
  public function __construct( $phpmailer ) {
46
 
47
+ // We want to prefill everything from MailCatcher class, which extends PHPMailer.
48
  parent::__construct( $phpmailer );
49
 
50
+ $this->set_header( 'api_key', $this->options->get( $this->mailer, 'api_key' ) );
51
  $this->set_header( 'content-type', 'application/json' );
52
  }
53
 
71
  * Set the FROM header of the email.
72
  *
73
  * @since 1.8.0
74
+ * @since 2.2.0 Changed the attribute names (API v5 changes).
75
  *
76
  * @param string $email From mail.
77
  * @param string $name From name.
89
  }
90
 
91
  $this->set_body_param(
92
+ [
93
  'from' => $from,
94
+ ]
95
  );
96
  }
97
 
99
  * Set the names/emails of people who will receive the email.
100
  *
101
  * @since 1.8.0
102
+ * @since 2.2.0 change the attribute names (API v5 changes).
103
  *
104
  * @param array $recipients List of recipients: cc/bcc/to.
105
  */
109
  return;
110
  }
111
 
112
+ $data = [];
 
 
113
 
114
+ if ( ! empty( $recipients['to'] ) ) {
115
+ $data['to'] = $this->prepare_list_of_to_emails( $recipients['to'] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  }
117
 
118
+ if ( ! empty( $recipients['cc'] ) ) {
119
+ $data['cc'] = $this->prepare_list_of_emails( $recipients['cc'] );
120
+ }
 
 
 
121
 
122
+ if ( ! empty( $recipients['bcc'] ) ) {
123
+ $data['bcc'] = $this->prepare_list_of_emails( $recipients['bcc'] );
 
 
 
 
 
124
  }
125
+
126
+ $this->set_body_personalizations( $data );
127
  }
128
 
129
  /**
130
  * Set the email content.
131
+ * Pepipost API only supports HTML emails, so we have to replace new lines in plain text emails with <br>.
132
  *
133
  * @since 1.8.0
134
+ * @since 2.2.0 Change the way the content is prepared (API v5 changes).
135
  *
136
  * @param array|string $content Email content.
137
  */
141
  return;
142
  }
143
 
144
+ $html = '';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
 
146
+ if ( ! is_array( $content ) ) {
147
+ $html = $content;
 
 
 
148
 
149
+ if ( $this->phpmailer->ContentType === 'text/plain' ) {
150
+ $html = nl2br( $html );
 
 
151
  }
 
 
 
 
 
 
152
  } else {
 
 
153
 
154
+ if ( ! empty( $content['html'] ) ) {
155
+ $html = $content['html'];
156
+ } elseif ( ! empty( $content['text'] ) ) {
157
+ $html = nl2br( $content['text'] );
158
  }
 
 
 
 
 
 
159
  }
160
+
161
+ $this->set_body_param(
162
+ [
163
+ 'content' => [
164
+ [
165
+ 'type' => 'html',
166
+ 'value' => $html,
167
+ ],
168
+ ],
169
+ ]
170
+ );
171
  }
172
 
173
  /**
174
+ * Redefine the way custom headers are processed for this mailer - they should be in body (personalizations).
175
  *
176
  * @since 1.8.0
177
+ * @since 2.2.0 Change the way the headers are processed (API v5 changes).
178
  *
179
+ * @param array $headers The email headers to be applied.
180
  */
181
  public function set_headers( $headers ) {
182
 
183
+ $valid_headers = [];
184
+
185
  foreach ( $headers as $header ) {
186
  $name = isset( $header[0] ) ? $header[0] : false;
187
  $value = isset( $header[1] ) ? $header[1] : false;
188
 
189
+ $valid_headers[ $name ] = WP::sanitize_value( $value );
190
  }
191
 
192
  // Add custom PHPMailer-specific header.
193
+ $valid_headers['X-Mailer'] = WP::sanitize_value( 'WPMailSMTP/Mailer/' . $this->mailer . ' ' . WPMS_PLUGIN_VER );
194
+
195
+ if ( ! empty( $valid_headers ) ) {
196
+ $this->set_body_personalizations( [ 'headers' => $valid_headers ] );
197
+ }
198
  }
199
 
200
  /**
201
+ * Pepipost API accepts an array of files content in body, so we will include all files and send.
202
+ * Doesn't handle exceeding the limits etc, as this will be reported by the API response.
203
  *
204
  * @since 1.8.0
205
+ * @since 2.2.0 Change the way the attachments are processed (API v5 changes).
206
  *
207
+ * @param array $attachments The list of attachments data.
 
208
  */
209
+ public function set_attachments( $attachments ) {
210
 
211
+ if ( empty( $attachments ) ) {
 
212
  return;
213
  }
214
 
215
+ $data = $this->prepare_attachments( $attachments );
 
 
216
 
217
+ if ( ! empty( $data ) ) {
218
+ $this->set_body_param(
219
+ [
220
+ 'attachments' => $data,
221
+ ]
222
+ );
223
+ }
224
  }
225
 
226
  /**
227
+ * Prepare the attachments data for Pepipost API.
 
228
  *
229
+ * @since 2.2.0
230
+ *
231
+ * @param array $attachments Array of attachments.
232
  *
233
+ * @return array
234
  */
235
+ protected function prepare_attachments( $attachments ) {
 
 
 
 
236
 
237
+ $data = [];
238
 
239
  foreach ( $attachments as $attachment ) {
240
  $file = false;
247
  if ( is_file( $attachment[0] ) && is_readable( $attachment[0] ) ) {
248
  $file = file_get_contents( $attachment[0] ); // phpcs:ignore
249
  }
250
+ } catch ( \Exception $e ) {
 
251
  $file = false;
252
  }
253
 
255
  continue;
256
  }
257
 
258
+ $data[] = [
259
+ 'content' => base64_encode( $file ), // phpcs:ignore
260
+ 'name' => $attachment[2],
261
+ ];
 
 
262
  }
263
 
264
+ return $data;
 
 
 
 
 
 
265
  }
266
 
267
  /**
268
  * Set the reply-to property of the email.
269
+ * Pepipost API only supports one reply_to email, so we take the first one and discard the rest.
270
  *
271
  * @since 1.8.0
272
+ * @since 2.2.0 Change the way the reply_to is processed (API v5 changes).
273
  *
274
  * @param array $reply_to Name/email for reply-to feature.
275
  */
279
  return;
280
  }
281
 
282
+ $email_array = array_shift( $reply_to );
283
 
284
+ if ( empty( $email_array[0] ) ) {
285
+ return;
286
+ }
 
 
 
 
 
 
 
287
 
288
+ $email = $email_array[0];
 
 
289
 
290
+ if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
291
+ return;
 
 
292
  }
293
 
294
+ if ( ! empty( $email ) ) {
295
  $this->set_body_param(
296
+ [
297
+ 'reply_to' => $email,
298
+ ]
299
  );
300
  }
301
  }
302
 
303
  /**
304
+ * Pepipost API doesn't support sender or return_path params.
305
  * So we do nothing.
306
  *
307
  * @since 1.8.0
308
  *
309
+ * @param string $from_email The from email address.
310
  */
311
  public function set_return_path( $from_email ) {}
312
 
313
  /**
314
  * Get a Pepipost-specific response with a helpful error.
315
  *
316
+ * @see https://developers.pepipost.com/email-api/email-api/sendemail#responses
317
  *
318
  * @since 1.8.0
319
+ * @since 2.2.0 Change the way the response error message is processed (API v5 changes).
320
  *
321
  * @return string
322
  */
324
 
325
  $body = (array) wp_remote_retrieve_body( $this->response );
326
 
327
+ $error = ! empty( $body['error'] ) ? $body['error'] : '';
328
+ $info = ! empty( $body['info'] ) ? $body['info'] : '';
329
+ $message = '';
330
+
331
+ if ( is_string( $error ) ) {
332
+ $message = $error . ( ( ! empty( $info ) ) ? ' - ' . $info : '' );
333
+ } elseif ( is_array( $error ) ) {
334
+ $message = '';
335
+
336
+ foreach ( $error as $item ) {
337
+ $message .= sprintf(
338
+ '%1$s (%2$s - %3$s)',
339
+ ! empty( $item->description ) ? $item->description : esc_html__( 'General error', 'wp-mail-smtp' ),
340
+ ! empty( $item->message ) ? $item->message : esc_html__( 'Error', 'wp-mail-smtp' ),
341
+ ! empty( $item->field ) ? $item->field : ''
342
+ ) . PHP_EOL;
 
343
  }
344
  }
345
 
346
+ return $message;
347
  }
348
 
349
  /**
378
 
379
  return false;
380
  }
381
+
382
+ /**
383
+ * A special set method for Pepipost API "personalizations" attribute.
384
+ * We are sending one email at a time, so we should set just the first
385
+ * personalization item.
386
+ *
387
+ * Mainly used in set_headers and set_recipients.
388
+ *
389
+ * @see https://developers.pepipost.com/email-api/email-api/sendemail
390
+ *
391
+ * @since 2.2.0
392
+ *
393
+ * @param array $data The personalizations array of data (array of arrays).
394
+ */
395
+ private function set_body_personalizations( $data ) {
396
+
397
+ if ( empty( $data ) ) {
398
+ return;
399
+ }
400
+
401
+ if ( ! empty( $this->body['personalizations'][0] ) ) {
402
+ $this->body['personalizations'][0] = PluginOptions::array_merge_recursive(
403
+ $this->body['personalizations'][0],
404
+ $data
405
+ );
406
+ } else {
407
+ $this->set_body_param(
408
+ [
409
+ 'personalizations' => [
410
+ $data,
411
+ ],
412
+ ]
413
+ );
414
+ }
415
+ }
416
+
417
+ /**
418
+ * Prepare list of emails by filtering valid emails first.
419
+ *
420
+ * @since 2.2.0
421
+ *
422
+ * @param array $items A 2D array of email and name pair items (0 = email, 1 = name).
423
+ *
424
+ * @return array 2D array with 'email' keys.
425
+ */
426
+ private function prepare_list_of_emails( $items ) {
427
+
428
+ $valid_emails = array_filter(
429
+ array_column( $items, 0 ),
430
+ function ( $email ) {
431
+ return filter_var( $email, FILTER_VALIDATE_EMAIL );
432
+ }
433
+ );
434
+
435
+ return array_map(
436
+ function( $email ) {
437
+ return [ 'email' => $email ];
438
+ },
439
+ $valid_emails
440
+ );
441
+ }
442
+
443
+ /**
444
+ * Prepare list of TO emails by filtering valid emails first
445
+ * and returning array of arrays (email, name).
446
+ *
447
+ * @since 2.2.0
448
+ *
449
+ * @param array $items A 2D array of email and name pair items (0 = email, 1 = name).
450
+ *
451
+ * @return array 2D array with 'email' and optional 'name' attributes.
452
+ */
453
+ private function prepare_list_of_to_emails( $items ) {
454
+
455
+ $data = [];
456
+
457
+ foreach ( $items as $item ) {
458
+ $email = filter_var( $item[0], FILTER_VALIDATE_EMAIL );
459
+
460
+ if ( empty( $email ) ) {
461
+ continue;
462
+ }
463
+
464
+ $pair['email'] = $email;
465
+
466
+ if ( ! empty( $item[1] ) ) {
467
+ $pair['name'] = $item[1];
468
+ }
469
+
470
+ $data[] = $pair;
471
+ }
472
+
473
+ return $data;
474
+ }
475
  }
src/Providers/SMTPcom/Mailer.php CHANGED
@@ -2,6 +2,7 @@
2
 
3
  namespace WPMailSMTP\Providers\SMTPcom;
4
 
 
5
  use WPMailSMTP\Providers\MailerAbstract;
6
  use WPMailSMTP\WP;
7
 
@@ -37,11 +38,11 @@ class Mailer extends MailerAbstract {
37
  *
38
  * @since 2.0.0
39
  *
40
- * @param \WPMailSMTP\MailCatcher $phpmailer
41
  */
42
  public function __construct( $phpmailer ) {
43
 
44
- // We want to prefill everything from \WPMailSMTP\MailCatcher class, which extends \PHPMailer.
45
  parent::__construct( $phpmailer );
46
 
47
  // Set mailer specific headers.
2
 
3
  namespace WPMailSMTP\Providers\SMTPcom;
4
 
5
+ use WPMailSMTP\MailCatcherInterface;
6
  use WPMailSMTP\Providers\MailerAbstract;
7
  use WPMailSMTP\WP;
8
 
38
  *
39
  * @since 2.0.0
40
  *
41
+ * @param MailCatcherInterface $phpmailer The MailCatcher object.
42
  */
43
  public function __construct( $phpmailer ) {
44
 
45
+ // We want to prefill everything from MailCatcher class, which extends PHPMailer.
46
  parent::__construct( $phpmailer );
47
 
48
  // Set mailer specific headers.
src/Providers/Sendgrid/Mailer.php CHANGED
@@ -2,6 +2,7 @@
2
 
3
  namespace WPMailSMTP\Providers\Sendgrid;
4
 
 
5
  use WPMailSMTP\Providers\MailerAbstract;
6
  use WPMailSMTP\WP;
7
 
@@ -35,11 +36,11 @@ class Mailer extends MailerAbstract {
35
  *
36
  * @since 1.0.0
37
  *
38
- * @param \WPMailSMTP\MailCatcher $phpmailer
39
  */
40
  public function __construct( $phpmailer ) {
41
 
42
- // We want to prefill everything from \WPMailSMTP\MailCatcher class, which extends \PHPMailer.
43
  parent::__construct( $phpmailer );
44
 
45
  $this->set_header( 'Authorization', 'Bearer ' . $this->options->get( $this->mailer, 'api_key' ) );
2
 
3
  namespace WPMailSMTP\Providers\Sendgrid;
4
 
5
+ use WPMailSMTP\MailCatcherInterface;
6
  use WPMailSMTP\Providers\MailerAbstract;
7
  use WPMailSMTP\WP;
8
 
36
  *
37
  * @since 1.0.0
38
  *
39
+ * @param MailCatcherInterface $phpmailer The MailCatcher object.
40
  */
41
  public function __construct( $phpmailer ) {
42
 
43
+ // We want to prefill everything from MailCatcher class, which extends PHPMailer.
44
  parent::__construct( $phpmailer );
45
 
46
  $this->set_header( 'Authorization', 'Bearer ' . $this->options->get( $this->mailer, 'api_key' ) );
src/Providers/Sendinblue/Mailer.php CHANGED
@@ -1,393 +1,391 @@
1
- <?php
2
-
3
- namespace WPMailSMTP\Providers\Sendinblue;
4
-
5
- use WPMailSMTP\Debug;
6
- use WPMailSMTP\Providers\MailerAbstract;
7
- use WPMailSMTP\WP;
8
-
9
- /**
10
- * Class Mailer.
11
- *
12
- * @since 1.6.0
13
- */
14
- class Mailer extends MailerAbstract {
15
-
16
- /**
17
- * Which response code from HTTP provider is considered to be successful?
18
- *
19
- * @since 1.6.0
20
- *
21
- * @var int
22
- */
23
- protected $email_sent_code = 201;
24
-
25
- /**
26
- * URL to make an API request to.
27
- * Not actually used, because we use a lib to make requests.
28
- *
29
- * @since 1.6.0
30
- *
31
- * @var string
32
- */
33
- protected $url = 'https://api.sendinblue.com/v3';
34
-
35
- /**
36
- * The list of allowed attachment files extensions.
37
- *
38
- * @see https://developers.sendinblue.com/reference#sendTransacEmail_attachment__title
39
- *
40
- * @since 1.6.0
41
- *
42
- * @var array
43
- */
44
- // @formatter:off
45
- protected $allowed_attach_ext = array( 'xlsx', 'xls', 'ods', 'docx', 'docm', 'doc', 'csv', 'pdf', 'txt', 'gif', 'jpg', 'jpeg', 'png', 'tif', 'tiff', 'rtf', 'bmp', 'cgm', 'css', 'shtml', 'html', 'htm', 'zip', 'xml', 'ppt', 'pptx', 'tar', 'ez', 'ics', 'mobi', 'msg', 'pub', 'eps', 'odt', 'mp3', 'm4a', 'm4v', 'wma', 'ogg', 'flac', 'wav', 'aif', 'aifc', 'aiff', 'mp4', 'mov', 'avi', 'mkv', 'mpeg', 'mpg', 'wmv' );
46
- // @formatter:on
47
-
48
- /**
49
- * Mailer constructor.
50
- *
51
- * @since 1.6.0
52
- *
53
- * @param \WPMailSMTP\MailCatcher $phpmailer
54
- */
55
- public function __construct( $phpmailer ) {
56
-
57
- parent::__construct( $phpmailer );
58
-
59
- if ( ! $this->is_php_compatible() ) {
60
- return;
61
- }
62
- }
63
-
64
- /**
65
- * @inheritDoc
66
- *
67
- * @since 1.6.0
68
- */
69
- public function set_header( $name, $value ) {
70
-
71
- $name = sanitize_text_field( $name );
72
-
73
- $this->body['headers'][ $name ] = WP::sanitize_value( $value );
74
- }
75
-
76
- /**
77
- * Set the From information for an email.
78
- *
79
- * @since 1.6.0
80
- *
81
- * @param string $email
82
- * @param string $name
83
- */
84
- public function set_from( $email, $name ) {
85
-
86
- if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
87
- return;
88
- }
89
-
90
- $this->body['sender'] = array(
91
- 'email' => $email,
92
- 'name' => ! empty( $name ) ? WP::sanitize_value( $name ) : '',
93
- );
94
- }
95
-
96
- /**
97
- * Set email recipients: to, cc, bcc.
98
- *
99
- * @since 1.6.0
100
- *
101
- * @param array $recipients
102
- */
103
- public function set_recipients( $recipients ) {
104
-
105
- if ( empty( $recipients ) ) {
106
- return;
107
- }
108
-
109
- // Allow for now only these recipient types.
110
- $default = array( 'to', 'cc', 'bcc' );
111
- $data = array();
112
-
113
- foreach ( $recipients as $type => $emails ) {
114
-
115
- if (
116
- ! in_array( $type, $default, true ) ||
117
- empty( $emails ) ||
118
- ! is_array( $emails )
119
- ) {
120
- continue;
121
- }
122
-
123
- $data[ $type ] = array();
124
-
125
- // Iterate over all emails for each type.
126
- // There might be multiple cc/to/bcc emails.
127
- foreach ( $emails as $email ) {
128
- $holder = array();
129
- $addr = isset( $email[0] ) ? $email[0] : false;
130
- $name = isset( $email[1] ) ? $email[1] : false;
131
-
132
- if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) {
133
- continue;
134
- }
135
-
136
- $holder['email'] = $addr;
137
- if ( ! empty( $name ) ) {
138
- $holder['name'] = $name;
139
- }
140
-
141
- array_push( $data[ $type ], $holder );
142
- }
143
- }
144
-
145
- foreach ( $data as $type => $type_recipients ) {
146
- $this->body[ $type ] = $type_recipients;
147
- }
148
- }
149
-
150
- /**
151
- * @inheritDoc
152
- *
153
- * @since 1.6.0
154
- */
155
- public function set_subject( $subject ) {
156
-
157
- $this->body['subject'] = $subject;
158
- }
159
-
160
- /**
161
- * Set email content.
162
- *
163
- * @since 1.6.0
164
- *
165
- * @param string|array $content
166
- */
167
- public function set_content( $content ) {
168
-
169
- if ( empty( $content ) ) {
170
- return;
171
- }
172
-
173
- if ( is_array( $content ) ) {
174
-
175
- if ( ! empty( $content['text'] ) ) {
176
- $this->body['textContent'] = $content['text'];
177
- }
178
-
179
- if ( ! empty( $content['html'] ) ) {
180
- $this->body['htmlContent'] = $content['html'];
181
- }
182
- } else {
183
- if ( $this->phpmailer->ContentType === 'text/plain' ) {
184
- $this->body['textContent'] = $content;
185
- } else {
186
- $this->body['htmlContent'] = $content;
187
- }
188
- }
189
- }
190
-
191
- /**
192
- * Doesn't support this.
193
- *
194
- * @since 1.6.0
195
- *
196
- * @param string $email
197
- */
198
- public function set_return_path( $email ) {
199
-
200
- }
201
-
202
- /**
203
- * Set the Reply To headers if not set already.
204
- *
205
- * @since 1.6.0
206
- *
207
- * @param array $emails
208
- */
209
- public function set_reply_to( $emails ) {
210
-
211
- if ( empty( $emails ) ) {
212
- return;
213
- }
214
-
215
- $data = array();
216
-
217
- foreach ( $emails as $user ) {
218
- $holder = array();
219
- $addr = isset( $user[0] ) ? $user[0] : false;
220
- $name = isset( $user[1] ) ? $user[1] : false;
221
-
222
- if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) {
223
- continue;
224
- }
225
-
226
- $holder['email'] = $addr;
227
- if ( ! empty( $name ) ) {
228
- $holder['name'] = $name;
229
- }
230
-
231
- $data[] = $holder;
232
- }
233
-
234
- if ( ! empty( $data ) ) {
235
- $this->body['replyTo'] = $data[0];
236
- }
237
- }
238
-
239
- /**
240
- * Set attachments for an email.
241
- *
242
- * @since 1.6.0
243
- *
244
- * @param array $attachments
245
- */
246
- public function set_attachments( $attachments ) {
247
-
248
- if ( empty( $attachments ) ) {
249
- return;
250
- }
251
-
252
- foreach ( $attachments as $attachment ) {
253
- $file = false;
254
-
255
- /*
256
- * We are not using WP_Filesystem API as we can't reliably work with it.
257
- * It is not always available, same as credentials for FTP.
258
- */
259
- try {
260
- if ( is_file( $attachment[0] ) && is_readable( $attachment[0] ) ) {
261
- $ext = pathinfo( $attachment[0], PATHINFO_EXTENSION );
262
-
263
- if ( in_array( $ext, $this->allowed_attach_ext, true ) ) {
264
- $file = file_get_contents( $attachment[0] ); // phpcs:ignore
265
- }
266
- }
267
- }
268
- catch ( \Exception $e ) {
269
- $file = false;
270
- }
271
-
272
- if ( $file === false ) {
273
- continue;
274
- }
275
-
276
- $this->body['attachment'][] = array(
277
- 'name' => $attachment[2],
278
- 'content' => base64_encode( $file ),
279
- );
280
- }
281
- }
282
-
283
- /**
284
- * @inheritDoc
285
- *
286
- * @since 1.6.0
287
- *
288
- * @return \SendinBlue\Client\Model\SendSmtpEmail
289
- */
290
- public function get_body() {
291
-
292
- return new \SendinBlue\Client\Model\SendSmtpEmail( $this->body );
293
- }
294
-
295
- /**
296
- * Use a library to send emails.
297
- *
298
- * @since 1.6.0
299
- */
300
- public function send() {
301
-
302
- try {
303
- $api = new Api();
304
-
305
- $response = $api->get_smtp_client()->sendTransacEmail( $this->get_body() );
306
-
307
- $this->process_response( $response );
308
- }
309
- catch ( \SendinBlue\Client\ApiException $e ) {
310
- $error = json_decode( $e->getResponseBody() );
311
- if ( json_last_error() === JSON_ERROR_NONE ) {
312
- Debug::set(
313
- 'Mailer: Sendinblue' . "\r\n" .
314
- '[' . sanitize_key( $error->code ) . ']: ' . esc_html( $error->message )
315
- );
316
- }
317
- }
318
- catch ( \Exception $e ) {
319
- Debug::set(
320
- 'Mailer: Sendinblue' . "\r\n" .
321
- $e->getMessage()
322
- );
323
-
324
- return;
325
- }
326
- }
327
-
328
- /**
329
- * Save response from the API to use it later.
330
- * All the actually response processing is done in send() method,
331
- * because SendinBlue throws exception if any error occurs.
332
- *
333
- * @since 1.6.0
334
- *
335
- * @param \SendinBlue\Client\Model\CreateSmtpEmail $response
336
- */
337
- protected function process_response( $response ) {
338
-
339
- $this->response = $response;
340
- }
341
-
342
- /**
343
- * Check whether the email was sent.
344
- *
345
- * @since 1.6.0
346
- *
347
- * @return bool
348
- */
349
- public function is_email_sent() {
350
-
351
- $is_sent = false;
352
-
353
- if ( $this->response instanceof \SendinBlue\Client\Model\CreateSmtpEmail ) {
354
- $is_sent = $this->response->valid();
355
- }
356
-
357
- // Clear debug messages if email is successfully sent.
358
- if ( $is_sent ) {
359
- Debug::clear();
360
- }
361
-
362
- return $is_sent;
363
- }
364
-
365
- /**
366
- * @inheritdoc
367
- *
368
- * @since 1.6.0
369
- */
370
- public function get_debug_info() {
371
-
372
- $mailjet_text[] = '<strong>API Key:</strong> ' . ( $this->is_mailer_complete() ? 'Yes' : 'No' );
373
-
374
- return implode( '<br>', $mailjet_text );
375
- }
376
-
377
- /**
378
- * @inheritdoc
379
- *
380
- * @since 1.6.0
381
- */
382
- public function is_mailer_complete() {
383
-
384
- $options = $this->options->get_group( $this->mailer );
385
-
386
- // API key is the only required option.
387
- if ( ! empty( $options['api_key'] ) ) {
388
- return true;
389
- }
390
-
391
- return false;
392
- }
393
- }
1
+ <?php
2
+
3
+ namespace WPMailSMTP\Providers\Sendinblue;
4
+
5
+ use WPMailSMTP\Debug;
6
+ use WPMailSMTP\MailCatcherInterface;
7
+ use WPMailSMTP\Providers\MailerAbstract;
8
+ use WPMailSMTP\WP;
9
+
10
+ /**
11
+ * Class Mailer.
12
+ *
13
+ * @since 1.6.0
14
+ */
15
+ class Mailer extends MailerAbstract {
16
+
17
+ /**
18
+ * Which response code from HTTP provider is considered to be successful?
19
+ *
20
+ * @since 1.6.0
21
+ *
22
+ * @var int
23
+ */
24
+ protected $email_sent_code = 201;
25
+
26
+ /**
27
+ * URL to make an API request to.
28
+ * Not actually used, because we use a lib to make requests.
29
+ *
30
+ * @since 1.6.0
31
+ *
32
+ * @var string
33
+ */
34
+ protected $url = 'https://api.sendinblue.com/v3';
35
+
36
+ /**
37
+ * The list of allowed attachment files extensions.
38
+ *
39
+ * @see https://developers.sendinblue.com/reference#sendTransacEmail_attachment__title
40
+ *
41
+ * @since 1.6.0
42
+ *
43
+ * @var array
44
+ */
45
+ // @formatter:off
46
+ protected $allowed_attach_ext = array( 'xlsx', 'xls', 'ods', 'docx', 'docm', 'doc', 'csv', 'pdf', 'txt', 'gif', 'jpg', 'jpeg', 'png', 'tif', 'tiff', 'rtf', 'bmp', 'cgm', 'css', 'shtml', 'html', 'htm', 'zip', 'xml', 'ppt', 'pptx', 'tar', 'ez', 'ics', 'mobi', 'msg', 'pub', 'eps', 'odt', 'mp3', 'm4a', 'm4v', 'wma', 'ogg', 'flac', 'wav', 'aif', 'aifc', 'aiff', 'mp4', 'mov', 'avi', 'mkv', 'mpeg', 'mpg', 'wmv' );
47
+ // @formatter:on
48
+
49
+ /**
50
+ * Mailer constructor.
51
+ *
52
+ * @since 1.6.0
53
+ *
54
+ * @param MailCatcherInterface $phpmailer The MailCatcher object.
55
+ */
56
+ public function __construct( $phpmailer ) {
57
+
58
+ parent::__construct( $phpmailer );
59
+
60
+ if ( ! $this->is_php_compatible() ) {
61
+ return;
62
+ }
63
+ }
64
+
65
+ /**
66
+ * @inheritDoc
67
+ *
68
+ * @since 1.6.0
69
+ */
70
+ public function set_header( $name, $value ) {
71
+
72
+ $name = sanitize_text_field( $name );
73
+
74
+ $this->body['headers'][ $name ] = WP::sanitize_value( $value );
75
+ }
76
+
77
+ /**
78
+ * Set the From information for an email.
79
+ *
80
+ * @since 1.6.0
81
+ *
82
+ * @param string $email
83
+ * @param string $name
84
+ */
85
+ public function set_from( $email, $name ) {
86
+
87
+ if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
88
+ return;
89
+ }
90
+
91
+ $this->body['sender'] = array(
92
+ 'email' => $email,
93
+ 'name' => ! empty( $name ) ? WP::sanitize_value( $name ) : '',
94
+ );
95
+ }
96
+
97
+ /**
98
+ * Set email recipients: to, cc, bcc.
99
+ *
100
+ * @since 1.6.0
101
+ *
102
+ * @param array $recipients
103
+ */
104
+ public function set_recipients( $recipients ) {
105
+
106
+ if ( empty( $recipients ) ) {
107
+ return;
108
+ }
109
+
110
+ // Allow for now only these recipient types.
111
+ $default = array( 'to', 'cc', 'bcc' );
112
+ $data = array();
113
+
114
+ foreach ( $recipients as $type => $emails ) {
115
+
116
+ if (
117
+ ! in_array( $type, $default, true ) ||
118
+ empty( $emails ) ||
119
+ ! is_array( $emails )
120
+ ) {
121
+ continue;
122
+ }
123
+
124
+ $data[ $type ] = array();
125
+
126
+ // Iterate over all emails for each type.
127
+ // There might be multiple cc/to/bcc emails.
128
+ foreach ( $emails as $email ) {
129
+ $holder = array();
130
+ $addr = isset( $email[0] ) ? $email[0] : false;
131
+ $name = isset( $email[1] ) ? $email[1] : false;
132
+
133
+ if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) {
134
+ continue;
135
+ }
136
+
137
+ $holder['email'] = $addr;
138
+ if ( ! empty( $name ) ) {
139
+ $holder['name'] = $name;
140
+ }
141
+
142
+ array_push( $data[ $type ], $holder );
143
+ }
144
+ }
145
+
146
+ foreach ( $data as $type => $type_recipients ) {
147
+ $this->body[ $type ] = $type_recipients;
148
+ }
149
+ }
150
+
151
+ /**
152
+ * @inheritDoc
153
+ *
154
+ * @since 1.6.0
155
+ */
156
+ public function set_subject( $subject ) {
157
+
158
+ $this->body['subject'] = $subject;
159
+ }
160
+
161
+ /**
162
+ * Set email content.
163
+ *
164
+ * @since 1.6.0
165
+ *
166
+ * @param string|array $content
167
+ */
168
+ public function set_content( $content ) {
169
+
170
+ if ( empty( $content ) ) {
171
+ return;
172
+ }
173
+
174
+ if ( is_array( $content ) ) {
175
+
176
+ if ( ! empty( $content['text'] ) ) {
177
+ $this->body['textContent'] = $content['text'];
178
+ }
179
+
180
+ if ( ! empty( $content['html'] ) ) {
181
+ $this->body['htmlContent'] = $content['html'];
182
+ }
183
+ } else {
184
+ if ( $this->phpmailer->ContentType === 'text/plain' ) {
185
+ $this->body['textContent'] = $content;
186
+ } else {
187
+ $this->body['htmlContent'] = $content;
188
+ }
189
+ }
190
+ }
191
+
192
+ /**
193
+ * Doesn't support this.
194
+ *
195
+ * @since 1.6.0
196
+ *
197
+ * @param string $email
198
+ */
199
+ public function set_return_path( $email ) {
200
+
201
+ }
202
+
203
+ /**
204
+ * Set the Reply To headers if not set already.
205
+ *
206
+ * @since 1.6.0
207
+ *
208
+ * @param array $emails
209
+ */
210
+ public function set_reply_to( $emails ) {
211
+
212
+ if ( empty( $emails ) ) {
213
+ return;
214
+ }
215
+
216
+ $data = array();
217
+
218
+ foreach ( $emails as $user ) {
219
+ $holder = array();
220
+ $addr = isset( $user[0] ) ? $user[0] : false;
221
+ $name = isset( $user[1] ) ? $user[1] : false;
222
+
223
+ if ( ! filter_var( $addr, FILTER_VALIDATE_EMAIL ) ) {
224
+ continue;
225
+ }
226
+
227
+ $holder['email'] = $addr;
228
+ if ( ! empty( $name ) ) {
229
+ $holder['name'] = $name;
230
+ }
231
+
232
+ $data[] = $holder;
233
+ }
234
+
235
+ if ( ! empty( $data ) ) {
236
+ $this->body['replyTo'] = $data[0];
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Set attachments for an email.
242
+ *
243
+ * @since 1.6.0
244
+ *
245
+ * @param array $attachments
246
+ */
247
+ public function set_attachments( $attachments ) {
248
+
249
+ if ( empty( $attachments ) ) {
250
+ return;
251
+ }
252
+
253
+ foreach ( $attachments as $attachment ) {
254
+ $file = false;
255
+
256
+ /*
257
+ * We are not using WP_Filesystem API as we can't reliably work with it.
258
+ * It is not always available, same as credentials for FTP.
259
+ */
260
+ try {
261
+ if ( is_file( $attachment[0] ) && is_readable( $attachment[0] ) ) {
262
+ $ext = pathinfo( $attachment[0], PATHINFO_EXTENSION );
263
+
264
+ if ( in_array( $ext, $this->allowed_attach_ext, true ) ) {
265
+ $file = file_get_contents( $attachment[0] ); // phpcs:ignore
266
+ }
267
+ }
268
+ }
269
+ catch ( \Exception $e ) {
270
+ $file = false;
271
+ }
272
+
273
+ if ( $file === false ) {
274
+ continue;
275
+ }
276
+
277
+ $this->body['attachment'][] = array(
278
+ 'name' => $attachment[2],
279
+ 'content' => base64_encode( $file ),
280
+ );
281
+ }
282
+ }
283
+
284
+ /**
285
+ * @inheritDoc
286
+ *
287
+ * @since 1.6.0
288
+ *
289
+ * @return \SendinBlue\Client\Model\SendSmtpEmail
290
+ */
291
+ public function get_body() {
292
+
293
+ return new \SendinBlue\Client\Model\SendSmtpEmail( $this->body );
294
+ }
295
+
296
+ /**
297
+ * Use a library to send emails.
298
+ *
299
+ * @since 1.6.0
300
+ */
301
+ public function send() {
302
+
303
+ try {
304
+ $api = new Api();
305
+
306
+ $response = $api->get_smtp_client()->sendTransacEmail( $this->get_body() );
307
+
308
+ $this->process_response( $response );
309
+ } catch ( \SendinBlue\Client\ApiException $e ) {
310
+ $error = json_decode( $e->getResponseBody() );
311
+
312
+ if ( json_last_error() === JSON_ERROR_NONE && ! empty( $error ) ) {
313
+ $message = '[' . sanitize_key( $error->code ) . ']: ' . esc_html( $error->message );
314
+ } else {
315
+ $message = $e->getMessage();
316
+ }
317
+
318
+ Debug::set( 'Mailer: Sendinblue' . PHP_EOL . $message );
319
+ } catch ( \Exception $e ) {
320
+ Debug::set( 'Mailer: Sendinblue' . PHP_EOL . $e->getMessage() );
321
+
322
+ return;
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Save response from the API to use it later.
328
+ * All the actually response processing is done in send() method,
329
+ * because SendinBlue throws exception if any error occurs.
330
+ *
331
+ * @since 1.6.0
332
+ *
333
+ * @param \SendinBlue\Client\Model\CreateSmtpEmail $response
334
+ */
335
+ protected function process_response( $response ) {
336
+
337
+ $this->response = $response;
338
+ }
339
+
340
+ /**
341
+ * Check whether the email was sent.
342
+ *
343
+ * @since 1.6.0
344
+ *
345
+ * @return bool
346
+ */
347
+ public function is_email_sent() {
348
+
349
+ $is_sent = false;
350
+
351
+ if ( $this->response instanceof \SendinBlue\Client\Model\CreateSmtpEmail ) {
352
+ $is_sent = $this->response->valid();
353
+ }
354
+
355
+ // Clear debug messages if email is successfully sent.
356
+ if ( $is_sent ) {
357
+ Debug::clear();
358
+ }
359
+
360
+ return $is_sent;
361
+ }
362
+
363
+ /**
364
+ * @inheritdoc
365
+ *
366
+ * @since 1.6.0
367
+ */
368
+ public function get_debug_info() {
369
+
370
+ $mailjet_text[] = '<strong>API Key:</strong> ' . ( $this->is_mailer_complete() ? 'Yes' : 'No' );
371
+
372
+ return implode( '<br>', $mailjet_text );
373
+ }
374
+
375
+ /**
376
+ * @inheritdoc
377
+ *
378
+ * @since 1.6.0
379
+ */
380
+ public function is_mailer_complete() {
381
+
382
+ $options = $this->options->get_group( $this->mailer );
383
+
384
+ // API key is the only required option.
385
+ if ( ! empty( $options['api_key'] ) ) {
386
+ return true;
387
+ }
388
+
389
+ return false;
390
+ }
391
+ }
 
 
src/SiteHealth.php CHANGED
@@ -68,6 +68,11 @@ class SiteHealth {
68
  'test' => array( $this, 'mailer_setup_complete_test' ),
69
  );
70
 
 
 
 
 
 
71
  return $tests;
72
  }
73
 
@@ -84,24 +89,30 @@ class SiteHealth {
84
  public function register_debug_information( $debug_info ) {
85
 
86
  $debug_notices = Debug::get();
 
87
 
88
- $debug_info[ self::DEBUG_INFO_SLUG ] = array(
89
  'label' => $this->get_label(),
90
- 'fields' => array(
91
- 'version' => array(
92
  'label' => esc_html__( 'Version', 'wp-mail-smtp' ),
93
  'value' => WPMS_PLUGIN_VER,
94
- ),
95
- 'license_key_type' => array(
96
  'label' => esc_html__( 'License key type', 'wp-mail-smtp' ),
97
  'value' => wp_mail_smtp()->get_license_type(),
98
- ),
99
- 'debug' => array(
100
  'label' => esc_html__( 'Debug', 'wp-mail-smtp' ),
101
  'value' => ! empty( $debug_notices ) ? implode( '. ', $debug_notices ) : esc_html__( 'No debug notices found.', 'wp-mail-smtp' ),
102
- ),
103
- ),
104
- );
 
 
 
 
 
105
 
106
  return $debug_info;
107
  }
@@ -177,4 +188,75 @@ class SiteHealth {
177
 
178
  return $result;
179
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  }
68
  'test' => array( $this, 'mailer_setup_complete_test' ),
69
  );
70
 
71
+ $tests['direct']['wp_mail_smtp_db_tables_exist'] = array(
72
+ 'label' => esc_html__( 'Do WP Mail SMTP DB tables exist?', 'wp-mail-smtp' ),
73
+ 'test' => [ $this, 'db_tables_test' ],
74
+ );
75
+
76
  return $tests;
77
  }
78
 
89
  public function register_debug_information( $debug_info ) {
90
 
91
  $debug_notices = Debug::get();
92
+ $db_tables = $this->get_db_tables( 'existing' );
93
 
94
+ $debug_info[ self::DEBUG_INFO_SLUG ] = [
95
  'label' => $this->get_label(),
96
+ 'fields' => [
97
+ 'version' => [
98
  'label' => esc_html__( 'Version', 'wp-mail-smtp' ),
99
  'value' => WPMS_PLUGIN_VER,
100
+ ],
101
+ 'license_key_type' => [
102
  'label' => esc_html__( 'License key type', 'wp-mail-smtp' ),
103
  'value' => wp_mail_smtp()->get_license_type(),
104
+ ],
105
+ 'debug' => [
106
  'label' => esc_html__( 'Debug', 'wp-mail-smtp' ),
107
  'value' => ! empty( $debug_notices ) ? implode( '. ', $debug_notices ) : esc_html__( 'No debug notices found.', 'wp-mail-smtp' ),
108
+ ],
109
+ 'db_tables' => [
110
+ 'label' => esc_html__( 'DB tables', 'wp-mail-smtp' ),
111
+ 'value' => ! empty( $db_tables ) ?
112
+ implode( ', ', $db_tables ) : esc_html__( 'No DB tables found.', 'wp-mail-smtp' ),
113
+ ],
114
+ ],
115
+ ];
116
 
117
  return $debug_info;
118
  }
188
 
189
  return $result;
190
  }
191
+
192
+ /**
193
+ * Perform the test for checking if all custom plugin DB tables exist.
194
+ *
195
+ * @since 2.1.2
196
+ *
197
+ * @return array
198
+ */
199
+ public function db_tables_test() {
200
+
201
+ $result = array(
202
+ 'label' => esc_html__( 'WP Mail SMTP DB tables are created', 'wp-mail-smtp' ),
203
+ 'status' => 'good',
204
+ 'badge' => array(
205
+ 'label' => $this->get_label(),
206
+ 'color' => self::BADGE_COLOR,
207
+ ),
208
+ 'description' => esc_html__( 'WP Mail SMTP is using custom database tables for some of its features. In order to work properly, the custom tables should be created, and it looks like they exist in your database.', 'wp-mail-smtp' ),
209
+ 'actions' => '',
210
+ 'test' => 'wp_mail_smtp_db_tables_exist',
211
+ );
212
+
213
+ $missing_tables = $this->get_db_tables( 'missing' );
214
+
215
+ if ( ! empty( $missing_tables ) ) {
216
+ $result['label'] = esc_html__( 'WP Mail SMTP DB tables check has failed', 'wp-mail-smtp' );
217
+ $result['status'] = 'critical';
218
+ $result['badge']['color'] = 'red';
219
+ $result['description'] = sprintf(
220
+ '<p>%s</p><p>%s</p>',
221
+ sprintf( /* translators: %s - the list of missing tables separated by comma. */
222
+ esc_html( _n( 'Missing table: %s', 'Missing tables: %s', count( $missing_tables ), 'wp-mail-smtp' ) ),
223
+ esc_html( implode( ', ', $missing_tables ) )
224
+ ),
225
+ esc_html__( 'WP Mail SMTP is using custom database tables for some of its features. In order to work properly, the custom tables should be created, and it seems they are missing. Please try to re-install the WP Mail SMTP plugin. If this issue persists, please contact our support.', 'wp-mail-smtp' )
226
+ );
227
+ }
228
+
229
+ return $result;
230
+ }
231
+
232
+ /**
233
+ * Check DB:
234
+ * - if any required plugin DB table is missing,
235
+ * - which of the required plugin DB tables exist.
236
+ *
237
+ * @since 2.1.2
238
+ *
239
+ * @param string $check Which type of tables to return: 'missing' or 'existing'.
240
+ *
241
+ * @return array Missing or existing tables.
242
+ */
243
+ private function get_db_tables( $check = 'missing' ) {
244
+
245
+ global $wpdb;
246
+
247
+ $tables = wp_mail_smtp()->get_custom_db_tables();
248
+
249
+ $missing_tables = [];
250
+ $existing_tables = [];
251
+
252
+ foreach ( $tables as $table ) {
253
+ if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table ) ) !== $table ) { // phpcs:ignore
254
+ $missing_tables[] = $table;
255
+ } else {
256
+ $existing_tables[] = $table;
257
+ }
258
+ }
259
+
260
+ return ( $check === 'existing' ) ? $existing_tables : $missing_tables;
261
+ }
262
  }
src/Tasks/Task.php CHANGED
@@ -195,7 +195,7 @@ class Task {
195
  $this->meta_id = $task_meta->add(
196
  [
197
  'action' => $this->action,
198
- 'data' => $this->params,
199
  ]
200
  );
201
 
195
  $this->meta_id = $task_meta->add(
196
  [
197
  'action' => $this->action,
198
+ 'data' => isset( $this->params ) ? $this->params : [],
199
  ]
200
  );
201
 
src/WP.php CHANGED
@@ -238,4 +238,63 @@ class WP {
238
 
239
  return $filtered;
240
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241
  }
238
 
239
  return $filtered;
240
  }
241
+
242
+ /**
243
+ * Get default email address.
244
+ *
245
+ * This is the same code as used in WP core for getting the default email address.
246
+ *
247
+ * @see https://github.com/WordPress/WordPress/blob/master/wp-includes/pluggable.php#L332
248
+ *
249
+ * @since 2.2.0
250
+ *
251
+ * @return string
252
+ */
253
+ public static function get_default_email() {
254
+
255
+ $sitename = strtolower( $_SERVER['SERVER_NAME'] ); // phpcs:ignore
256
+
257
+ if ( 'www.' === substr( $sitename, 0, 4 ) ) {
258
+ $sitename = substr( $sitename, 4 );
259
+ }
260
+
261
+ return 'wordpress@' . $sitename;
262
+ }
263
+
264
+ /**
265
+ * Wrapper for the WP `admin_url` method that should be used in the plugin.
266
+ *
267
+ * We can filter into it, to maybe call `network_admin_url` for multisite support.
268
+ *
269
+ * @since 2.2.0
270
+ *
271
+ * @param string $path Optional path relative to the admin URL.
272
+ * @param string $scheme The scheme to use. Default is 'admin', which obeys force_ssl_admin() and is_ssl().
273
+ * 'http' or 'https' can be passed to force those schemes.
274
+ *
275
+ * @return string Admin URL link with optional path appended.
276
+ */
277
+ public static function admin_url( $path = '', $scheme = 'admin' ) {
278
+
279
+ return apply_filters( 'wp_mail_smtp_admin_url', \admin_url( $path, $scheme ), $path, $scheme );
280
+ }
281
+
282
+ /**
283
+ * Check if the global plugin option in a multisite should be used.
284
+ * If the global plugin option "multisite" is set and true.
285
+ *
286
+ * @since 2.2.0
287
+ *
288
+ * @return bool
289
+ */
290
+ public static function use_global_plugin_settings() {
291
+
292
+ if ( ! is_multisite() ) {
293
+ return false;
294
+ }
295
+
296
+ $main_site_options = get_blog_option( get_main_site_id(), Options::META_KEY, [] );
297
+
298
+ return ! empty( $main_site_options['general']['network_wide'] );
299
+ }
300
  }
uninstall.php CHANGED
@@ -12,17 +12,14 @@ if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
12
 
13
  // Load plugin file.
14
  require_once 'wp_mail_smtp.php';
 
15
 
16
- // Confirm user has decided to remove all data, otherwise stop.
17
- $settings = get_option( 'wp_mail_smtp', array() );
18
- if ( empty( $settings['general']['uninstall'] ) ) {
19
- return;
20
- }
21
 
22
  /*
23
  * Remove Legacy options.
24
  */
25
- $options = array(
26
  '_amn_smtp_last_checked',
27
  'pepipost_ssl',
28
  'pepipost_port',
@@ -38,62 +35,145 @@ $options = array(
38
  'mailer',
39
  'mail_from_name',
40
  'mail_from',
41
- );
42
 
43
- foreach ( $options as $option ) {
44
- delete_option( $option );
45
- }
 
 
 
 
 
 
46
 
47
- global $wpdb;
 
 
 
 
48
 
49
- // Delete plugin settings.
50
- $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'wp\_mail\_smtp%'" );
51
 
52
- // Delete plugin user meta.
53
- $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE 'wp\_mail\_smtp\_%'" );
54
 
55
- // Remove any transients we've left behind.
56
- $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_transient\_wp\_mail\_smtp\_%'" );
57
- $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_site\_transient\_wp\_mail\_smtp\_%'" );
58
- $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_transient\_timeout\_wp\_mail\_smtp\_%'" );
59
- $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_site\_transient\_timeout\_wp\_mail\_smtp\_%'" );
 
 
60
 
61
- /*
62
- * Remove product announcements.
63
- */
64
- $announcements = get_posts(
65
- array(
66
- 'post_type' => array( 'amn_smtp' ),
67
- 'post_status' => 'any',
68
- 'numberposts' => - 1,
69
- 'fields' => 'ids',
70
- )
71
- );
72
- if ( ! empty( $announcements ) ) {
73
- foreach ( $announcements as $announcement ) {
74
- wp_delete_post( $announcement, true );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  }
76
- }
77
 
78
- /*
79
- * Logs for Pro plugin only.
80
- */
81
- if (
82
- function_exists( 'wp_mail_smtp' ) &&
83
- is_readable( wp_mail_smtp()->plugin_path . '/src/Pro/Pro.php' )
84
- ) {
85
- // DB table.
86
- $logs_table = \WPMailSMTP\Pro\Emails\Logs\Logs::get_table_name();
87
- $wpdb->query( "DROP TABLE IF EXISTS $logs_table;" ); // phpcs:ignore WordPress.DB
88
- }
89
 
90
- /*
91
- * Drop all Action Scheduler data.
92
- */
93
- require_once dirname( __FILE__ ) . '/vendor/woocommerce/action-scheduler/action-scheduler.php';
 
 
 
 
 
 
 
 
94
 
95
- // Unschedule all plugin ActionScheduler actions.
96
- ( new \WPMailSMTP\Tasks\Tasks() )->cancel_all();
 
 
 
 
 
 
 
 
 
 
 
 
 
97
 
98
- $meta_table = \WPMailSMTP\Tasks\Meta::get_table_name();
99
- $wpdb->query( "DROP TABLE IF EXISTS $meta_table;" ); // phpcs:ignore WordPress.DB
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  // Load plugin file.
14
  require_once 'wp_mail_smtp.php';
15
+ require_once dirname( __FILE__ ) . '/vendor/woocommerce/action-scheduler/action-scheduler.php';
16
 
17
+ global $wpdb;
 
 
 
 
18
 
19
  /*
20
  * Remove Legacy options.
21
  */
22
+ $options = [
23
  '_amn_smtp_last_checked',
24
  'pepipost_ssl',
25
  'pepipost_port',
35
  'mailer',
36
  'mail_from_name',
37
  'mail_from',
38
+ ];
39
 
40
+ /**
41
+ * Remove AM announcement posts.
42
+ */
43
+ $am_announcement_params = [
44
+ 'post_type' => [ 'amn_smtp' ],
45
+ 'post_status' => 'any',
46
+ 'numberposts' => - 1,
47
+ 'fields' => 'ids',
48
+ ];
49
 
50
+ // WP MS uninstall process.
51
+ if ( is_multisite() ) {
52
+ $main_site_settings = get_blog_option( get_main_site_id(), 'wp_mail_smtp', [] );
53
+ $network_wide = ! empty( $main_site_settings['general']['network_wide'] );
54
+ $network_uninstall = ! empty( $main_site_settings['general']['uninstall'] );
55
 
56
+ $sites = get_sites();
 
57
 
58
+ foreach ( $sites as $site ) {
59
+ $settings = get_blog_option( $site->blog_id, 'wp_mail_smtp', [] );
60
 
61
+ // Confirm network site admin has decided to remove all data, otherwise skip.
62
+ if (
63
+ ( $network_wide && ! $network_uninstall ) ||
64
+ ( ! $network_wide && empty( $settings['general']['uninstall'] ) )
65
+ ) {
66
+ continue;
67
+ }
68
 
69
+ /*
70
+ * Delete network site plugin options.
71
+ */
72
+ foreach ( $options as $option ) {
73
+ delete_blog_option( $site->blog_id, $option );
74
+ }
75
+
76
+ // Switch to the current network site.
77
+ switch_to_blog( $site->blog_id );
78
+
79
+ // Delete plugin settings.
80
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'wp\_mail\_smtp%'" ); // phpcs:ignore WordPress.DB
81
+
82
+ // Delete plugin user meta.
83
+ $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE 'wp\_mail\_smtp\_%'" ); // phpcs:ignore WordPress.DB
84
+
85
+ // Remove any transients we've left behind.
86
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_transient\_wp\_mail\_smtp\_%'" ); // phpcs:ignore WordPress.DB
87
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_site\_transient\_wp\_mail\_smtp\_%'" ); // phpcs:ignore WordPress.DB
88
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_transient\_timeout\_wp\_mail\_smtp\_%'" ); // phpcs:ignore WordPress.DB
89
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_site\_transient\_timeout\_wp\_mail\_smtp\_%'" ); // phpcs:ignore WordPress.DB
90
+
91
+ /*
92
+ * Delete network site product announcements.
93
+ */
94
+ $announcements = get_posts( $am_announcement_params );
95
+
96
+ if ( ! empty( $announcements ) ) {
97
+ foreach ( $announcements as $announcement ) {
98
+ wp_delete_post( $announcement, true );
99
+ }
100
+ }
101
+
102
+ /*
103
+ * Delete network site Logs for Pro plugin only.
104
+ */
105
+ if (
106
+ function_exists( 'wp_mail_smtp' ) &&
107
+ is_readable( wp_mail_smtp()->plugin_path . '/src/Pro/Pro.php' )
108
+ ) {
109
+ $table = \WPMailSMTP\Pro\Emails\Logs\Logs::get_table_name();
110
+ $wpdb->query( "DROP TABLE IF EXISTS $table;" ); // phpcs:ignore WordPress.DB
111
+ }
112
+
113
+ /*
114
+ * Drop all Action Scheduler data and unschedule all plugin ActionScheduler actions.
115
+ */
116
+ ( new \WPMailSMTP\Tasks\Tasks() )->cancel_all();
117
+
118
+ $meta_table = \WPMailSMTP\Tasks\Meta::get_table_name();
119
+ $wpdb->query( "DROP TABLE IF EXISTS $meta_table;" ); // phpcs:ignore WordPress.DB
120
+
121
+ // Restore the current network site back to the original one.
122
+ restore_current_blog();
123
  }
124
+ } else { // Non WP MS uninstall process (for normal WP installs).
125
 
126
+ // Confirm user has decided to remove all data, otherwise stop.
127
+ $settings = get_option( 'wp_mail_smtp', [] );
128
+ if ( empty( $settings['general']['uninstall'] ) ) {
129
+ return;
130
+ }
 
 
 
 
 
 
131
 
132
+ /*
133
+ * Delete plugin options.
134
+ */
135
+ foreach ( $options as $option ) {
136
+ delete_option( $option );
137
+ }
138
+
139
+ // Delete plugin settings.
140
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'wp\_mail\_smtp%'" ); // phpcs:ignore WordPress.DB
141
+
142
+ // Delete plugin user meta.
143
+ $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE 'wp\_mail\_smtp\_%'" ); // phpcs:ignore WordPress.DB
144
 
145
+ // Remove any transients we've left behind.
146
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_transient\_wp\_mail\_smtp\_%'" ); // phpcs:ignore WordPress.DB
147
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_site\_transient\_wp\_mail\_smtp\_%'" ); // phpcs:ignore WordPress.DB
148
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_transient\_timeout\_wp\_mail\_smtp\_%'" ); // phpcs:ignore WordPress.DB
149
+ $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_site\_transient\_timeout\_wp\_mail\_smtp\_%'" ); // phpcs:ignore WordPress.DB
150
+
151
+ /*
152
+ * Remove product announcements.
153
+ */
154
+ $announcements = get_posts( $am_announcement_params );
155
+ if ( ! empty( $announcements ) ) {
156
+ foreach ( $announcements as $announcement ) {
157
+ wp_delete_post( $announcement, true );
158
+ }
159
+ }
160
 
161
+ /*
162
+ * Logs for Pro plugin only.
163
+ */
164
+ if (
165
+ function_exists( 'wp_mail_smtp' ) &&
166
+ is_readable( wp_mail_smtp()->plugin_path . '/src/Pro/Pro.php' )
167
+ ) {
168
+ $table = \WPMailSMTP\Pro\Emails\Logs\Logs::get_table_name();
169
+ $wpdb->query( "DROP TABLE IF EXISTS $table;" ); // phpcs:ignore WordPress.DB
170
+ }
171
+
172
+ /*
173
+ * Drop all Action Scheduler data and unschedule all plugin ActionScheduler actions.
174
+ */
175
+ ( new \WPMailSMTP\Tasks\Tasks() )->cancel_all();
176
+
177
+ $meta_table = \WPMailSMTP\Tasks\Meta::get_table_name();
178
+ $wpdb->query( "DROP TABLE IF EXISTS $meta_table;" ); // phpcs:ignore WordPress.DB
179
+ }
vendor/google/auth/src/Credentials/UserRefreshCredentials.php CHANGED
@@ -34,11 +34,6 @@ use Google\Auth\OAuth2;
34
  */
35
  class UserRefreshCredentials extends CredentialsLoader implements GetQuotaProjectInterface
36
  {
37
- const CLOUD_SDK_CLIENT_ID =
38
- '764086051850-6qr4p6gpi6hn506pt8ejuq83di341hur.apps.googleusercontent.com';
39
-
40
- const SUPPRESS_CLOUD_SDK_CREDS_WARNING_ENV = 'SUPPRESS_GCLOUD_CREDS_WARNING';
41
-
42
  /**
43
  * The OAuth2 instance used to conduct authorization.
44
  *
@@ -97,24 +92,6 @@ class UserRefreshCredentials extends CredentialsLoader implements GetQuotaProjec
97
  if (array_key_exists('quota_project', $jsonKey)) {
98
  $this->quotaProject = (string) $jsonKey['quota_project'];
99
  }
100
- if ($jsonKey['client_id'] === self::CLOUD_SDK_CLIENT_ID
101
- && is_null($this->quotaProject)
102
- && getenv(self::SUPPRESS_CLOUD_SDK_CREDS_WARNING_ENV) !== 'true') {
103
- trigger_error(
104
- 'Your application has authenticated using end user credentials '
105
- . 'from Google Cloud SDK. We recommend that most server '
106
- . 'applications use service accounts instead. If your '
107
- . 'application continues to use end user credentials '
108
- . 'from Cloud SDK, you might receive a "quota exceeded" '
109
- . 'or "API not enabled" error. For more information about '
110
- . 'service accounts, see '
111
- . 'https://cloud.google.com/docs/authentication/. '
112
- . 'To disable this warning, set '
113
- . self::SUPPRESS_CLOUD_SDK_CREDS_WARNING_ENV
114
- . ' environment variable to "true".',
115
- E_USER_WARNING
116
- );
117
- }
118
  }
119
 
120
  /**
34
  */
35
  class UserRefreshCredentials extends CredentialsLoader implements GetQuotaProjectInterface
36
  {
 
 
 
 
 
37
  /**
38
  * The OAuth2 instance used to conduct authorization.
39
  *
92
  if (array_key_exists('quota_project', $jsonKey)) {
93
  $this->quotaProject = (string) $jsonKey['quota_project'];
94
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  }
96
 
97
  /**
vendor/google/auth/src/CredentialsLoader.php CHANGED
@@ -20,6 +20,7 @@ namespace Google\Auth;
20
  use Google\Auth\Credentials\InsecureCredentials;
21
  use Google\Auth\Credentials\ServiceAccountCredentials;
22
  use Google\Auth\Credentials\UserRefreshCredentials;
 
23
 
24
  /**
25
  * CredentialsLoader contains the behaviour used to locate and find default
@@ -54,6 +55,24 @@ abstract class CredentialsLoader implements FetchAuthTokenInterface
54
  return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
55
  }
56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  /**
58
  * Load a JSON key from the path specified in the environment.
59
  *
@@ -145,35 +164,30 @@ abstract class CredentialsLoader implements FetchAuthTokenInterface
145
  callable $httpHandler = null,
146
  callable $tokenCallback = null
147
  ) {
148
- $version = \GuzzleHttp\ClientInterface::VERSION;
149
-
150
- switch ($version[0]) {
151
- case '5':
152
- $client = new \GuzzleHttp\Client($httpClientOptions);
153
- $client->setDefaultOption('auth', 'google_auth');
154
- $subscriber = new Subscriber\AuthTokenSubscriber(
155
- $fetcher,
156
- $httpHandler,
157
- $tokenCallback
158
- );
159
- $client->getEmitter()->attach($subscriber);
160
- return $client;
161
- case '6':
162
- $middleware = new Middleware\AuthTokenMiddleware(
163
- $fetcher,
164
- $httpHandler,
165
- $tokenCallback
166
- );
167
- $stack = \GuzzleHttp\HandlerStack::create();
168
- $stack->push($middleware);
169
-
170
- return new \GuzzleHttp\Client([
171
- 'handler' => $stack,
172
- 'auth' => 'google_auth',
173
- ] + $httpClientOptions);
174
- default:
175
- throw new \Exception('Version not supported');
176
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  }
178
 
179
  /**
20
  use Google\Auth\Credentials\InsecureCredentials;
21
  use Google\Auth\Credentials\ServiceAccountCredentials;
22
  use Google\Auth\Credentials\UserRefreshCredentials;
23
+ use GuzzleHttp\ClientInterface;
24
 
25
  /**
26
  * CredentialsLoader contains the behaviour used to locate and find default
55
  return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
56
  }
57
 
58
+ /**
59
+ * Returns the currently available major Guzzle version.
60
+ *
61
+ * @return int
62
+ */
63
+ private static function getGuzzleMajorVersion()
64
+ {
65
+ if (defined('GuzzleHttp\ClientInterface::MAJOR_VERSION')) {
66
+ return ClientInterface::MAJOR_VERSION;
67
+ }
68
+
69
+ if (defined('GuzzleHttp\ClientInterface::VERSION')) {
70
+ return (int) substr(ClientInterface::VERSION, 0, 1);
71
+ }
72
+
73
+ throw new \Exception('Version not supported');
74
+ }
75
+
76
  /**
77
  * Load a JSON key from the path specified in the environment.
78
  *
164
  callable $httpHandler = null,
165
  callable $tokenCallback = null
166
  ) {
167
+ if (self::getGuzzleMajorVersion() === 5) {
168
+ $client = new \GuzzleHttp\Client($httpClientOptions);
169
+ $client->setDefaultOption('auth', 'google_auth');
170
+ $subscriber = new Subscriber\AuthTokenSubscriber(
171
+ $fetcher,
172
+ $httpHandler,
173
+ $tokenCallback
174
+ );
175
+ $client->getEmitter()->attach($subscriber);
176
+ return $client;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  }
178
+
179
+ $middleware = new Middleware\AuthTokenMiddleware(
180
+ $fetcher,
181
+ $httpHandler,
182
+ $tokenCallback
183
+ );
184
+ $stack = \GuzzleHttp\HandlerStack::create();
185
+ $stack->push($middleware);
186
+
187
+ return new \GuzzleHttp\Client([
188
+ 'handler' => $stack,
189
+ 'auth' => 'google_auth',
190
+ ] + $httpClientOptions);
191
  }
192
 
193
  /**
vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php CHANGED
@@ -1,5 +1,19 @@
1
  <?php
2
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  namespace Google\Auth\HttpHandler;
4
 
5
  use GuzzleHttp\ClientInterface;
1
  <?php
2
+ /**
3
+ * Copyright 2015 Google Inc. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
  namespace Google\Auth\HttpHandler;
18
 
19
  use GuzzleHttp\ClientInterface;
vendor/google/auth/src/HttpHandler/Guzzle7HttpHandler.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright 2020 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ namespace Google\Auth\HttpHandler;
18
+
19
+ class Guzzle7HttpHandler extends Guzzle6HttpHandler
20
+ {
21
+ }
vendor/google/auth/src/HttpHandler/HttpHandlerFactory.php CHANGED
@@ -25,19 +25,27 @@ class HttpHandlerFactory
25
  * Builds out a default http handler for the installed version of guzzle.
26
  *
27
  * @param ClientInterface $client
28
- * @return Guzzle5HttpHandler|Guzzle6HttpHandler
29
  * @throws \Exception
30
  */
31
  public static function build(ClientInterface $client = null)
32
  {
33
- $version = ClientInterface::VERSION;
34
  $client = $client ?: new Client();
35
 
36
- switch ($version[0]) {
37
- case '5':
 
 
 
 
 
 
 
38
  return new Guzzle5HttpHandler($client);
39
- case '6':
40
  return new Guzzle6HttpHandler($client);
 
 
41
  default:
42
  throw new \Exception('Version not supported');
43
  }
25
  * Builds out a default http handler for the installed version of guzzle.
26
  *
27
  * @param ClientInterface $client
28
+ * @return Guzzle5HttpHandler|Guzzle6HttpHandler|Guzzle7HttpHandler
29
  * @throws \Exception
30
  */
31
  public static function build(ClientInterface $client = null)
32
  {
 
33
  $client = $client ?: new Client();
34
 
35
+ $version = null;
36
+ if (defined('GuzzleHttp\ClientInterface::MAJOR_VERSION')) {
37
+ $version = ClientInterface::MAJOR_VERSION;
38
+ } elseif (defined('GuzzleHttp\ClientInterface::VERSION')) {
39
+ $version = (int) substr(ClientInterface::VERSION, 0, 1);
40
+ }
41
+
42
+ switch ($version) {
43
+ case 5:
44
  return new Guzzle5HttpHandler($client);
45
+ case 6:
46
  return new Guzzle6HttpHandler($client);
47
+ case 7:
48
+ return new Guzzle7HttpHandler($client);
49
  default:
50
  throw new \Exception('Version not supported');
51
  }
vendor/guzzlehttp/guzzle/src/ClientInterface.php CHANGED
@@ -15,7 +15,7 @@ interface ClientInterface
15
  /**
16
  * @deprecated Will be removed in Guzzle 7.0.0
17
  */
18
- const VERSION = '6.5.4';
19
 
20
  /**
21
  * Send an HTTP request.
15
  /**
16
  * @deprecated Will be removed in Guzzle 7.0.0
17
  */
18
+ const VERSION = '6.5.5';
19
 
20
  /**
21
  * Send an HTTP request.
vendor/guzzlehttp/guzzle/src/Utils.php CHANGED
@@ -81,9 +81,12 @@ final class Utils
81
  }
82
 
83
  /*
84
- * The Idn class is marked as @internal. We've locked the version to
85
- * symfony/polyfill-intl-idn to avoid issues in the future.
86
  */
87
- return Idn::idn_to_ascii($domain, $options, Idn::INTL_IDNA_VARIANT_UTS46, $info);
 
 
 
 
88
  }
89
  }
81
  }
82
 
83
  /*
84
+ * The Idn class is marked as @internal. Verify that class and method exists.
 
85
  */
86
+ if (method_exists(Idn::class, 'idn_to_ascii')) {
87
+ return Idn::idn_to_ascii($domain, $options, Idn::INTL_IDNA_VARIANT_UTS46, $info);
88
+ }
89
+
90
+ throw new \RuntimeException('ext-intl or symfony/polyfill-intl-idn not loaded or too old');
91
  }
92
  }
vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- return array(
4
  'A' => 'a',
5
  'B' => 'b',
6
  'C' => 'c',
@@ -510,6 +510,138 @@ return array(
510
  'Ⴥ' => 'ⴥ',
511
  'Ⴧ' => 'ⴧ',
512
  'Ⴭ' => 'ⴭ',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
513
  'Ḁ' => 'ḁ',
514
  'Ḃ' => 'ḃ',
515
  'Ḅ' => 'ḅ',
@@ -993,8 +1125,24 @@ return array(
993
  'Ɜ' => 'ɜ',
994
  'Ɡ' => 'ɡ',
995
  'Ɬ' => 'ɬ',
 
996
  'Ʞ' => 'ʞ',
997
  'Ʇ' => 'ʇ',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
998
  'A' => 'a',
999
  'B' => 'b',
1000
  'C' => 'c',
@@ -1061,6 +1209,93 @@ return array(
1061
  '𐐥' => '𐑍',
1062
  '𐐦' => '𐑎',
1063
  '𐐧' => '𐑏',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1064
  '𑢠' => '𑣀',
1065
  '𑢡' => '𑣁',
1066
  '𑢢' => '𑣂',
@@ -1093,4 +1328,70 @@ return array(
1093
  '𑢽' => '𑣝',
1094
  '𑢾' => '𑣞',
1095
  '𑢿' => '𑣟',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1096
  );
1
  <?php
2
 
3
+ return array (
4
  'A' => 'a',
5
  'B' => 'b',
6
  'C' => 'c',
510
  'Ⴥ' => 'ⴥ',
511
  'Ⴧ' => 'ⴧ',
512
  'Ⴭ' => 'ⴭ',
513
+ 'Ꭰ' => 'ꭰ',
514
+ 'Ꭱ' => 'ꭱ',
515
+ 'Ꭲ' => 'ꭲ',
516
+ 'Ꭳ' => 'ꭳ',
517
+ 'Ꭴ' => 'ꭴ',
518
+ 'Ꭵ' => 'ꭵ',
519
+ 'Ꭶ' => 'ꭶ',
520
+ 'Ꭷ' => 'ꭷ',
521
+ 'Ꭸ' => 'ꭸ',
522
+ 'Ꭹ' => 'ꭹ',
523
+ 'Ꭺ' => 'ꭺ',
524
+ 'Ꭻ' => 'ꭻ',
525
+ 'Ꭼ' => 'ꭼ',
526
+ 'Ꭽ' => 'ꭽ',
527
+ 'Ꭾ' => 'ꭾ',
528
+ 'Ꭿ' => 'ꭿ',
529
+ 'Ꮀ' => 'ꮀ',
530
+ 'Ꮁ' => 'ꮁ',
531
+ 'Ꮂ' => 'ꮂ',
532
+ 'Ꮃ' => 'ꮃ',
533
+ 'Ꮄ' => 'ꮄ',
534
+ 'Ꮅ' => 'ꮅ',
535
+ 'Ꮆ' => 'ꮆ',
536
+ 'Ꮇ' => 'ꮇ',
537
+ 'Ꮈ' => 'ꮈ',
538
+ 'Ꮉ' => 'ꮉ',
539
+ 'Ꮊ' => 'ꮊ',
540
+ 'Ꮋ' => 'ꮋ',
541
+ 'Ꮌ' => 'ꮌ',
542
+ 'Ꮍ' => 'ꮍ',
543
+ 'Ꮎ' => 'ꮎ',
544
+ 'Ꮏ' => 'ꮏ',
545
+ 'Ꮐ' => 'ꮐ',
546
+ 'Ꮑ' => 'ꮑ',
547
+ 'Ꮒ' => 'ꮒ',
548
+ 'Ꮓ' => 'ꮓ',
549
+ 'Ꮔ' => 'ꮔ',
550
+ 'Ꮕ' => 'ꮕ',
551
+ 'Ꮖ' => 'ꮖ',
552
+ 'Ꮗ' => 'ꮗ',
553
+ 'Ꮘ' => 'ꮘ',
554
+ 'Ꮙ' => 'ꮙ',
555
+ 'Ꮚ' => 'ꮚ',
556
+ 'Ꮛ' => 'ꮛ',
557
+ 'Ꮜ' => 'ꮜ',
558
+ 'Ꮝ' => 'ꮝ',
559
+ 'Ꮞ' => 'ꮞ',
560
+ 'Ꮟ' => 'ꮟ',
561
+ 'Ꮠ' => 'ꮠ',
562
+ 'Ꮡ' => 'ꮡ',
563
+ 'Ꮢ' => 'ꮢ',
564
+ 'Ꮣ' => 'ꮣ',
565
+ 'Ꮤ' => 'ꮤ',
566
+ 'Ꮥ' => 'ꮥ',
567
+ 'Ꮦ' => 'ꮦ',
568
+ 'Ꮧ' => 'ꮧ',
569
+ 'Ꮨ' => 'ꮨ',
570
+ 'Ꮩ' => 'ꮩ',
571
+ 'Ꮪ' => 'ꮪ',
572
+ 'Ꮫ' => 'ꮫ',
573
+ 'Ꮬ' => 'ꮬ',
574
+ 'Ꮭ' => 'ꮭ',
575
+ 'Ꮮ' => 'ꮮ',
576
+ 'Ꮯ' => 'ꮯ',
577
+ 'Ꮰ' => 'ꮰ',
578
+ 'Ꮱ' => 'ꮱ',
579
+ 'Ꮲ' => 'ꮲ',
580
+ 'Ꮳ' => 'ꮳ',
581
+ 'Ꮴ' => 'ꮴ',
582
+ 'Ꮵ' => 'ꮵ',
583
+ 'Ꮶ' => 'ꮶ',
584
+ 'Ꮷ' => 'ꮷ',
585
+ 'Ꮸ' => 'ꮸ',
586
+ 'Ꮹ' => 'ꮹ',
587
+ 'Ꮺ' => 'ꮺ',
588
+ 'Ꮻ' => 'ꮻ',
589
+ 'Ꮼ' => 'ꮼ',
590
+ 'Ꮽ' => 'ꮽ',
591
+ 'Ꮾ' => 'ꮾ',
592
+ 'Ꮿ' => 'ꮿ',
593
+ 'Ᏸ' => 'ᏸ',
594
+ 'Ᏹ' => 'ᏹ',
595
+ 'Ᏺ' => 'ᏺ',
596
+ 'Ᏻ' => 'ᏻ',
597
+ 'Ᏼ' => 'ᏼ',
598
+ 'Ᏽ' => 'ᏽ',
599
+ 'Ა' => 'ა',
600
+ 'Ბ' => 'ბ',
601
+ 'Გ' => 'გ',
602
+ 'Დ' => 'დ',
603
+ 'Ე' => 'ე',
604
+ 'Ვ' => 'ვ',
605
+ 'Ზ' => 'ზ',
606
+ 'Თ' => 'თ',
607
+ 'Ი' => 'ი',
608
+ 'Კ' => 'კ',
609
+ 'Ლ' => 'ლ',
610
+ 'Მ' => 'მ',
611
+ 'Ნ' => 'ნ',
612
+ 'Ო' => 'ო',
613
+ 'Პ' => 'პ',
614
+ 'Ჟ' => 'ჟ',
615
+ 'Რ' => 'რ',
616
+ 'Ს' => 'ს',
617
+ 'Ტ' => 'ტ',
618
+ 'Უ' => 'უ',
619
+ 'Ფ' => 'ფ',
620
+ 'Ქ' => 'ქ',
621
+ 'Ღ' => 'ღ',
622
+ 'Ყ' => 'ყ',
623
+ 'Შ' => 'შ',
624
+ 'Ჩ' => 'ჩ',
625
+ 'Ც' => 'ც',
626
+ 'Ძ' => 'ძ',
627
+ 'Წ' => 'წ',
628
+ 'Ჭ' => 'ჭ',
629
+ 'Ხ' => 'ხ',
630
+ 'Ჯ' => 'ჯ',
631
+ 'Ჰ' => 'ჰ',
632
+ 'Ჱ' => 'ჱ',
633
+ 'Ჲ' => 'ჲ',
634
+ 'Ჳ' => 'ჳ',
635
+ 'Ჴ' => 'ჴ',
636
+ 'Ჵ' => 'ჵ',
637
+ 'Ჶ' => 'ჶ',
638
+ 'Ჷ' => 'ჷ',
639
+ 'Ჸ' => 'ჸ',
640
+ 'Ჹ' => 'ჹ',
641
+ 'Ჺ' => 'ჺ',
642
+ 'Ჽ' => 'ჽ',
643
+ 'Ჾ' => 'ჾ',
644
+ 'Ჿ' => 'ჿ',
645
  'Ḁ' => 'ḁ',
646
  'Ḃ' => 'ḃ',
647
  'Ḅ' => 'ḅ',
1125
  'Ɜ' => 'ɜ',
1126
  'Ɡ' => 'ɡ',
1127
  'Ɬ' => 'ɬ',
1128
+ 'Ɪ' => 'ɪ',
1129
  'Ʞ' => 'ʞ',
1130
  'Ʇ' => 'ʇ',
1131
+ 'Ʝ' => 'ʝ',
1132
+ 'Ꭓ' => 'ꭓ',
1133
+ 'Ꞵ' => 'ꞵ',
1134
+ 'Ꞷ' => 'ꞷ',
1135
+ 'Ꞹ' => 'ꞹ',
1136
+ 'Ꞻ' => 'ꞻ',
1137
+ 'Ꞽ' => 'ꞽ',
1138
+ 'Ꞿ' => 'ꞿ',
1139
+ 'Ꟃ' => 'ꟃ',
1140
+ 'Ꞔ' => 'ꞔ',
1141
+ 'Ʂ' => 'ʂ',
1142
+ 'Ᶎ' => 'ᶎ',
1143
+ 'Ꟈ' => 'ꟈ',
1144
+ 'Ꟊ' => 'ꟊ',
1145
+ 'Ꟶ' => 'ꟶ',
1146
  'A' => 'a',
1147
  'B' => 'b',
1148
  'C' => 'c',
1209
  '𐐥' => '𐑍',
1210
  '𐐦' => '𐑎',
1211
  '𐐧' => '𐑏',
1212
+ '𐒰' => '𐓘',
1213
+ '𐒱' => '𐓙',
1214
+ '𐒲' => '𐓚',
1215
+ '𐒳' => '𐓛',
1216
+ '𐒴' => '𐓜',
1217
+ '𐒵' => '𐓝',
1218
+ '𐒶' => '𐓞',
1219
+ '𐒷' => '𐓟',
1220
+ '𐒸' => '𐓠',
1221
+ '𐒹' => '𐓡',
1222
+ '𐒺' => '𐓢',
1223
+ '𐒻' => '𐓣',
1224
+ '𐒼' => '𐓤',
1225
+ '𐒽' => '𐓥',
1226
+ '𐒾' => '𐓦',
1227
+ '𐒿' => '𐓧',
1228
+ '𐓀' => '𐓨',
1229
+ '𐓁' => '𐓩',
1230
+ '𐓂' => '𐓪',
1231
+ '𐓃' => '𐓫',
1232
+ '𐓄' => '𐓬',
1233
+ '𐓅' => '𐓭',
1234
+ '𐓆' => '𐓮',
1235
+ '𐓇' => '𐓯',
1236
+ '𐓈' => '𐓰',
1237
+ '𐓉' => '𐓱',
1238
+ '𐓊' => '𐓲',
1239
+ '𐓋' => '𐓳',
1240
+ '𐓌' => '𐓴',
1241
+ '𐓍' => '𐓵',
1242
+ '𐓎' => '𐓶',
1243
+ '𐓏' => '𐓷',
1244
+ '𐓐' => '𐓸',
1245
+ '𐓑' => '𐓹',
1246
+ '𐓒' => '𐓺',
1247
+ '𐓓' => '𐓻',
1248
+ '𐲀' => '𐳀',
1249
+ '𐲁' => '𐳁',
1250
+ '𐲂' => '𐳂',
1251
+ '𐲃' => '𐳃',
1252
+ '𐲄' => '𐳄',
1253
+ '𐲅' => '𐳅',
1254
+ '𐲆' => '𐳆',
1255
+ '𐲇' => '𐳇',
1256
+ '𐲈' => '𐳈',
1257
+ '𐲉' => '𐳉',
1258
+ '𐲊' => '𐳊',
1259
+ '𐲋' => '𐳋',
1260
+ '𐲌' => '𐳌',
1261
+ '𐲍' => '𐳍',
1262
+ '𐲎' => '𐳎',
1263
+ '𐲏' => '𐳏',
1264
+ '𐲐' => '𐳐',
1265
+ '𐲑' => '𐳑',
1266
+ '𐲒' => '𐳒',
1267
+ '𐲓' => '𐳓',
1268
+ '𐲔' => '𐳔',
1269
+ '𐲕' => '𐳕',
1270
+ '𐲖' => '𐳖',
1271
+ '𐲗' => '𐳗',
1272
+ '𐲘' => '𐳘',
1273
+ '𐲙' => '𐳙',
1274
+ '𐲚' => '𐳚',
1275
+ '𐲛' => '𐳛',
1276
+ '𐲜' => '𐳜',
1277
+ '𐲝' => '𐳝',
1278
+ '𐲞' => '𐳞',
1279
+ '𐲟' => '𐳟',
1280
+ '𐲠' => '𐳠',
1281
+ '𐲡' => '𐳡',
1282
+ '𐲢' => '𐳢',
1283
+ '𐲣' => '𐳣',
1284
+ '𐲤' => '𐳤',
1285
+ '𐲥' => '𐳥',
1286
+ '𐲦' => '𐳦',
1287
+ '𐲧' => '𐳧',
1288
+ '𐲨' => '𐳨',
1289
+ '𐲩' => '𐳩',
1290
+ '𐲪' => '𐳪',
1291
+ '𐲫' => '𐳫',
1292
+ '𐲬' => '𐳬',
1293
+ '𐲭' => '𐳭',
1294
+ '𐲮' => '𐳮',
1295
+ '𐲯' => '𐳯',
1296
+ '𐲰' => '𐳰',
1297
+ '𐲱' => '𐳱',
1298
+ '𐲲' => '𐳲',
1299
  '𑢠' => '𑣀',
1300
  '𑢡' => '𑣁',
1301
  '𑢢' => '𑣂',
1328
  '𑢽' => '𑣝',
1329
  '𑢾' => '𑣞',
1330
  '𑢿' => '𑣟',
1331
+ '𖹀' => '𖹠',
1332
+ '𖹁' => '𖹡',
1333
+ '𖹂' => '𖹢',
1334
+ '𖹃' => '𖹣',
1335
+ '𖹄' => '𖹤',
1336
+ '𖹅' => '𖹥',
1337
+ '𖹆' => '𖹦',
1338
+ '𖹇' => '𖹧',
1339
+ '𖹈' => '𖹨',
1340
+ '𖹉' => '𖹩',
1341
+ '𖹊' => '𖹪',
1342
+ '𖹋' => '𖹫',
1343
+ '𖹌' => '𖹬',
1344
+ '𖹍' => '𖹭',
1345
+ '𖹎' => '𖹮',
1346
+ '𖹏' => '𖹯',
1347
+ '𖹐' => '𖹰',
1348
+ '𖹑' => '𖹱',
1349
+ '𖹒' => '𖹲',
1350
+ '𖹓' => '𖹳',
1351
+ '𖹔' => '𖹴',
1352
+ '𖹕' => '𖹵',
1353
+ '𖹖' => '𖹶',
1354
+ '𖹗' => '𖹷',
1355
+ '𖹘' => '𖹸',
1356
+ '𖹙' => '𖹹',
1357
+ '𖹚' => '𖹺',
1358
+ '𖹛' => '𖹻',
1359
+ '𖹜' => '𖹼',
1360
+ '𖹝' => '𖹽',
1361
+ '𖹞' => '𖹾',
1362
+ '𖹟' => '𖹿',
1363
+ '𞤀' => '𞤢',
1364
+ '𞤁' => '𞤣',
1365
+ '𞤂' => '𞤤',
1366
+ '𞤃' => '𞤥',
1367
+ '𞤄' => '𞤦',
1368
+ '𞤅' => '𞤧',
1369
+ '𞤆' => '𞤨',
1370
+ '𞤇' => '𞤩',
1371
+ '𞤈' => '𞤪',
1372
+ '𞤉' => '𞤫',
1373
+ '𞤊' => '𞤬',
1374
+ '𞤋' => '𞤭',
1375
+ '𞤌' => '𞤮',
1376
+ '𞤍' => '𞤯',
1377
+ '𞤎' => '𞤰',
1378
+ '𞤏' => '𞤱',
1379
+ '𞤐' => '𞤲',
1380
+ '𞤑' => '𞤳',
1381
+ '𞤒' => '𞤴',
1382
+ '𞤓' => '𞤵',
1383
+ '𞤔' => '𞤶',
1384
+ '𞤕' => '𞤷',
1385
+ '𞤖' => '𞤸',
1386
+ '𞤗' => '𞤹',
1387
+ '𞤘' => '𞤺',
1388
+ '𞤙' => '𞤻',
1389
+ '𞤚' => '𞤼',
1390
+ '𞤛' => '𞤽',
1391
+ '𞤜' => '𞤾',
1392
+ '𞤝' => '𞤿',
1393
+ '𞤞' => '𞥀',
1394
+ '𞤟' => '𞥁',
1395
+ '𞤠' => '𞥂',
1396
+ '𞤡' => '𞥃',
1397
  );
vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- return array(
4
  'a' => 'A',
5
  'b' => 'B',
6
  'c' => 'C',
@@ -225,6 +225,7 @@ return array(
225
  'ɦ' => 'Ɦ',
226
  'ɨ' => 'Ɨ',
227
  'ɩ' => 'Ɩ',
 
228
  'ɫ' => 'Ɫ',
229
  'ɬ' => 'Ɬ',
230
  'ɯ' => 'Ɯ',
@@ -233,6 +234,7 @@ return array(
233
  'ɵ' => 'Ɵ',
234
  'ɽ' => 'Ɽ',
235
  'ʀ' => 'Ʀ',
 
236
  'ʃ' => 'Ʃ',
237
  'ʇ' => 'Ʇ',
238
  'ʈ' => 'Ʈ',
@@ -241,6 +243,7 @@ return array(
241
  'ʋ' => 'Ʋ',
242
  'ʌ' => 'Ʌ',
243
  'ʒ' => 'Ʒ',
 
244
  'ʞ' => 'Ʞ',
245
  'ͅ' => 'Ι',
246
  'ͱ' => 'Ͱ',
@@ -493,8 +496,70 @@ return array(
493
  'ք' => 'Ք',
494
  'օ' => 'Օ',
495
  'ֆ' => 'Ֆ',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
496
  'ᵹ' => 'Ᵹ',
497
  'ᵽ' => 'Ᵽ',
 
498
  'ḁ' => 'Ḁ',
499
  'ḃ' => 'Ḃ',
500
  'ḅ' => 'Ḅ',
@@ -993,6 +1058,7 @@ return array(
993
  'ꞌ' => 'Ꞌ',
994
  'ꞑ' => 'Ꞑ',
995
  'ꞓ' => 'Ꞓ',
 
996
  'ꞗ' => 'Ꞗ',
997
  'ꞙ' => 'Ꞙ',
998
  'ꞛ' => 'Ꞛ',
@@ -1003,6 +1069,97 @@ return array(
1003
  'ꞥ' => 'Ꞥ',
1004
  'ꞧ' => 'Ꞧ',
1005
  'ꞩ' => 'Ꞩ',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1006
  'a' => 'A',
1007
  'b' => 'B',
1008
  'c' => 'C',
@@ -1069,6 +1226,93 @@ return array(
1069
  '𐑍' => '𐐥',
1070
  '𐑎' => '𐐦',
1071
  '𐑏' => '𐐧',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1072
  '𑣀' => '𑢠',
1073
  '𑣁' => '𑢡',
1074
  '𑣂' => '𑢢',
@@ -1101,4 +1345,70 @@ return array(
1101
  '𑣝' => '𑢽',
1102
  '𑣞' => '𑢾',
1103
  '𑣟' => '𑢿',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1104
  );
1
  <?php
2
 
3
+ return array (
4
  'a' => 'A',
5
  'b' => 'B',
6
  'c' => 'C',
225
  'ɦ' => 'Ɦ',
226
  'ɨ' => 'Ɨ',
227
  'ɩ' => 'Ɩ',
228
+ 'ɪ' => 'Ɪ',
229
  'ɫ' => 'Ɫ',
230
  'ɬ' => 'Ɬ',
231
  'ɯ' => 'Ɯ',
234
  'ɵ' => 'Ɵ',
235
  'ɽ' => 'Ɽ',
236
  'ʀ' => 'Ʀ',
237
+ 'ʂ' => 'Ʂ',
238
  'ʃ' => 'Ʃ',
239
  'ʇ' => 'Ʇ',
240
  'ʈ' => 'Ʈ',
243
  'ʋ' => 'Ʋ',
244
  'ʌ' => 'Ʌ',
245
  'ʒ' => 'Ʒ',
246
+ 'ʝ' => 'Ʝ',
247
  'ʞ' => 'Ʞ',
248
  'ͅ' => 'Ι',
249
  'ͱ' => 'Ͱ',
496
  'ք' => 'Ք',
497
  'օ' => 'Օ',
498
  'ֆ' => 'Ֆ',
499
+ 'ა' => 'Ა',
500
+ 'ბ' => 'Ბ',
501
+ 'გ' => 'Გ',
502
+ 'დ' => 'Დ',
503
+ 'ე' => 'Ე',
504
+ 'ვ' => 'Ვ',
505
+ 'ზ' => 'Ზ',
506
+ 'თ' => 'Თ',
507
+ 'ი' => 'Ი',
508
+ 'კ' => 'Კ',
509
+ 'ლ' => 'Ლ',
510
+ 'მ' => 'Მ',
511
+ 'ნ' => 'Ნ',
512
+ 'ო' => 'Ო',
513
+ 'პ' => 'Პ',
514
+ 'ჟ' => 'Ჟ',
515
+ 'რ' => 'Რ',
516
+ 'ს' => 'Ს',
517
+ 'ტ' => 'Ტ',
518
+ 'უ' => 'Უ',
519
+ 'ფ' => 'Ფ',
520
+ 'ქ' => 'Ქ',
521
+ 'ღ' => 'Ღ',
522
+ 'ყ' => 'Ყ',
523
+ 'შ' => 'Შ',
524
+ 'ჩ' => 'Ჩ',
525
+ 'ც' => 'Ც',
526
+ 'ძ' => 'Ძ',
527
+ 'წ' => 'Წ',
528
+ 'ჭ' => 'Ჭ',
529
+ 'ხ' => 'Ხ',
530
+ 'ჯ' => 'Ჯ',
531
+ 'ჰ' => 'Ჰ',
532
+ 'ჱ' => 'Ჱ',
533
+ 'ჲ' => 'Ჲ',
534
+ 'ჳ' => 'Ჳ',
535
+ 'ჴ' => 'Ჴ',
536
+ 'ჵ' => 'Ჵ',
537
+ 'ჶ' => 'Ჶ',
538
+ 'ჷ' => 'Ჷ',
539
+ 'ჸ' => 'Ჸ',
540
+ 'ჹ' => 'Ჹ',
541
+ 'ჺ' => 'Ჺ',
542
+ 'ჽ' => 'Ჽ',
543
+ 'ჾ' => 'Ჾ',
544
+ 'ჿ' => 'Ჿ',
545
+ 'ᏸ' => 'Ᏸ',
546
+ 'ᏹ' => 'Ᏹ',
547
+ 'ᏺ' => 'Ᏺ',
548
+ 'ᏻ' => 'Ᏻ',
549
+ 'ᏼ' => 'Ᏼ',
550
+ 'ᏽ' => 'Ᏽ',
551
+ 'ᲀ' => 'В',
552
+ 'ᲁ' => 'Д',
553
+ 'ᲂ' => 'О',
554
+ 'ᲃ' => 'С',
555
+ 'ᲄ' => 'Т',
556
+ 'ᲅ' => 'Т',
557
+ 'ᲆ' => 'Ъ',
558
+ 'ᲇ' => 'Ѣ',
559
+ 'ᲈ' => 'Ꙋ',
560
  'ᵹ' => 'Ᵹ',
561
  'ᵽ' => 'Ᵽ',
562
+ 'ᶎ' => 'Ᶎ',
563
  'ḁ' => 'Ḁ',
564
  'ḃ' => 'Ḃ',
565
  'ḅ' => 'Ḅ',
1058
  'ꞌ' => 'Ꞌ',
1059
  'ꞑ' => 'Ꞑ',
1060
  'ꞓ' => 'Ꞓ',
1061
+ 'ꞔ' => 'Ꞔ',
1062
  'ꞗ' => 'Ꞗ',
1063
  'ꞙ' => 'Ꞙ',
1064
  'ꞛ' => 'Ꞛ',
1069
  'ꞥ' => 'Ꞥ',
1070
  'ꞧ' => 'Ꞧ',
1071
  'ꞩ' => 'Ꞩ',
1072
+ 'ꞵ' => 'Ꞵ',
1073
+ 'ꞷ' => 'Ꞷ',
1074
+ 'ꞹ' => 'Ꞹ',
1075
+ 'ꞻ' => 'Ꞻ',
1076
+ 'ꞽ' => 'Ꞽ',
1077
+ 'ꞿ' => 'Ꞿ',
1078
+ 'ꟃ' => 'Ꟃ',
1079
+ 'ꟈ' => 'Ꟈ',
1080
+ 'ꟊ' => 'Ꟊ',
1081
+ 'ꟶ' => 'Ꟶ',
1082
+ 'ꭓ' => 'Ꭓ',
1083
+ 'ꭰ' => 'Ꭰ',
1084
+ 'ꭱ' => 'Ꭱ',
1085
+ 'ꭲ' => 'Ꭲ',
1086
+ 'ꭳ' => 'Ꭳ',
1087
+ 'ꭴ' => 'Ꭴ',
1088
+ 'ꭵ' => 'Ꭵ',
1089
+ 'ꭶ' => 'Ꭶ',
1090
+ 'ꭷ' => 'Ꭷ',
1091
+ 'ꭸ' => 'Ꭸ',
1092
+ 'ꭹ' => 'Ꭹ',
1093
+ 'ꭺ' => 'Ꭺ',
1094
+ 'ꭻ' => 'Ꭻ',
1095
+ 'ꭼ' => 'Ꭼ',
1096
+ 'ꭽ' => 'Ꭽ',
1097
+ 'ꭾ' => 'Ꭾ',
1098
+ 'ꭿ' => 'Ꭿ',
1099
+ 'ꮀ' => 'Ꮀ',
1100
+ 'ꮁ' => 'Ꮁ',
1101
+ 'ꮂ' => 'Ꮂ',
1102
+ 'ꮃ' => 'Ꮃ',
1103
+ 'ꮄ' => 'Ꮄ',
1104
+ 'ꮅ' => 'Ꮅ',
1105
+ 'ꮆ' => 'Ꮆ',
1106
+ 'ꮇ' => 'Ꮇ',
1107
+ 'ꮈ' => 'Ꮈ',
1108
+ 'ꮉ' => 'Ꮉ',
1109
+ 'ꮊ' => 'Ꮊ',
1110
+ 'ꮋ' => 'Ꮋ',
1111
+ 'ꮌ' => 'Ꮌ',
1112
+ 'ꮍ' => 'Ꮍ',
1113
+ 'ꮎ' => 'Ꮎ',
1114
+ 'ꮏ' => 'Ꮏ',
1115
+ 'ꮐ' => 'Ꮐ',
1116
+ 'ꮑ' => 'Ꮑ',
1117
+ 'ꮒ' => 'Ꮒ',
1118
+ 'ꮓ' => 'Ꮓ',
1119
+ 'ꮔ' => 'Ꮔ',
1120
+ 'ꮕ' => 'Ꮕ',
1121
+ 'ꮖ' => 'Ꮖ',
1122
+ 'ꮗ' => 'Ꮗ',
1123
+ 'ꮘ' => 'Ꮘ',
1124
+ 'ꮙ' => 'Ꮙ',
1125
+ 'ꮚ' => 'Ꮚ',
1126
+ 'ꮛ' => 'Ꮛ',
1127
+ 'ꮜ' => 'Ꮜ',
1128
+ 'ꮝ' => 'Ꮝ',
1129
+ 'ꮞ' => 'Ꮞ',
1130
+ 'ꮟ' => 'Ꮟ',
1131
+ 'ꮠ' => 'Ꮠ',
1132
+ 'ꮡ' => 'Ꮡ',
1133
+ 'ꮢ' => 'Ꮢ',
1134
+ 'ꮣ' => 'Ꮣ',
1135
+ 'ꮤ' => 'Ꮤ',
1136
+ 'ꮥ' => 'Ꮥ',
1137
+ 'ꮦ' => 'Ꮦ',
1138
+ 'ꮧ' => 'Ꮧ',
1139
+ 'ꮨ' => 'Ꮨ',
1140
+ 'ꮩ' => 'Ꮩ',
1141
+ 'ꮪ' => 'Ꮪ',
1142
+ 'ꮫ' => 'Ꮫ',
1143
+ 'ꮬ' => 'Ꮬ',
1144
+ 'ꮭ' => 'Ꮭ',
1145
+ 'ꮮ' => 'Ꮮ',
1146
+ 'ꮯ' => 'Ꮯ',
1147
+ 'ꮰ' => 'Ꮰ',
1148
+ 'ꮱ' => 'Ꮱ',
1149
+ 'ꮲ' => 'Ꮲ',
1150
+ 'ꮳ' => 'Ꮳ',
1151
+ 'ꮴ' => 'Ꮴ',
1152
+ 'ꮵ' => 'Ꮵ',
1153
+ 'ꮶ' => 'Ꮶ',
1154
+ 'ꮷ' => 'Ꮷ',
1155
+ 'ꮸ' => 'Ꮸ',
1156
+ 'ꮹ' => 'Ꮹ',
1157
+ 'ꮺ' => 'Ꮺ',
1158
+ 'ꮻ' => 'Ꮻ',
1159
+ 'ꮼ' => 'Ꮼ',
1160
+ 'ꮽ' => 'Ꮽ',
1161
+ 'ꮾ' => 'Ꮾ',
1162
+ 'ꮿ' => 'Ꮿ',
1163
  'a' => 'A',
1164
  'b' => 'B',
1165
  'c' => 'C',
1226
  '𐑍' => '𐐥',
1227
  '𐑎' => '𐐦',
1228
  '𐑏' => '𐐧',
1229
+ '𐓘' => '𐒰',
1230
+ '𐓙' => '𐒱',
1231
+ '𐓚' => '𐒲',
1232
+ '𐓛' => '𐒳',
1233
+ '𐓜' => '𐒴',
1234
+ '𐓝' => '𐒵',
1235
+ '𐓞' => '𐒶',
1236
+ '𐓟' => '𐒷',
1237
+ '𐓠' => '𐒸',
1238
+ '𐓡' => '𐒹',
1239
+ '𐓢' => '𐒺',
1240
+ '𐓣' => '𐒻',
1241
+ '𐓤' => '𐒼',
1242
+ '𐓥' => '𐒽',
1243
+ '𐓦' => '𐒾',
1244
+ '𐓧' => '𐒿',
1245
+ '𐓨' => '𐓀',
1246
+ '𐓩' => '𐓁',
1247
+ '𐓪' => '𐓂',
1248
+ '𐓫' => '𐓃',
1249
+ '𐓬' => '𐓄',
1250
+ '𐓭' => '𐓅',
1251
+ '𐓮' => '𐓆',
1252
+ '𐓯' => '𐓇',
1253
+ '𐓰' => '𐓈',
1254
+ '𐓱' => '𐓉',
1255
+ '𐓲' => '𐓊',
1256
+ '𐓳' => '𐓋',
1257
+ '𐓴' => '𐓌',
1258
+ '𐓵' => '𐓍',
1259
+ '𐓶' => '𐓎',
1260
+ '𐓷' => '𐓏',
1261
+ '𐓸' => '𐓐',
1262
+ '𐓹' => '𐓑',
1263
+ '𐓺' => '𐓒',
1264
+ '𐓻' => '𐓓',
1265
+ '𐳀' => '𐲀',
1266
+ '𐳁' => '𐲁',
1267
+ '𐳂' => '𐲂',
1268
+ '𐳃' => '𐲃',
1269
+ '𐳄' => '𐲄',
1270
+ '𐳅' => '𐲅',
1271
+ '𐳆' => '𐲆',
1272
+ '𐳇' => '𐲇',
1273
+ '𐳈' => '𐲈',
1274
+ '𐳉' => '𐲉',
1275
+ '𐳊' => '𐲊',
1276
+ '𐳋' => '𐲋',
1277
+ '𐳌' => '𐲌',
1278
+ '𐳍' => '𐲍',
1279
+ '𐳎' => '𐲎',
1280
+ '𐳏' => '𐲏',
1281
+ '𐳐' => '𐲐',
1282
+ '𐳑' => '𐲑',
1283
+ '𐳒' => '𐲒',
1284
+ '𐳓' => '𐲓',
1285
+ '𐳔' => '𐲔',
1286
+ '𐳕' => '𐲕',
1287
+ '𐳖' => '𐲖',
1288
+ '𐳗' => '𐲗',
1289
+ '𐳘' => '𐲘',
1290
+ '𐳙' => '𐲙',
1291
+ '𐳚' => '𐲚',
1292
+ '𐳛' => '𐲛',
1293
+ '𐳜' => '𐲜',
1294
+ '𐳝' => '𐲝',
1295
+ '𐳞' => '𐲞',
1296
+ '𐳟' => '𐲟',
1297
+ '𐳠' => '𐲠',
1298
+ '𐳡' => '𐲡',
1299
+ '𐳢' => '𐲢',
1300
+ '𐳣' => '𐲣',
1301
+ '𐳤' => '𐲤',
1302
+ '𐳥' => '𐲥',
1303
+ '𐳦' => '𐲦',
1304
+ '𐳧' => '𐲧',
1305
+ '𐳨' => '𐲨',
1306
+ '𐳩' => '𐲩',
1307
+ '𐳪' => '𐲪',
1308
+ '𐳫' => '𐲫',
1309
+ '𐳬' => '𐲬',
1310
+ '𐳭' => '𐲭',
1311
+ '𐳮' => '𐲮',
1312
+ '𐳯' => '𐲯',
1313
+ '𐳰' => '𐲰',
1314
+ '𐳱' => '𐲱',
1315
+ '𐳲' => '𐲲',
1316
  '𑣀' => '𑢠',
1317
  '𑣁' => '𑢡',
1318
  '𑣂' => '𑢢',
1345
  '𑣝' => '𑢽',
1346
  '𑣞' => '𑢾',
1347
  '𑣟' => '𑢿',
1348
+ '𖹠' => '𖹀',
1349
+ '𖹡' => '𖹁',
1350
+ '𖹢' => '𖹂',
1351
+ '𖹣' => '𖹃',
1352
+ '𖹤' => '𖹄',
1353
+ '𖹥' => '𖹅',
1354
+ '𖹦' => '𖹆',
1355
+ '𖹧' => '𖹇',
1356
+ '𖹨' => '𖹈',
1357
+ '𖹩' => '𖹉',
1358
+ '𖹪' => '𖹊',
1359
+ '𖹫' => '𖹋',
1360
+ '𖹬' => '𖹌',
1361
+ '𖹭' => '𖹍',
1362
+ '𖹮' => '𖹎',
1363
+ '𖹯' => '𖹏',
1364
+ '𖹰' => '𖹐',
1365
+ '𖹱' => '𖹑',
1366
+ '𖹲' => '𖹒',
1367
+ '𖹳' => '𖹓',
1368
+ '𖹴' => '𖹔',
1369
+ '𖹵' => '𖹕',
1370
+ '𖹶' => '𖹖',
1371
+ '𖹷' => '𖹗',
1372
+ '𖹸' => '𖹘',
1373
+ '𖹹' => '𖹙',
1374
+ '𖹺' => '𖹚',
1375
+ '𖹻' => '𖹛',
1376
+ '𖹼' => '𖹜',
1377
+ '𖹽' => '𖹝',
1378
+ '𖹾' => '𖹞',
1379
+ '𖹿' => '𖹟',
1380
+ '𞤢' => '𞤀',
1381
+ '𞤣' => '𞤁',
1382
+ '𞤤' => '𞤂',
1383
+ '𞤥' => '𞤃',
1384
+ '𞤦' => '𞤄',
1385
+ '𞤧' => '𞤅',
1386
+ '𞤨' => '𞤆',
1387
+ '𞤩' => '𞤇',
1388
+ '𞤪' => '𞤈',
1389
+ '𞤫' => '𞤉',
1390
+ '𞤬' => '𞤊',
1391
+ '𞤭' => '𞤋',
1392
+ '𞤮' => '𞤌',
1393
+ '𞤯' => '𞤍',
1394
+ '𞤰' => '𞤎',
1395
+ '𞤱' => '𞤏',
1396
+ '𞤲' => '𞤐',
1397
+ '𞤳' => '𞤑',
1398
+ '𞤴' => '𞤒',
1399
+ '𞤵' => '𞤓',
1400
+ '𞤶' => '𞤔',
1401
+ '𞤷' => '𞤕',
1402
+ '𞤸' => '𞤖',
1403
+ '𞤹' => '𞤗',
1404
+ '𞤺' => '𞤘',
1405
+ '𞤻' => '𞤙',
1406
+ '𞤼' => '𞤚',
1407
+ '𞤽' => '𞤛',
1408
+ '𞤾' => '𞤜',
1409
+ '𞤿' => '𞤝',
1410
+ '𞥀' => '𞤞',
1411
+ '𞥁' => '𞤟',
1412
+ '𞥂' => '𞤠',
1413
+ '𞥃' => '𞤡',
1414
  );
wp_mail_smtp.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /**
3
  * Plugin Name: WP Mail SMTP
4
- * Version: 2.1.1
5
  * Plugin URI: https://wpmailsmtp.com/
6
  * Description: Reconfigures the <code>wp_mail()</code> function to use Gmail/Mailgun/SendGrid/SMTP instead of the default <code>mail()</code> and creates an options page to manage the settings.
7
  * Author: WPForms
@@ -203,7 +203,7 @@ if ( ! function_exists( 'wp_mail_smtp_insecure_php_version_notice' ) ) {
203
  }
204
 
205
  if ( ! defined( 'WPMS_PLUGIN_VER' ) ) {
206
- define( 'WPMS_PLUGIN_VER', '2.1.1' );
207
  }
208
  if ( ! defined( 'WPMS_PHP_VER' ) ) {
209
  define( 'WPMS_PHP_VER', '5.5.0' );
1
  <?php
2
  /**
3
  * Plugin Name: WP Mail SMTP
4
+ * Version: 2.2.1
5
  * Plugin URI: https://wpmailsmtp.com/
6
  * Description: Reconfigures the <code>wp_mail()</code> function to use Gmail/Mailgun/SendGrid/SMTP instead of the default <code>mail()</code> and creates an options page to manage the settings.
7
  * Author: WPForms
203
  }
204
 
205
  if ( ! defined( 'WPMS_PLUGIN_VER' ) ) {
206
+ define( 'WPMS_PLUGIN_VER', '2.2.1' );
207
  }
208
  if ( ! defined( 'WPMS_PHP_VER' ) ) {
209
  define( 'WPMS_PHP_VER', '5.5.0' );