Popup by Supsystic - Version 1.9.1

Version Description

/ 11.04.2017 * ActiveCampaign - fix Tags functionality * Minor issues fix * Code improvements

Download this release

Release Info

Developer supsystic.com
Plugin Icon 128x128 Popup by Supsystic
Version 1.9.1
Comparing to
See all releases

Code changes from version 1.9.3 to 1.9.1

Files changed (41) hide show
  1. classes/html.php +1 -1
  2. classes/response.php +1 -1
  3. classes/tables/popup_show_categories.php +10 -10
  4. config.php +1 -1
  5. css/style-rtl.css +27 -27
  6. lang/pps_lng.po +4059 -4059
  7. modules/mail/engines/PHPMailerAutoload.php +49 -49
  8. modules/mail/engines/class.phpmailer.php +4039 -4039
  9. modules/mail/engines/class.phpmaileroauth.php +197 -197
  10. modules/mail/engines/class.phpmaileroauthgoogle.php +77 -77
  11. modules/mail/engines/class.pop3.php +407 -407
  12. modules/mail/engines/class.smtp.php +1249 -1249
  13. modules/mail/engines/get_oauth_token.php +162 -162
  14. modules/options/mod.php +0 -1
  15. modules/popup/js/frontend.popup.js +12 -28
  16. modules/popup/models/popup.php +0 -2
  17. modules/popup/views/popup.php +0 -7
  18. modules/popup/views/tpl/popupEditAdmin.php +1 -1
  19. modules/popup/views/tpl/popupEditAdminContactFormbOpts.php +34 -34
  20. modules/statistics/models/statistics.php +3 -33
  21. modules/statistics/views/statistics.php +1 -1
  22. modules/supsystic_promo/controller.php +1 -9
  23. modules/supsystic_promo/js/admin.item.edit.stats.js +0 -72
  24. modules/supsystic_promo/js/admin.plugins.js +0 -49
  25. modules/supsystic_promo/mod.php +3 -24
  26. modules/supsystic_promo/models/classes/lib/Base/MixpanelBase.php +0 -65
  27. modules/supsystic_promo/models/classes/lib/ConsumerStrategies/AbstractConsumer.php +0 -57
  28. modules/supsystic_promo/models/classes/lib/ConsumerStrategies/CurlConsumer.php +0 -221
  29. modules/supsystic_promo/models/classes/lib/ConsumerStrategies/FileConsumer.php +0 -38
  30. modules/supsystic_promo/models/classes/lib/ConsumerStrategies/SocketConsumer.php +0 -308
  31. modules/supsystic_promo/models/classes/lib/Mixpanel.php +0 -302
  32. modules/supsystic_promo/models/classes/lib/Producers/MixpanelBaseProducer.php +0 -229
  33. modules/supsystic_promo/models/classes/lib/Producers/MixpanelEvents.php +0 -164
  34. modules/supsystic_promo/models/classes/lib/Producers/MixpanelPeople.php +0 -147
  35. modules/supsystic_promo/models/supsystic_promo.php +0 -61
  36. modules/supsystic_promo/views/supsystic_promo.php +0 -3
  37. modules/supsystic_promo/views/tpl/featuredPlugins.php +41 -41
  38. modules/supsystic_promo/views/tpl/pluginDeactivation.php +0 -78
  39. modules/templates/mod.php +0 -1
  40. pps.php +1 -1
  41. readme.txt +31 -38
classes/html.php CHANGED
@@ -289,7 +289,7 @@ class htmlPps {
289
  static public function radiobutton($name, $params = array('attrs' => '', 'value' => '', 'checked' => '')) {
290
  $params['type'] = 'radio';
291
  $params['attrs'] = isset($params['attrs']) ? $params['attrs'] : '';
292
- if(isset($params['checked']) && $params['checked'])
293
  $params['attrs'] .= ' checked';
294
  return self::input($name, $params);
295
  }
289
  static public function radiobutton($name, $params = array('attrs' => '', 'value' => '', 'checked' => '')) {
290
  $params['type'] = 'radio';
291
  $params['attrs'] = isset($params['attrs']) ? $params['attrs'] : '';
292
+ if($params['checked'])
293
  $params['attrs'] .= ' checked';
294
  return self::input($name, $params);
295
  }
classes/response.php CHANGED
@@ -22,7 +22,7 @@ class responsePps {
22
  if(count($this->errors) > 0)
23
  $this->error = true;
24
  if($isAjax || $forceAjax)
25
- exit( json_encode_utf_normal($this) );
26
  /*if($redirect)
27
  redirectPps($redirect);*/
28
  return $this;
22
  if(count($this->errors) > 0)
23
  $this->error = true;
24
  if($isAjax || $forceAjax)
25
+ exit( json_encode($this) );
26
  /*if($redirect)
27
  redirectPps($redirect);*/
28
  return $this;
classes/tables/popup_show_categories.php CHANGED
@@ -1,11 +1,11 @@
1
- <?php
2
- class tablePopup_show_categoriesPps extends tablePps {
3
- public function __construct() {
4
- $this->_table = '@__popup_show_categories';
5
- $this->_id = 'id';
6
- $this->_alias = 'sup_popup_show_categories';
7
- $this->_addField('popup_id', 'text', 'int')
8
- ->_addField('term_id', 'text', 'int')
9
- ->_addField('not_show', 'text', 'int');
10
- }
11
  }
1
+ <?php
2
+ class tablePopup_show_categoriesPps extends tablePps {
3
+ public function __construct() {
4
+ $this->_table = '@__popup_show_categories';
5
+ $this->_id = 'id';
6
+ $this->_alias = 'sup_popup_show_categories';
7
+ $this->_addField('popup_id', 'text', 'int')
8
+ ->_addField('term_id', 'text', 'int')
9
+ ->_addField('not_show', 'text', 'int');
10
+ }
11
  }
config.php CHANGED
@@ -48,7 +48,7 @@
48
  define('PPS_EOL', "\n");
49
 
50
  define('PPS_PLUGIN_INSTALLED', true);
51
- define('PPS_VERSION', '1.9.3');
52
  define('PPS_USER', 'user');
53
 
54
  define('PPS_CLASS_PREFIX', 'ppsc');
48
  define('PPS_EOL', "\n");
49
 
50
  define('PPS_PLUGIN_INSTALLED', true);
51
+ define('PPS_VERSION', '1.9.1');
52
  define('PPS_USER', 'user');
53
 
54
  define('PPS_CLASS_PREFIX', 'ppsc');
css/style-rtl.css CHANGED
@@ -1,27 +1,27 @@
1
- .supsystic-plugin .supsystic-content .supsystic-navigation {
2
- left: 0;
3
- }
4
- .supsystic-plugin .supsystic-content .supsystic-navigation.supsystic-sticky-active {
5
- left: 20px;
6
- }
7
- #supsystic-breadcrumbs {
8
- left: 0;
9
- }
10
- #ppsPopupMainControllsShell {
11
- padding-right: 15px !important;
12
- }
13
- #supsystic-breadcrumbs.supsystic-sticky-active #ppsPopupMainControllsShell {
14
- padding-right: 270px !important;
15
- }
16
- .supsystic-tour-btns .supsystic-tour-next-btn {
17
- float: right;
18
- }
19
- .supsystic-plugin .ppsCopyTextCode,
20
- #ppsPopupEditors textarea,
21
- #ppsPopupEditors .CodeMirror {
22
- direction: ltr;
23
- }
24
- .chosen-container-single.chosen-container-single-nosearch .chosen-search,
25
- .chosen-container .chosen-drop {
26
- left: 9999px;
27
- }
1
+ .supsystic-plugin .supsystic-content .supsystic-navigation {
2
+ left: 0;
3
+ }
4
+ .supsystic-plugin .supsystic-content .supsystic-navigation.supsystic-sticky-active {
5
+ left: 20px;
6
+ }
7
+ #supsystic-breadcrumbs {
8
+ left: 0;
9
+ }
10
+ #ppsPopupMainControllsShell {
11
+ padding-right: 15px !important;
12
+ }
13
+ #supsystic-breadcrumbs.supsystic-sticky-active #ppsPopupMainControllsShell {
14
+ padding-right: 270px !important;
15
+ }
16
+ .supsystic-tour-btns .supsystic-tour-next-btn {
17
+ float: right;
18
+ }
19
+ .supsystic-plugin .ppsCopyTextCode,
20
+ #ppsPopupEditors textarea,
21
+ #ppsPopupEditors .CodeMirror {
22
+ direction: ltr;
23
+ }
24
+ .chosen-container-single.chosen-container-single-nosearch .chosen-search,
25
+ .chosen-container .chosen-drop {
26
+ left: 9999px;
27
+ }
lang/pps_lng.po CHANGED
@@ -1,4059 +1,4059 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: PopUp by Supsystic\n"
4
- "Report-Msgid-Bugs-To: \n"
5
- "POT-Creation-Date: 2016-03-01 16:11+0200\n"
6
- "PO-Revision-Date: 2016-11-23 14:15+0200\n"
7
- "Last-Translator: supsystic.com <supsystic.team@gmail.com>\n"
8
- "Language-Team: supsystic.com <supsystic.team@gmail.com>\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "Language: en\n"
13
- "X-Generator: Poedit 1.8.3\n"
14
- "X-Poedit-KeywordsList: _;gettext;gettext_noop;__;_e\n"
15
- "X-Poedit-Basepath: ..\n"
16
- "X-Poedit-SourceCharset: UTF-8\n"
17
- "X-Poedit-SearchPathExcluded-0: doc/promo-popup-by-supsystic-pro\n"
18
- "X-Poedit-SearchPath-0: lang\n"
19
- "X-Poedit-SearchPath-1: .\n"
20
- "X-Poedit-SearchPath-2: .\n"
21
-
22
- #: classes/controller.php:199
23
- #: classes/controller.php:207
24
- msgid "Done"
25
- msgstr ""
26
-
27
- #: classes/field.php:131
28
- msgid "Select"
29
- msgstr ""
30
-
31
- #: classes/field.php:170
32
- #: classes/field.php:179
33
- #: classes/field.php:184
34
- msgid "N/A"
35
- msgstr ""
36
-
37
- #: classes/field.php:277
38
- msgid "Add Checkbox"
39
- msgstr ""
40
-
41
- #: classes/field.php:282
42
- #: classes/field.php:287
43
- msgid "Add Item"
44
- msgstr ""
45
-
46
- #: classes/field.php:293
47
- msgid "Add Radio Button"
48
- msgstr ""
49
-
50
- #: classes/field.php:311
51
- msgid "Dimensions"
52
- msgstr ""
53
-
54
- #: classes/field.php:314
55
- msgid "width"
56
- msgstr ""
57
-
58
- #: classes/field.php:316
59
- msgid "height"
60
- msgstr ""
61
-
62
- #: classes/field.php:323
63
- msgid "Click to set field \"id\" and \"class\""
64
- msgstr ""
65
-
66
- #: classes/field.php:324
67
- msgid "Attributes"
68
- msgstr ""
69
-
70
- #: classes/field.php:402
71
- msgid "There are no configuration options for this module"
72
- msgstr ""
73
-
74
- #: classes/fieldAdapter.php:93
75
- msgid "Apply To"
76
- msgstr ""
77
-
78
- #: classes/fieldAdapter.php:95
79
- msgid "Address"
80
- msgstr ""
81
-
82
- #: classes/fieldAdapter.php:96
83
- msgid "Destination"
84
- msgstr ""
85
-
86
- #: classes/fieldAdapter.php:97
87
- msgid "Country"
88
- msgstr ""
89
-
90
- #: classes/fieldAdapter.php:100
91
- msgid "Categories"
92
- msgstr ""
93
-
94
- #: classes/fieldAdapter.php:101
95
- msgid "You have no categories"
96
- msgstr ""
97
-
98
- #: classes/fieldAdapter.php:102
99
- msgid "Brands"
100
- msgstr ""
101
-
102
- #: classes/fieldAdapter.php:103
103
- msgid "You have no brands"
104
- msgstr ""
105
-
106
- #: classes/fieldAdapter.php:105
107
- msgid "Tax Rate"
108
- msgstr ""
109
-
110
- #: classes/fieldAdapter.php:106
111
- msgid "Absolute"
112
- msgstr ""
113
-
114
- #: classes/fieldAdapter.php:134
115
- msgid "Not selected"
116
- msgstr ""
117
-
118
- #: classes/fieldAdapter.php:184
119
- msgid "class"
120
- msgstr ""
121
-
122
- #: classes/fieldAdapter.php:186
123
- msgid "id"
124
- msgstr ""
125
-
126
- #: classes/frame.php:139
127
- msgid "You have no permissions to view this page"
128
- msgstr ""
129
-
130
- #: classes/html.php:231
131
- msgid "Upload"
132
- msgstr ""
133
-
134
- #: classes/html.php:648
135
- msgid "ON"
136
- msgstr ""
137
-
138
- #: classes/html.php:649
139
- msgid "OFF"
140
- msgstr ""
141
-
142
- #: classes/html.php:673
143
- #, php-format
144
- msgid "Select %s"
145
- msgstr ""
146
-
147
- #: classes/model.php:176
148
- #: classes/model.php:188
149
- msgid "Database error detected"
150
- msgstr ""
151
-
152
- #: classes/model.php:178
153
- msgid "Invalid ID"
154
- msgstr ""
155
-
156
- #: classes/model.php:211
157
- msgid "Empty or invalid ID"
158
- msgstr ""
159
-
160
- #: classes/modInstaller.php:34
161
- #, php-format
162
- msgid "Move files for %s failed"
163
- msgstr ""
164
-
165
- #: classes/modInstaller.php:37
166
- #, php-format
167
- msgid "%s is not plugin module"
168
- msgstr ""
169
-
170
- #: classes/modInstaller.php:76
171
- msgid "Cannot create module directory. Try to set permission to "
172
- msgstr ""
173
-
174
- #: classes/modInstaller.php:103
175
- msgid "No modules were found in XML file"
176
- msgstr ""
177
-
178
- #: classes/modInstaller.php:107
179
- msgid "Invalid XML file"
180
- msgstr ""
181
-
182
- #: classes/modInstaller.php:109
183
- msgid "No XML file were found"
184
- msgstr ""
185
-
186
- #: classes/modInstaller.php:132
187
- #, php-format
188
- msgid "Install %s failed"
189
- msgstr ""
190
-
191
- #: classes/modInstaller.php:138
192
- msgid "Error Activate module"
193
- msgstr ""
194
-
195
- #: classes/modInstaller.php:168
196
- msgid "Error Deactivation module"
197
- msgstr ""
198
-
199
- #: classes/modInstaller.php:189
200
- msgid "Error Activating module"
201
- msgstr ""
202
-
203
- #: classes/table.php:277
204
- msgid "Nothing to update"
205
- msgstr ""
206
-
207
- #: classes/table.php:293
208
- msgid "Database error. Please contact your developer."
209
- msgstr ""
210
-
211
- #: classes/validator.php:30
212
- #, php-format
213
- msgid "Invalid length for %s, max length is %s"
214
- msgstr ""
215
-
216
- #: classes/validator.php:43
217
- #, php-format
218
- msgid "Invalid numeric value for %s"
219
- msgstr ""
220
-
221
- #: classes/validator.php:71
222
- #, php-format
223
- msgid "Please enter %s"
224
- msgstr ""
225
-
226
- #: classes/validator.php:78
227
- #, php-format
228
- msgid "Please select %s"
229
- msgstr ""
230
-
231
- #: classes/validator.php:85
232
- #: classes/validator.php:101
233
- #, php-format
234
- msgid "Invalid %s"
235
- msgstr ""
236
-
237
- #: classes/validator.php:88
238
- #, php-format
239
- msgid "%s is already registered"
240
- msgstr ""
241
-
242
- #: classes/tables/modules.php:7
243
- #: classes/tables/modules_type.php:8
244
- msgid "Label"
245
- msgstr ""
246
-
247
- #: classes/tables/modules.php:8
248
- msgid "Type"
249
- msgstr ""
250
-
251
- #: classes/tables/modules.php:9
252
- msgid "Active"
253
- msgstr ""
254
-
255
- #: classes/tables/modules.php:10
256
- msgid "Params"
257
- msgstr ""
258
-
259
- #: classes/tables/modules.php:13
260
- msgid "Code"
261
- msgstr ""
262
-
263
- #: classes/tables/modules.php:14
264
- msgid "External plugin directory"
265
- msgstr ""
266
-
267
- #: classes/tables/modules_type.php:7
268
- msgid "ID"
269
- msgstr ""
270
-
271
- #: classes/tables/usage_stat.php:8
272
- msgid "code"
273
- msgstr ""
274
-
275
- #: classes/tables/usage_stat.php:9
276
- msgid "visits"
277
- msgstr ""
278
-
279
- #: classes/tables/usage_stat.php:10
280
- msgid "spent_time"
281
- msgstr ""
282
-
283
- #: classes/tables/usage_stat.php:11
284
- msgid "modify_timestamp"
285
- msgstr ""
286
-
287
- #: doc/popup-by-supsystic-pro/wpUpdater.php:68
288
- msgid "An Unexpected HTTP Error occurred during the API request.</p> <p><a href=\"?\" onclick=\"document.location.reload(); return false;\">Try again</a>"
289
- msgstr ""
290
-
291
- #: doc/popup-by-supsystic-pro/wpUpdater.php:73
292
- msgid "An unknown error occurred"
293
- msgstr ""
294
-
295
- #: doc/popup-by-supsystic-pro/ab_testing/mod.php:21
296
- msgid "Testing"
297
- msgstr ""
298
-
299
- #: doc/popup-by-supsystic-pro/ab_testing/models/ab_testing.php:18
300
- msgid "Enter Name"
301
- msgstr ""
302
-
303
- #: doc/popup-by-supsystic-pro/ab_testing/models/ab_testing.php:20
304
- #: doc/popup-by-supsystic-pro/ab_testing/models/ab_testing.php:32
305
- msgid "Empty Base ID"
306
- msgstr ""
307
-
308
- #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abEditFormControls.php:3
309
- msgid "Back to Main PopUp"
310
- msgstr ""
311
-
312
- #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abNewForm.php:2
313
- #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abPopupEditTab.php:3
314
- msgid "Add New Test"
315
- msgstr ""
316
-
317
- #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abNewForm.php:5
318
- msgid "Test PopUp Name"
319
- msgstr ""
320
-
321
- #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abPopupEditTab.php:7
322
- msgid "Delete selected"
323
- msgstr ""
324
-
325
- #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abPopupEditTab.php:11
326
- msgid "Clear"
327
- msgstr ""
328
-
329
- #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abPopupEditTab.php:17
330
- msgid "You have no Test PopUps for now. <a href=\"#\" class=\"ppsAbAddNew\" style=\"font-style: italic;\">Create</a> your first Test!"
331
- msgstr ""
332
-
333
- #: doc/popup-by-supsystic-pro/activecampaign/mod.php:11
334
- msgid "Active Campaign"
335
- msgstr ""
336
-
337
- #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:22
338
- msgid "Please make sure that you created some Lists under your Active Campaign account."
339
- msgstr ""
340
-
341
- #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:26
342
- msgid "Make sure that you entered correct API data."
343
- msgstr ""
344
-
345
- #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:40
346
- msgid "Please enter your API URL"
347
- msgstr ""
348
-
349
- #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:42
350
- msgid "Please enter your API key"
351
- msgstr ""
352
-
353
- #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:82
354
- #, php-format
355
- msgid "Add contact failed with error: %s"
356
- msgstr ""
357
-
358
- #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:94
359
- msgid "No lists to add selected in admin area - contact site owner to resolve this issue."
360
- msgstr ""
361
-
362
- #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:4
363
- msgid "Not supported by Server"
364
- msgstr ""
365
-
366
- #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:5
367
- msgid "Not supported on your server"
368
- msgstr ""
369
-
370
- #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:8
371
- msgid "This module require to have cUrl library for PHP on server installed. Please contact your hosting provider and ask them to enable cUrl for you, this is Free library."
372
- msgstr ""
373
-
374
- #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:14
375
- msgid "API URL"
376
- msgstr ""
377
-
378
- #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:15
379
- #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:27
380
- #, php-format
381
- msgid "You can find it under your Active Campaign Account -> My Settings -> API, here is <a href=\"%s\" class=\"ppsAcHelpApiKeyLink\">help screenshot</a>"
382
- msgstr ""
383
-
384
- #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:26
385
- msgid "API Key"
386
- msgstr ""
387
-
388
- #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:38
389
- msgid "Campaigns for subscribe"
390
- msgstr ""
391
-
392
- #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:39
393
- msgid "Select Campaigns for subscribe. They are taken from your Active Campaign account."
394
- msgstr ""
395
-
396
- #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:46
397
- msgid "Choose Lists"
398
- msgstr ""
399
-
400
- #: doc/popup-by-supsystic-pro/arpreach/mod.php:8
401
- msgid "arpReach"
402
- msgstr ""
403
-
404
- #: doc/popup-by-supsystic-pro/arpreach/views/tpl/arAdminFields.php:4
405
- msgid "arpReach not supported"
406
- msgstr ""
407
-
408
- #: doc/popup-by-supsystic-pro/arpreach/views/tpl/arAdminFields.php:5
409
- msgid "This module is not supported by your server configuration."
410
- msgstr ""
411
-
412
- #: doc/popup-by-supsystic-pro/arpreach/views/tpl/arAdminFields.php:8
413
- msgid "arpReach is not supported on your server."
414
- msgstr ""
415
-
416
- #: doc/popup-by-supsystic-pro/arpreach/views/tpl/arAdminFields.php:14
417
- msgid "arpReach intake form Action URL"
418
- msgstr ""
419
-
420
- #: doc/popup-by-supsystic-pro/arpreach/views/tpl/arAdminFields.php:15
421
- msgid "Open your script for intake form, find there form tag with form method='post' action='http://yourdomain.coma/a/a.php/sub/a/xxxxxx', then copy \"action\" attribute - and paste it in text field below."
422
- msgstr ""
423
-
424
- #: doc/popup-by-supsystic-pro/benchmarkemail/mod.php:12
425
- msgid "Benchmark"
426
- msgstr ""
427
-
428
- #: doc/popup-by-supsystic-pro/benchmarkemail/models/benchmarkemail.php:41
429
- msgid "Please make sure that you created some Lists under your Benchmark account."
430
- msgstr ""
431
-
432
- #: doc/popup-by-supsystic-pro/benchmarkemail/models/benchmarkemail.php:45
433
- msgid "Please enter your Benchmark Password"
434
- msgstr ""
435
-
436
- #: doc/popup-by-supsystic-pro/benchmarkemail/models/benchmarkemail.php:47
437
- msgid "Please enter your Benchmark Login"
438
- msgstr ""
439
-
440
- #: doc/popup-by-supsystic-pro/benchmarkemail/views/tpl/beAdminFields.php:15
441
- msgid "Benchmark Login"
442
- msgstr ""
443
-
444
- #: doc/popup-by-supsystic-pro/benchmarkemail/views/tpl/beAdminFields.php:16
445
- msgid "Login for your Benchmark account."
446
- msgstr ""
447
-
448
- #: doc/popup-by-supsystic-pro/benchmarkemail/views/tpl/beAdminFields.php:27
449
- msgid "Benchmark Password"
450
- msgstr ""
451
-
452
- #: doc/popup-by-supsystic-pro/benchmarkemail/views/tpl/beAdminFields.php:28
453
- msgid "Password for your Benchmark account."
454
- msgstr ""
455
-
456
- #: doc/popup-by-supsystic-pro/benchmarkemail/views/tpl/beAdminFields.php:40
457
- msgid "Select Campaigns for subscribe. They are taken from your Benchmark account."
458
- msgstr ""
459
-
460
- #: doc/popup-by-supsystic-pro/campaignmonitor/mod.php:8
461
- msgid "Campaign Monitor"
462
- msgstr ""
463
-
464
- #: doc/popup-by-supsystic-pro/campaignmonitor/models/campaignmonitor.php:16
465
- #, php-format
466
- msgid "You have no lists for now. Go to your <a href=\"%s\" target=\"_blank\">Campaign Monitor Account -> Lists & Subscribers</a> and create list at first, then just reload this page"
467
- msgstr ""
468
-
469
- #: doc/popup-by-supsystic-pro/campaignmonitor/models/campaignmonitor.php:185
470
- msgid "Something going wrong while trying to send data to mail list service. Please contact site owner."
471
- msgstr ""
472
-
473
- #: doc/popup-by-supsystic-pro/campaignmonitor/models/campaignmonitor.php:195
474
- msgid "Can not detect authorization fo account owner. Contact site owner to resolve this issue."
475
- msgstr ""
476
-
477
- #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:4
478
- msgid "Campaign Monitor not supported"
479
- msgstr ""
480
-
481
- #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:8
482
- msgid "Campaign Monitor require at least PHP version 5.3. Please contact your hosting provider and ask them to switch your PHP to version 5.3. or higher."
483
- msgstr ""
484
-
485
- #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:14
486
- msgid "Campaign Monitor Setup"
487
- msgstr ""
488
-
489
- #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:15
490
- msgid "You must authorize to use Campaign Monitor features"
491
- msgstr ""
492
-
493
- #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:18
494
- msgid "Authorize in Campaign Monitor"
495
- msgstr ""
496
-
497
- #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:24
498
- msgid "Lists for subscribe"
499
- msgstr ""
500
-
501
- #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:25
502
- msgid "Select lists for subscribe. They are taken from your Campaign Monitor account."
503
- msgstr ""
504
-
505
- #: doc/popup-by-supsystic-pro/constantcontact/mod.php:11
506
- msgid "Constant Contact"
507
- msgstr ""
508
-
509
- #: doc/popup-by-supsystic-pro/constantcontact/models/constantcontact.php:39
510
- msgid "You are not logged-in"
511
- msgstr ""
512
-
513
- #: doc/popup-by-supsystic-pro/constantcontact/models/constantcontact.php:41
514
- msgid "Can not get cc obj"
515
- msgstr ""
516
-
517
- #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:4
518
- msgid "Constant Contact not supported"
519
- msgstr ""
520
-
521
- #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:8
522
- msgid "Constant Contact require at least PHP version 5.3. Please contact your hosting provider and ask them to switch your PHP to version 5.3. or higher."
523
- msgstr ""
524
-
525
- #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:14
526
- msgid "Constant Contact Setup"
527
- msgstr ""
528
-
529
- #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:15
530
- msgid "You must authorize to use Constant Contact features"
531
- msgstr ""
532
-
533
- #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:18
534
- msgid "Authorize in Constant Contact"
535
- msgstr ""
536
-
537
- #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:25
538
- msgid "Select lists for subscribe. They are taken from your Constant Contact account."
539
- msgstr ""
540
-
541
- #: doc/popup-by-supsystic-pro/feedblitz/mod.php:8
542
- msgid "FeedBlitz"
543
- msgstr ""
544
-
545
- #: doc/popup-by-supsystic-pro/feedblitz/models/feedblitz.php:11
546
- msgid "You have no lists. Login to your SendGrid account and create your first list before start using this functionality."
547
- msgstr ""
548
-
549
- #: doc/popup-by-supsystic-pro/feedblitz/models/feedblitz.php:61
550
- msgid "Some error occured during connection to the server"
551
- msgstr ""
552
-
553
- #: doc/popup-by-supsystic-pro/feedblitz/views/tpl/feedbAdminFields.php:4
554
- msgid "FeedBlitz not supported"
555
- msgstr ""
556
-
557
- #: doc/popup-by-supsystic-pro/feedblitz/views/tpl/feedbAdminFields.php:8
558
- msgid "FeedBlitz is not supported on your server"
559
- msgstr ""
560
-
561
- #: doc/popup-by-supsystic-pro/feedblitz/views/tpl/feedbAdminFields.php:14
562
- msgid "FeedBlitz API Key"
563
- msgstr ""
564
-
565
- #: doc/popup-by-supsystic-pro/feedblitz/views/tpl/feedbAdminFields.php:15
566
- msgid "Your FeedBlitz API Key"
567
- msgstr ""
568
-
569
- #: doc/popup-by-supsystic-pro/feedblitz/views/tpl/feedbAdminFields.php:26
570
- msgid "Select lists for subscribe. They are taken from your FeedBlitz account."
571
- msgstr ""
572
-
573
- #: doc/popup-by-supsystic-pro/get_response/mod.php:11
574
- msgid "GetResponse"
575
- msgstr ""
576
-
577
- #: doc/popup-by-supsystic-pro/get_response/views/tpl/grAdminFields.php:15
578
- #, php-format
579
- msgid "You can find it under your GetResponse Account -> GetResponse API, here is <a href=\"%s\" class=\"ppsGrHelpApiKeyLink\" target=\"_blank\">help screenshot</a>"
580
- msgstr ""
581
-
582
- #: doc/popup-by-supsystic-pro/get_response/views/tpl/grAdminFields.php:26
583
- msgid "Select Campaigns for subscribe. They are taken from your GetResponse account."
584
- msgstr ""
585
-
586
- #: doc/popup-by-supsystic-pro/get_response/views/tpl/grAdminFields.php:41
587
- msgid "Cycle Day"
588
- msgstr ""
589
-
590
- #: doc/popup-by-supsystic-pro/get_response/views/tpl/grAdminFields.php:42
591
- msgid "Insert contact on a given day at the autoresponder cycle. Value of 0 means the beginning of the cycle. Lack of this param means that a contact will not be inserted into cycle."
592
- msgstr ""
593
-
594
- #: doc/popup-by-supsystic-pro/icontact/mod.php:11
595
- msgid "iContact"
596
- msgstr ""
597
-
598
- #: doc/popup-by-supsystic-pro/icontact/models/icontact.php:20
599
- msgid "Please enter your Application ID"
600
- msgstr ""
601
-
602
- #: doc/popup-by-supsystic-pro/icontact/models/icontact.php:23
603
- msgid "Please enter your API Username"
604
- msgstr ""
605
-
606
- #: doc/popup-by-supsystic-pro/icontact/models/icontact.php:26
607
- msgid "Please enter your API Password"
608
- msgstr ""
609
-
610
- #: doc/popup-by-supsystic-pro/icontact/models/icontact.php:43
611
- msgid "You have no lists in your iContact account for now."
612
- msgstr ""
613
-
614
- #: doc/popup-by-supsystic-pro/icontact/models/icontact.php:107
615
- msgid "Can't add contact"
616
- msgstr ""
617
-
618
- #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:14
619
- msgid "Application ID"
620
- msgstr ""
621
-
622
- #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:15
623
- #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:26
624
- #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:37
625
- #, php-format
626
- msgid "You can create it <a href=\"%s\" target=\"_blank\">here</a>. More info can be found <a href=\"%s\" target=\"_blank\">here</a>"
627
- msgstr ""
628
-
629
- #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:25
630
- msgid "API Username"
631
- msgstr ""
632
-
633
- #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:36
634
- msgid "API Password"
635
- msgstr ""
636
-
637
- #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:48
638
- msgid "Select Lists for subscribe. They are taken from your iContact account."
639
- msgstr ""
640
-
641
- #: doc/popup-by-supsystic-pro/infusionsoft/mod.php:13
642
- msgid "InfusionSoft"
643
- msgstr ""
644
-
645
- #: doc/popup-by-supsystic-pro/infusionsoft/models/infusionsoft.php:87
646
- msgid "Administrator of this site need to re-autentificate in InfusionSoft system from admin area"
647
- msgstr ""
648
-
649
- #: doc/popup-by-supsystic-pro/infusionsoft/views/tpl/isAdminFields.php:8
650
- msgid "This module require to have cUrl library for PHP on server installed and PHP version to be at least 5.3.2. Please contact your hosting provider and ask them to enable cUrl for you, this is Free library, and check your PHP version."
651
- msgstr ""
652
-
653
- #: doc/popup-by-supsystic-pro/infusionsoft/views/tpl/isAdminFields.php:14
654
- msgid "InfusionSoft Setup"
655
- msgstr ""
656
-
657
- #: doc/popup-by-supsystic-pro/infusionsoft/views/tpl/isAdminFields.php:15
658
- msgid "You must authorize to use InfusionSoft features"
659
- msgstr ""
660
-
661
- #: doc/popup-by-supsystic-pro/infusionsoft/views/tpl/isAdminFields.php:18
662
- msgid "Authorize in InfusionSoft"
663
- msgstr ""
664
-
665
- #: doc/popup-by-supsystic-pro/layered_popup/mod.php:10
666
- msgid "Popup Location"
667
- msgstr ""
668
-
669
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:7
670
- msgid "Enable Layered PopUp Style"
671
- msgstr ""
672
-
673
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:9
674
- msgid "By default all PopUps have modal style: it appears on user screen over the whole site. Layered style allows you to show your PopUp - on selected position: top, bottom, etc. and not over your site - but right near your content."
675
- msgstr ""
676
-
677
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:13
678
- msgid "Select position for your PopUp"
679
- msgstr ""
680
-
681
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:16
682
- msgid "Top Left"
683
- msgstr ""
684
-
685
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:17
686
- msgid "Top"
687
- msgstr ""
688
-
689
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:18
690
- msgid "Top Right"
691
- msgstr ""
692
-
693
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:20
694
- msgid "Center Left"
695
- msgstr ""
696
-
697
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:21
698
- msgid "Center"
699
- msgstr ""
700
-
701
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:22
702
- msgid "Center Right"
703
- msgstr ""
704
-
705
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:24
706
- msgid "Bottom Left"
707
- msgstr ""
708
-
709
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:25
710
- msgid "Bottom"
711
- msgstr ""
712
-
713
- #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:26
714
- msgid "Bottom Right"
715
- msgstr ""
716
-
717
- #: doc/popup-by-supsystic-pro/license/mod.php:30
718
- #, php-format
719
- msgid "Your license has expired. Once you extend your license - you will be able to Update PRO version. To extend PRO version license - follow <a href=\"%s\" target=\"_blank\">this link</a>, then - go to <a href=\"%s\">License</a> tab anc click on \"Re-activate\" button to re-activate your PRO version."
720
- msgstr ""
721
-
722
- #: doc/popup-by-supsystic-pro/license/mod.php:38
723
- #, php-format
724
- msgid "Your license for PRO version of %s plugin has expired. You can <a href=\"%s\" target=\"_blank\">click here</a> to extend your license, then - go to <a href=\"%s\">License</a> tab and click on \"Re-activate\" button to re-activate your PRO version."
725
- msgstr ""
726
-
727
- #: doc/popup-by-supsystic-pro/license/mod.php:51
728
- msgid "License"
729
- msgstr ""
730
-
731
- #: doc/popup-by-supsystic-pro/license/mod.php:74
732
- msgid "Activate License"
733
- msgstr ""
734
-
735
- #: doc/popup-by-supsystic-pro/license/mod.php:76
736
- msgid "Renew License"
737
- msgstr ""
738
-
739
- #: doc/popup-by-supsystic-pro/license/models/license.php:54
740
- msgid "Please enter your License Key"
741
- msgstr ""
742
-
743
- #: doc/popup-by-supsystic-pro/license/models/license.php:56
744
- msgid "Please enter your Email address"
745
- msgstr ""
746
-
747
- #: doc/popup-by-supsystic-pro/license/models/license.php:131
748
- msgid "There was a problem with sending request to our authentication server. Please try later."
749
- msgstr ""
750
-
751
- #: doc/popup-by-supsystic-pro/license/models/license.php:154
752
- #, php-format
753
- msgid "License for plugin %s will expire today."
754
- msgstr ""
755
-
756
- #: doc/popup-by-supsystic-pro/license/models/license.php:156
757
- #, php-format
758
- msgid "License for plugin %s will expire tomorrow."
759
- msgstr ""
760
-
761
- #: doc/popup-by-supsystic-pro/license/models/license.php:158
762
- #, php-format
763
- msgid "License for plugin %s will expire in %d days."
764
- msgstr ""
765
-
766
- #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:4
767
- #, php-format
768
- msgid "Congratulations! PRO version of %s plugin has been activated and is working fine!"
769
- msgstr ""
770
-
771
- #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:6
772
- #, php-format
773
- msgid "Your license for PRO version of %s plugin has expired. You can <a href=\"%s\" target=\"_blank\">click here</a> to extend your license, then - click on \"Re-activate\" button to re-activate your PRO version."
774
- msgstr ""
775
-
776
- #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:8
777
- #, php-format
778
- msgid "Congratulations! You have successfully installed PRO version of %s plugin. Final step to finish Your PRO version setup - is to enter your Email and License Key on this page. This will activate Your copy of software on this site."
779
- msgstr ""
780
-
781
- #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:20
782
- msgid "Email"
783
- msgstr ""
784
-
785
- #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:23
786
- #, php-format
787
- msgid "Your email address, used on checkout procedure on <a href=\"%s\" target=\"_blank\">%s</a>"
788
- msgstr ""
789
-
790
- #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:31
791
- msgid "License Key"
792
- msgstr ""
793
-
794
- #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:34
795
- #, php-format
796
- msgid "Your License Key from your account on <a href=\"%s\" target=\"_blank\">%s</a>"
797
- msgstr ""
798
-
799
- #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:47
800
- msgid "Re-activate"
801
- msgstr ""
802
-
803
- #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:49
804
- msgid "Activate"
805
- msgstr ""
806
-
807
- #: doc/popup-by-supsystic-pro/login/controller.php:19
808
- msgid "Login Success!"
809
- msgstr ""
810
-
811
- #: doc/popup-by-supsystic-pro/login/controller.php:39
812
- msgid "Thank you for registration!"
813
- msgstr ""
814
-
815
- #: doc/popup-by-supsystic-pro/login/controller.php:43
816
- msgid "Confirmation link was sent to your email address. Check your email!"
817
- msgstr ""
818
-
819
- #: doc/popup-by-supsystic-pro/login/mod.php:13
820
- msgid "Login/Registration"
821
- msgstr ""
822
-
823
- #: doc/popup-by-supsystic-pro/login/mod.php:30
824
- msgid "E-Mail"
825
- msgstr ""
826
-
827
- #: doc/popup-by-supsystic-pro/login/mod.php:32
828
- msgid "Username"
829
- msgstr ""
830
-
831
- #: doc/popup-by-supsystic-pro/login/mod.php:34
832
- msgid "Password"
833
- msgstr ""
834
-
835
- #: doc/popup-by-supsystic-pro/login/models/login.php:80
836
- msgid "Empty or invalid username"
837
- msgstr ""
838
-
839
- #: doc/popup-by-supsystic-pro/login/models/login.php:85
840
- msgid "Empty or invalid password"
841
- msgstr ""
842
-
843
- #: doc/popup-by-supsystic-pro/login/views/login.php:9
844
- msgid "Text"
845
- msgstr ""
846
-
847
- #: doc/popup-by-supsystic-pro/login/views/login.php:10
848
- msgid "Text area"
849
- msgstr ""
850
-
851
- #: doc/popup-by-supsystic-pro/login/views/login.php:11
852
- msgid "Select box"
853
- msgstr ""
854
-
855
- #: doc/popup-by-supsystic-pro/login/views/login.php:12
856
- msgid "Hidden Field"
857
- msgstr ""
858
-
859
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:1
860
- msgid "This option will replace Subscribe form with Login / Registration forms"
861
- msgstr ""
862
-
863
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:8
864
- msgid "Enable Login"
865
- msgstr ""
866
-
867
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:15
868
- msgid "Login by"
869
- msgstr ""
870
-
871
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:16
872
- msgid "Choose what info needs to be entered for login. Password will be included by default."
873
- msgstr ""
874
-
875
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:35
876
- msgid "Redirect after login URL"
877
- msgstr ""
878
-
879
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:36
880
- msgid "You can enable redirection after login, just enter here URL that you want to redirect to after login - and user will be redirected there. If you don't need this feature - just leave this field empty: browser window will be just reloaded after successful login."
881
- msgstr ""
882
-
883
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:46
884
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:85
885
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:234
886
- msgid "Open in a new window (tab)"
887
- msgstr ""
888
-
889
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:52
890
- msgid "Login button name"
891
- msgstr ""
892
-
893
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:56
894
- msgid "Login"
895
- msgstr ""
896
-
897
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:67
898
- msgid "Enable Registration"
899
- msgstr ""
900
-
901
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:74
902
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:223
903
- msgid "Redirect after registration URL"
904
- msgstr ""
905
-
906
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:75
907
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:224
908
- msgid "You can enable redirection after registration, just enter here URL that you want to redirect to after registration - and user will be redirected there. If you don't need this feature - just leave this field empty."
909
- msgstr ""
910
-
911
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:91
912
- msgid "Create user with the chosen role after registration"
913
- msgstr ""
914
-
915
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:92
916
- msgid "Use this only if you really need it. Remember! After you change this option - your new users will have more privileges than usual subscribers, so be careful with this option!"
917
- msgstr ""
918
-
919
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:102
920
- msgid "Create User without confirmation"
921
- msgstr ""
922
-
923
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:103
924
- msgid "Usually, after user registration, we send an email with the confirmation link - to confirm the email address, and only after user clicks on the link from this email - we will create a new user. This option allows you to create user - right after registration, without the email confirmation process."
925
- msgstr ""
926
-
927
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:112
928
- msgid "Export Users"
929
- msgstr ""
930
-
931
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:113
932
- msgid "Export all users, who registered using your PopUp, as CSV file."
933
- msgstr ""
934
-
935
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:116
936
- msgid "Get CSV List"
937
- msgstr ""
938
-
939
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:121
940
- msgid "Registration button name"
941
- msgstr ""
942
-
943
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:125
944
- msgid "Register"
945
- msgstr ""
946
-
947
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:132
948
- msgid "Registration fields"
949
- msgstr ""
950
-
951
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:133
952
- msgid "To change field position - just drag-&-drop it to required place between other fields. To add new field to Registration form - click on \"+ Add\" button."
953
- msgstr ""
954
-
955
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:182
956
- msgid "Add"
957
- msgstr ""
958
-
959
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:190
960
- msgid "\"Confirmation sent\" message"
961
- msgstr ""
962
-
963
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:191
964
- msgid "This is the message that the user will see after registration, when letter with confirmation link was sent."
965
- msgstr ""
966
-
967
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:201
968
- msgid "Registration success message"
969
- msgstr ""
970
-
971
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:202
972
- msgid "Right after new user will be created and confirmed - this message will be shown."
973
- msgstr ""
974
-
975
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:212
976
- msgid "Email error message"
977
- msgstr ""
978
-
979
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:213
980
- msgid "If email that was entered by user is invalid, user will see this message"
981
- msgstr ""
982
-
983
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:217
984
- msgid "Empty or invalid email"
985
- msgstr ""
986
-
987
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:240
988
- msgid "Confirmation email subject"
989
- msgstr ""
990
-
991
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:241
992
- msgid "Email with confirmation link subject"
993
- msgstr ""
994
-
995
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:247
996
- msgid "Confirm registration on [sitename]"
997
- msgstr ""
998
-
999
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:253
1000
- msgid "Confirmation email From field"
1001
- msgstr ""
1002
-
1003
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:254
1004
- msgid "Email with confirmation link From field"
1005
- msgstr ""
1006
-
1007
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:266
1008
- msgid "Confirmation email text"
1009
- msgstr ""
1010
-
1011
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:267
1012
- msgid "Email with confirmation link content"
1013
- msgstr ""
1014
-
1015
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:269
1016
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:310
1017
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:338
1018
- #, php-format
1019
- msgid "You can use next variables here: %s"
1020
- msgstr ""
1021
-
1022
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:275
1023
- msgid "You registered on site <a href=\"[siteurl]\">[sitename]</a>. Follow <a href=\"[confirm_link]\">this link</a> to complete your registration. If you did not register here - just ignore this message."
1024
- msgstr ""
1025
-
1026
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:281
1027
- msgid "New Member email subject"
1028
- msgstr ""
1029
-
1030
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:282
1031
- msgid "Email to New Member subject"
1032
- msgstr ""
1033
-
1034
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:288
1035
- msgid "[sitename] Your username and password"
1036
- msgstr ""
1037
-
1038
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:294
1039
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:295
1040
- msgid "New Member email From field"
1041
- msgstr ""
1042
-
1043
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:307
1044
- msgid "New Member email text"
1045
- msgstr ""
1046
-
1047
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:308
1048
- msgid "Email to New Member content"
1049
- msgstr ""
1050
-
1051
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:316
1052
- msgid "Username: [user_login]<br />Password: [password]<br />[login_url]"
1053
- msgstr ""
1054
-
1055
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:322
1056
- msgid "New Member Notification"
1057
- msgstr ""
1058
-
1059
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:323
1060
- msgid "Enter the email addresses that should receive notifications (separate by comma). Leave it blank - and you will not get any notifications."
1061
- msgstr ""
1062
-
1063
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:335
1064
- msgid "New Member Notification email text"
1065
- msgstr ""
1066
-
1067
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:336
1068
- msgid "Message that you will receive about new members on your site."
1069
- msgstr ""
1070
-
1071
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:345
1072
- msgid "You have new member on your site <a href=\"[siteurl]\">[sitename]</a>, here us member information:<br />[subscriber_data]"
1073
- msgstr ""
1074
-
1075
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:352
1076
- msgid "Registration Field Settings"
1077
- msgstr ""
1078
-
1079
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:356
1080
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:405
1081
- msgid "Name"
1082
- msgstr ""
1083
-
1084
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:357
1085
- #, php-format
1086
- msgid "Name (key) for your field. This parameter is for system - to be able to determine the field. Use here only latin letters, numbers and symbols -_+. For more info about this parameter - your can check <a href=\"%s\" target=\"_blank\">this page</a>."
1087
- msgstr ""
1088
-
1089
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:366
1090
- msgid "Label that will be visible for your members."
1091
- msgstr ""
1092
-
1093
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:374
1094
- msgid "Value"
1095
- msgstr ""
1096
-
1097
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:375
1098
- msgid "Default value for your field"
1099
- msgstr ""
1100
-
1101
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:383
1102
- msgid "Html Type"
1103
- msgstr ""
1104
-
1105
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:384
1106
- msgid "This parameter will show - how we must render this field."
1107
- msgstr ""
1108
-
1109
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:394
1110
- msgid "Select Options"
1111
- msgstr ""
1112
-
1113
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:412
1114
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:436
1115
- msgid "Remove"
1116
- msgstr ""
1117
-
1118
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:421
1119
- msgid "Mandatory"
1120
- msgstr ""
1121
-
1122
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:422
1123
- msgid "Is this field mandatory to fill-in. If yes - then users will not be able to continue without filling-in this field."
1124
- msgstr ""
1125
-
1126
- #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:433
1127
- msgid "Settings"
1128
- msgstr ""
1129
-
1130
- #: doc/popup-by-supsystic-pro/mailrelay/mod.php:9
1131
- msgid "Mailrelay"
1132
- msgstr ""
1133
-
1134
- #: doc/popup-by-supsystic-pro/mailrelay/models/mailrelay.php:15
1135
- msgid "You have no lists. Login to your Mailrelay account and create your first list before start using this functionality."
1136
- msgstr ""
1137
-
1138
- #: doc/popup-by-supsystic-pro/mailrelay/models/mailrelay.php:159
1139
- msgid "Failed to create subscriber."
1140
- msgstr ""
1141
-
1142
- #: doc/popup-by-supsystic-pro/mailrelay/models/mailrelay.php:165
1143
- msgid "Can not detect Host and API key. Contact site owner to resolve this issue."
1144
- msgstr ""
1145
-
1146
- #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:4
1147
- msgid "Mailrelay not supported"
1148
- msgstr ""
1149
-
1150
- #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:8
1151
- msgid "Mailrelay is not supported on your server"
1152
- msgstr ""
1153
-
1154
- #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:14
1155
- msgid "Mailrelay Host"
1156
- msgstr ""
1157
-
1158
- #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:15
1159
- msgid "Please enter the host that you have in your Mairelay welcome email. Please enter it without the initial http:// (for example demo.ip-zone.com)"
1160
- msgstr ""
1161
-
1162
- #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:34
1163
- msgid "Mailrelay API Key"
1164
- msgstr ""
1165
-
1166
- #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:35
1167
- msgid "Please enter your API key. You can generate your API key on your Mailrelay panel, Configuration -> API access -> Generate API key"
1168
- msgstr ""
1169
-
1170
- #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:47
1171
- msgid "To create new groups in Mailrelay, you must login into the control panel and click into the Mail Relay > Subscribers groups. Once there you can add a new group for your Wordpress users, or edit an existing one"
1172
- msgstr ""
1173
-
1174
- #: doc/popup-by-supsystic-pro/on_exit/views/tpl/onExitAdminOption.php:1
1175
- #, php-format
1176
- msgid "Show when user tries to exit from your site. <a target=\"_blank\" href=\"%s\">Check example.</a>"
1177
- msgstr ""
1178
-
1179
- #: doc/popup-by-supsystic-pro/on_exit/views/tpl/onExitAdminOption.php:5
1180
- msgid "On Exit from Site"
1181
- msgstr ""
1182
-
1183
- #: doc/popup-by-supsystic-pro/salesforce/mod.php:11
1184
- msgid "SalesForce - Web-to-Lead"
1185
- msgstr ""
1186
-
1187
- #: doc/popup-by-supsystic-pro/salesforce/views/tpl/sfAdminFields.php:14
1188
- msgid "Form ID"
1189
- msgstr ""
1190
-
1191
- #: doc/popup-by-supsystic-pro/salesforce/views/tpl/sfAdminFields.php:15
1192
- #, php-format
1193
- msgid "Generate your lead form in your Salesforce account (more about generating form you can read <a target=\"_blank\" href=\"%s\">here</a>), then copy \"oid\" value from it (<a target=\"_blank\" href=\"%s\">like this</a>) and insert it into this paramter"
1194
- msgstr ""
1195
-
1196
- #: doc/popup-by-supsystic-pro/sendgrid/mod.php:9
1197
- msgid "SendGrid"
1198
- msgstr ""
1199
-
1200
- #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:4
1201
- msgid "SendGrid not supported"
1202
- msgstr ""
1203
-
1204
- #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:8
1205
- msgid "SendGrid is not supported on your server"
1206
- msgstr ""
1207
-
1208
- #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:14
1209
- msgid "SendGrid Username"
1210
- msgstr ""
1211
-
1212
- #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:15
1213
- msgid "Your SendGrid name"
1214
- msgstr ""
1215
-
1216
- #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:25
1217
- msgid "SendGrid Password"
1218
- msgstr ""
1219
-
1220
- #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:26
1221
- msgid "Your SendGrid password"
1222
- msgstr ""
1223
-
1224
- #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:37
1225
- msgid "Select lists for subscribe. They are taken from your SendGrid account."
1226
- msgstr ""
1227
-
1228
- #: doc/popup-by-supsystic-pro/sgautorepondeur/mod.php:8
1229
- msgid "SG Autorepondeur"
1230
- msgstr ""
1231
-
1232
- #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:86
1233
- msgid "Required fields are missing"
1234
- msgstr ""
1235
-
1236
- #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:87
1237
- msgid "The email is already in the list"
1238
- msgstr ""
1239
-
1240
- #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:88
1241
- msgid "Registration was refused-blacklisted"
1242
- msgstr ""
1243
-
1244
- #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:89
1245
- msgid "The country has been blocked"
1246
- msgstr ""
1247
-
1248
- #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:90
1249
- msgid "Too many entries with the same IP address"
1250
- msgstr ""
1251
-
1252
- #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:91
1253
- msgid "Ok Register following a behavioral segmentation"
1254
- msgstr ""
1255
-
1256
- #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:94
1257
- msgid "The email is not the right format"
1258
- msgstr ""
1259
-
1260
- #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:95
1261
- msgid "Error on one of the variables - User ID or List ID or Activation Code"
1262
- msgstr ""
1263
-
1264
- #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:4
1265
- msgid "SG Autorepondeur not supported"
1266
- msgstr ""
1267
-
1268
- #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:8
1269
- msgid "SG Autorepondeur is not supported on your server"
1270
- msgstr ""
1271
-
1272
- #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:14
1273
- msgid "SG Autorepondeur User ID"
1274
- msgstr ""
1275
-
1276
- #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:15
1277
- #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:26
1278
- msgid "This info available on your home page in SG Autorepondeur"
1279
- msgstr ""
1280
-
1281
- #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:25
1282
- msgid "SG Autorepondeur List ID"
1283
- msgstr ""
1284
-
1285
- #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:36
1286
- msgid "SG Client Activation Code"
1287
- msgstr ""
1288
-
1289
- #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:37
1290
- msgid "This info available on the member's area in the top menu \"my account\" (at the bottom of the page)"
1291
- msgstr ""
1292
-
1293
- #: doc/popup-by-supsystic-pro/sub_fields/views/sub_fields.php:7
1294
- msgid "Selectbox"
1295
- msgstr ""
1296
-
1297
- #: doc/popup-by-supsystic-pro/sub_fields/views/sub_fields.php:8
1298
- msgid "Checkbox"
1299
- msgstr ""
1300
-
1301
- #: doc/popup-by-supsystic-pro/sub_fields/views/tpl/sfAdminControls.php:2
1302
- msgid "Subscribe Field Settings"
1303
- msgstr ""
1304
-
1305
- #: doc/popup-by-supsystic-pro/sub_fields/views/tpl/sfAdminControls.php:16
1306
- msgid "Label that will be visible for your subscribers."
1307
- msgstr ""
1308
-
1309
- #: doc/popup-by-supsystic-pro/sub_social/controller.php:9
1310
- msgid "PopUp ID is not specified."
1311
- msgstr ""
1312
-
1313
- #: doc/popup-by-supsystic-pro/sub_social/controller.php:13
1314
- msgid "Authorization code is not specified."
1315
- msgstr ""
1316
-
1317
- #: doc/popup-by-supsystic-pro/sub_social/controller.php:36
1318
- msgid "Subscribing"
1319
- msgstr ""
1320
-
1321
- #: doc/popup-by-supsystic-pro/sub_social/controller.php:45
1322
- msgid "Cannot get your email address"
1323
- msgstr ""
1324
-
1325
- #: doc/popup-by-supsystic-pro/sub_social/mod.php:75
1326
- msgid "Sign in with"
1327
- msgstr ""
1328
-
1329
- #: doc/popup-by-supsystic-pro/sub_social/mod.php:76
1330
- msgid "Facebook"
1331
- msgstr ""
1332
-
1333
- #: doc/popup-by-supsystic-pro/verticalresponse/mod.php:16
1334
- msgid "Vertical Response"
1335
- msgstr ""
1336
-
1337
- #: doc/popup-by-supsystic-pro/verticalresponse/models/verticalresponse.php:104
1338
- msgid "Can not access to Vertical Responce server"
1339
- msgstr ""
1340
-
1341
- #: doc/popup-by-supsystic-pro/verticalresponse/models/verticalresponse.php:106
1342
- msgid "Empty code returned"
1343
- msgstr ""
1344
-
1345
- #: doc/popup-by-supsystic-pro/verticalresponse/views/tpl/vrAdminFields.php:4
1346
- msgid "Vertical Response Setup"
1347
- msgstr ""
1348
-
1349
- #: doc/popup-by-supsystic-pro/verticalresponse/views/tpl/vrAdminFields.php:5
1350
- msgid "You must authorize to use Vertical Response features"
1351
- msgstr ""
1352
-
1353
- #: doc/popup-by-supsystic-pro/verticalresponse/views/tpl/vrAdminFields.php:8
1354
- msgid "Authorize in Vertical Response"
1355
- msgstr ""
1356
-
1357
- #: doc/popup-by-supsystic-pro/verticalresponse/views/tpl/vrAdminFields.php:15
1358
- msgid "Select lists for subscribe. They are taken from your Vertical Response account."
1359
- msgstr ""
1360
-
1361
- #: doc/promo-popup-by-supsystic-pro/get_response/views/tpl/grAdminFields.php:15
1362
- #, php-format
1363
- msgid "You can find it under your GetResponse Account -> GetResponse API, here is <a href=\"%s\" class=\"ppsGrHelpApiKeyLink\">help screenshot</a>"
1364
- msgstr ""
1365
-
1366
- #: doc/promo-popup-by-supsystic-pro/infusionsoft/views/tpl/isAdminFields.php:8
1367
- msgid "This module require to have cUrl library for PHP on server installed and PHP version to be at least 5.3. Please contact your hosting provider and ask them to enable cUrl for you, this is Free library, and check your PHP version."
1368
- msgstr ""
1369
-
1370
- #: doc/promo-popup-by-supsystic-pro/layered_popup/mod.php:10
1371
- msgid "Layered Style"
1372
- msgstr ""
1373
-
1374
- #: modules/adminmenu/mod.php:13
1375
- #, php-format
1376
- msgid "Cool WordPress plugins from supsystic.com developers. I tried %s - and this was what I need! #supsystic.com"
1377
- msgstr ""
1378
-
1379
- #: modules/adminmenu/mod.php:15
1380
- msgid "More plugins for your WordPress site here!"
1381
- msgstr ""
1382
-
1383
- #: modules/adminmenu/mod.php:16
1384
- #: modules/adminmenu/mod.php:17
1385
- #: modules/adminmenu/mod.php:18
1386
- msgid "Spread the word!"
1387
- msgstr ""
1388
-
1389
- #: modules/mail/controller.php:7
1390
- msgid "Now check your email inbox / spam folders for test mail."
1391
- msgstr ""
1392
-
1393
- #: modules/mail/mod.php:41
1394
- msgid "Cannot send email - problem with send server"
1395
- msgstr ""
1396
-
1397
- #: modules/mail/mod.php:54
1398
- msgid "Mail"
1399
- msgstr ""
1400
-
1401
- #: modules/mail/mod.php:56
1402
- msgid "Mail function tested and work"
1403
- msgstr ""
1404
-
1405
- #: modules/mail/mod.php:57
1406
- msgid "Notify Email"
1407
- msgstr ""
1408
-
1409
- #: modules/mail/mod.php:57
1410
- msgid "Email address used for all email notifications from plugin"
1411
- msgstr ""
1412
-
1413
- #: modules/mail/models/mail.php:7
1414
- msgid "Test email functionality"
1415
- msgstr ""
1416
-
1417
- #: modules/mail/models/mail.php:8
1418
- #, php-format
1419
- msgid "This is a test email for testing email functionality on your site, %s."
1420
- msgstr ""
1421
-
1422
- #: modules/mail/models/mail.php:15
1423
- msgid "Empty email address"
1424
- msgstr ""
1425
-
1426
- #: modules/mail/views/tpl/mailAdmin.php:3
1427
- msgid "Send test email to"
1428
- msgstr ""
1429
-
1430
- #: modules/mail/views/tpl/mailAdmin.php:10
1431
- msgid "Send test"
1432
- msgstr ""
1433
-
1434
- #: modules/mail/views/tpl/mailAdmin.php:12
1435
- msgid "This option allows you to check your server mail functionality"
1436
- msgstr ""
1437
-
1438
- #: modules/mail/views/tpl/mailAdmin.php:15
1439
- msgid "Did you receive test email?"
1440
- msgstr ""
1441
-
1442
- #: modules/mail/views/tpl/mailAdmin.php:18
1443
- msgid "Yes! It works!"
1444
- msgstr ""
1445
-
1446
- #: modules/mail/views/tpl/mailAdmin.php:22
1447
- msgid "No, I need to contact my hosting provider with mail function issue."
1448
- msgstr ""
1449
-
1450
- #: modules/mail/views/tpl/mailAdmin.php:26
1451
- msgid "Great! Mail function was tested and is working fine."
1452
- msgstr ""
1453
-
1454
- #: modules/mail/views/tpl/mailAdmin.php:29
1455
- msgid "Bad, please contact your hosting provider and ask them to setup mail functionality on your server."
1456
- msgstr ""
1457
-
1458
- #: modules/mail/views/tpl/mailAdmin.php:47
1459
- #: modules/options/views/tpl/optionsSettingsTabContent.php:44
1460
- #, php-format
1461
- msgid "Turned On %s"
1462
- msgstr ""
1463
-
1464
- #: modules/mail/views/tpl/mailAdmin.php:48
1465
- #: modules/options/views/tpl/optionsSettingsTabContent.php:45
1466
- #, php-format
1467
- msgid "Turned Off %s"
1468
- msgstr ""
1469
-
1470
- #: modules/mail/views/tpl/mailAdmin.php:69
1471
- #: modules/options/views/tpl/optionsSettingsTabContent.php:6
1472
- msgid "Save"
1473
- msgstr ""
1474
-
1475
- #: modules/options/mod.php:114
1476
- msgid "General"
1477
- msgstr ""
1478
-
1479
- #: modules/options/mod.php:116
1480
- msgid "Send usage statistics"
1481
- msgstr ""
1482
-
1483
- #: modules/options/mod.php:116
1484
- msgid "Send information about what plugin options you prefer to use, this will help us make our solution better for You."
1485
- msgstr ""
1486
-
1487
- #: modules/options/mod.php:117
1488
- msgid "Disable blocking Subscription from same IP"
1489
- msgstr ""
1490
-
1491
- #: modules/options/mod.php:117
1492
- msgid "By default our plugin have feature to block subscriptions from same IP more then one time per hour - to avoid spam subscribers. But you can disable this feature here."
1493
- msgstr ""
1494
-
1495
- #: modules/options/mod.php:118
1496
- msgid "Disable autosave on PopUp Edit"
1497
- msgstr ""
1498
-
1499
- #: modules/options/mod.php:118
1500
- msgid "By default our plugin will make autosave all your changes that you do in PopUp edit screen, but you can disable this feature here. Just don't forget to save your PopUp each time you make any changes in it."
1501
- msgstr ""
1502
-
1503
- #: modules/options/mod.php:119
1504
- msgid "Enable promo link"
1505
- msgstr ""
1506
-
1507
- #: modules/options/mod.php:119
1508
- msgid "We are trying to make our plugin better for you, and you can help us with this. Just check this option - and small promotion link will be added in the bottom of your PopUp. This is easy for you - but very helpful for us!"
1509
- msgstr ""
1510
-
1511
- #: modules/options/mod.php:120
1512
- msgid "User role can use plugin"
1513
- msgstr ""
1514
-
1515
- #: modules/options/mod.php:120
1516
- msgid "User with next roles will have access to whole plugin from admin area."
1517
- msgstr ""
1518
-
1519
- #: modules/options/mod.php:121
1520
- msgid "Load Assets in Footer"
1521
- msgstr ""
1522
-
1523
- #: modules/options/mod.php:121
1524
- msgid "Force load all plugin CSS and JavaScript files in footer - to increase page load speed. Please make sure that you have correct footer.php file in your WordPress theme with wp_footer() function call in it."
1525
- msgstr ""
1526
-
1527
- #: modules/options/models/modules.php:35
1528
- msgid "Module Updated"
1529
- msgstr ""
1530
-
1531
- #: modules/options/models/modules.php:50
1532
- msgid "Module Update Failed"
1533
- msgstr ""
1534
-
1535
- #: modules/options/models/modules.php:53
1536
- msgid "Error module ID"
1537
- msgstr ""
1538
-
1539
- #: modules/options/models/options.php:64
1540
- msgid "Empty data to save option"
1541
- msgstr ""
1542
-
1543
- #: modules/options/views/tpl/optionsAdminMain.php:18
1544
- msgid "Main page Go here!!!!"
1545
- msgstr ""
1546
-
1547
- #: modules/options/views/tpl/optionsAdminPage.php:35
1548
- msgid "Improve Free version"
1549
- msgstr ""
1550
-
1551
- #: modules/options/views/tpl/optionsAdminPage.php:37
1552
- #, php-format
1553
- msgid "Please be advised that this template with all other options and PRO templates is available only in <a target=\"_blank\" href=\"%s\">PRO version</a>. You can <a target=\"_blank\" href=\"%s\" class=\"button\">Get PRO</a> today and get this and other PRO templates and features for your PopUps!"
1554
- msgstr ""
1555
-
1556
- #: modules/options/views/tpl/optionsAdminPage.php:40
1557
- #, php-format
1558
- msgid "Please be advised that this option is available only in <a target=\"_blank\" href=\"%s\">PRO version</a>. You can <a target=\"_blank\" href=\"%s\" class=\"button\">Get PRO</a> today and get this and other PRO option for your PopUps!"
1559
- msgstr ""
1560
-
1561
- #: modules/options/views/tpl/optionsSettingsTabContent.php:3
1562
- msgid "Save all options"
1563
- msgstr ""
1564
-
1565
- #: modules/options/views/tpl/optionsSettingsTabContent.php:52
1566
- msgid "PRO option"
1567
- msgstr ""
1568
-
1569
- #: modules/pages/views/tpl/deactivatePage.php:33
1570
- msgid "Delete Plugin Data (options, setup data, database tables, etc.)"
1571
- msgstr ""
1572
-
1573
- #: modules/popup/controller.php:22
1574
- msgid "Yes"
1575
- msgstr ""
1576
-
1577
- #: modules/popup/controller.php:22
1578
- msgid "No"
1579
- msgstr ""
1580
-
1581
- #: modules/popup/controller.php:257
1582
- msgid "Done, redirecting to new PopUp..."
1583
- msgstr ""
1584
-
1585
- #: modules/popup/mod.php:20
1586
- msgid "Add New PopUp"
1587
- msgstr ""
1588
-
1589
- #: modules/popup/mod.php:23
1590
- msgid "Edit"
1591
- msgstr ""
1592
-
1593
- #: modules/popup/mod.php:26
1594
- msgid "Show All PopUps"
1595
- msgstr ""
1596
-
1597
- #: modules/popup/mod.php:371
1598
- msgid "PopUp"
1599
- msgstr ""
1600
-
1601
- #: modules/popup/models/popup.php:98
1602
- msgid "img/preview/"
1603
- msgstr ""
1604
-
1605
- #: modules/popup/models/popup.php:151
1606
- msgid "Please select PopUp template from list below"
1607
- msgstr ""
1608
-
1609
- #: modules/popup/models/popup.php:153
1610
- #: modules/popup/models/popup.php:534
1611
- msgid "Please enter Name"
1612
- msgstr ""
1613
-
1614
- #: modules/popup/models/popup.php:186
1615
- msgid "Enter your Facebook page URL"
1616
- msgstr ""
1617
-
1618
- #: modules/popup/models/popup.php:193
1619
- msgid "Enter your video URL"
1620
- msgstr ""
1621
-
1622
- #: modules/popup/models/popup.php:344
1623
- msgid "Common"
1624
- msgstr ""
1625
-
1626
- #: modules/popup/models/popup.php:345
1627
- msgid "Facebook Like"
1628
- msgstr ""
1629
-
1630
- #: modules/popup/models/popup.php:346
1631
- msgid "Video"
1632
- msgstr ""
1633
-
1634
- #: modules/popup/models/popup.php:347
1635
- msgid "iFrame"
1636
- msgstr ""
1637
-
1638
- #: modules/popup/models/popup.php:348
1639
- msgid "Simple HTML"
1640
- msgstr ""
1641
-
1642
- #: modules/popup/models/popup.php:349
1643
- msgid "PDF"
1644
- msgstr ""
1645
-
1646
- #: modules/popup/models/popup.php:350
1647
- msgid "Age Verification"
1648
- msgstr ""
1649
-
1650
- #: modules/popup/models/popup.php:351
1651
- msgid "Full Screen"
1652
- msgstr ""
1653
-
1654
- #: modules/popup/models/popup.php:352
1655
- msgid "Login / Registration"
1656
- msgstr ""
1657
-
1658
- #: modules/popup/models/popup.php:353
1659
- msgid "Notification Bar"
1660
- msgstr ""
1661
-
1662
- #: modules/popup/models/popup.php:395
1663
- msgid "Provided data was corrupted"
1664
- msgstr ""
1665
-
1666
- #: modules/popup/models/popup.php:560
1667
- msgid "Name can not be empty"
1668
- msgstr ""
1669
-
1670
- #: modules/popup/models/popup.php:575
1671
- #: modules/popup/models/popup.php:589
1672
- #: modules/popup/models/popup.php:668
1673
- #: modules/popup/models/popup.php:671
1674
- #: modules/popup/models/popup.php:700
1675
- msgid "Left side background"
1676
- msgstr ""
1677
-
1678
- #: modules/popup/models/popup.php:576
1679
- #: modules/popup/models/popup.php:586
1680
- #: modules/popup/models/popup.php:590
1681
- #: modules/popup/models/popup.php:632
1682
- #: modules/popup/models/popup.php:672
1683
- #: modules/popup/models/popup.php:701
1684
- msgid "Right side background"
1685
- msgstr ""
1686
-
1687
- #: modules/popup/models/popup.php:577
1688
- msgid "Subscribe button background"
1689
- msgstr ""
1690
-
1691
- #: modules/popup/models/popup.php:580
1692
- #: modules/popup/models/popup.php:584
1693
- #: modules/popup/models/popup.php:594
1694
- #: modules/popup/models/popup.php:603
1695
- #: modules/popup/models/popup.php:607
1696
- #: modules/popup/models/popup.php:616
1697
- #: modules/popup/models/popup.php:620
1698
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:158
1699
- msgid "Background"
1700
- msgstr ""
1701
-
1702
- #: modules/popup/models/popup.php:581
1703
- msgid "Sign up button background"
1704
- msgstr ""
1705
-
1706
- #: modules/popup/models/popup.php:585
1707
- #: modules/popup/models/popup.php:591
1708
- #: modules/popup/models/popup.php:595
1709
- #: modules/popup/models/popup.php:600
1710
- #: modules/popup/models/popup.php:604
1711
- #: modules/popup/models/popup.php:608
1712
- #: modules/popup/models/popup.php:613
1713
- #: modules/popup/models/popup.php:617
1714
- #: modules/popup/models/popup.php:633
1715
- #: modules/popup/models/popup.php:639
1716
- #: modules/popup/models/popup.php:644
1717
- #: modules/popup/models/popup.php:649
1718
- #: modules/popup/models/popup.php:655
1719
- #: modules/popup/models/popup.php:667
1720
- #: modules/popup/models/popup.php:673
1721
- #: modules/popup/models/popup.php:696
1722
- #: modules/popup/models/popup.php:702
1723
- #: modules/popup/models/popup.php:712
1724
- #: modules/popup/models/popup.php:719
1725
- #: modules/popup/models/popup.php:723
1726
- #: modules/popup/models/popup.php:736
1727
- #: modules/popup/models/popup.php:747
1728
- #: modules/popup/models/popup.php:752
1729
- #: modules/popup/models/popup.php:757
1730
- #: modules/popup/models/popup.php:765
1731
- #: modules/popup/models/popup.php:770
1732
- msgid "Button background"
1733
- msgstr ""
1734
-
1735
- #: modules/popup/models/popup.php:598
1736
- msgid "Main Background"
1737
- msgstr ""
1738
-
1739
- #: modules/popup/models/popup.php:599
1740
- msgid "Down background"
1741
- msgstr ""
1742
-
1743
- #: modules/popup/models/popup.php:611
1744
- msgid "Left Side Background"
1745
- msgstr ""
1746
-
1747
- #: modules/popup/models/popup.php:612
1748
- msgid "Right Side background"
1749
- msgstr ""
1750
-
1751
- #: modules/popup/models/popup.php:621
1752
- msgid "Sign-up button background"
1753
- msgstr ""
1754
-
1755
- #: modules/popup/models/popup.php:622
1756
- #: modules/popup/models/popup.php:684
1757
- msgid "Close button background"
1758
- msgstr ""
1759
-
1760
- #: modules/popup/models/popup.php:625
1761
- #: modules/popup/models/popup.php:630
1762
- #: modules/popup/models/popup.php:636
1763
- #: modules/popup/models/popup.php:643
1764
- #: modules/popup/models/popup.php:648
1765
- #: modules/popup/models/popup.php:653
1766
- #: modules/popup/models/popup.php:658
1767
- #: modules/popup/models/popup.php:666
1768
- #: modules/popup/models/popup.php:677
1769
- #: modules/popup/models/popup.php:683
1770
- #: modules/popup/models/popup.php:689
1771
- #: modules/popup/models/popup.php:695
1772
- #: modules/popup/models/popup.php:705
1773
- #: modules/popup/models/popup.php:711
1774
- #: modules/popup/models/popup.php:715
1775
- #: modules/popup/models/popup.php:722
1776
- #: modules/popup/models/popup.php:726
1777
- #: modules/popup/models/popup.php:730
1778
- #: modules/popup/models/popup.php:735
1779
- #: modules/popup/models/popup.php:740
1780
- #: modules/popup/models/popup.php:745
1781
- #: modules/popup/models/popup.php:750
1782
- #: modules/popup/models/popup.php:755
1783
- #: modules/popup/models/popup.php:760
1784
- #: modules/popup/models/popup.php:764
1785
- #: modules/popup/models/popup.php:768
1786
- msgid "Main background"
1787
- msgstr ""
1788
-
1789
- #: modules/popup/models/popup.php:626
1790
- #: modules/popup/models/popup.php:650
1791
- #: modules/popup/models/popup.php:685
1792
- msgid "Middle side background"
1793
- msgstr ""
1794
-
1795
- #: modules/popup/models/popup.php:627
1796
- msgid "Down side background"
1797
- msgstr ""
1798
-
1799
- #: modules/popup/models/popup.php:631
1800
- msgid "Fields background"
1801
- msgstr ""
1802
-
1803
- #: modules/popup/models/popup.php:637
1804
- msgid "Left picture background"
1805
- msgstr ""
1806
-
1807
- #: modules/popup/models/popup.php:638
1808
- msgid "Background image"
1809
- msgstr ""
1810
-
1811
- #: modules/popup/models/popup.php:640
1812
- #: modules/popup/models/popup.php:654
1813
- #: modules/popup/models/popup.php:662
1814
- #: modules/popup/models/popup.php:734
1815
- msgid "Additional background"
1816
- msgstr ""
1817
-
1818
- #: modules/popup/models/popup.php:645
1819
- #: modules/popup/models/popup.php:727
1820
- #: modules/popup/models/popup.php:731
1821
- #: modules/popup/models/popup.php:761
1822
- msgid "Frame background"
1823
- msgstr ""
1824
-
1825
- #: modules/popup/models/popup.php:659
1826
- msgid "Exit button background"
1827
- msgstr ""
1828
-
1829
- #: modules/popup/models/popup.php:660
1830
- #: modules/popup/models/popup.php:707
1831
- #: modules/popup/models/popup.php:771
1832
- msgid "Left image background"
1833
- msgstr ""
1834
-
1835
- #: modules/popup/models/popup.php:661
1836
- #: modules/popup/models/popup.php:686
1837
- #: modules/popup/models/popup.php:690
1838
- msgid "Submit button background"
1839
- msgstr ""
1840
-
1841
- #: modules/popup/models/popup.php:663
1842
- #: modules/popup/models/popup.php:717
1843
- msgid "Right image background"
1844
- msgstr ""
1845
-
1846
- #: modules/popup/models/popup.php:674
1847
- #: modules/popup/models/popup.php:679
1848
- #: modules/popup/models/popup.php:697
1849
- #: modules/popup/models/popup.php:746
1850
- #: modules/popup/models/popup.php:751
1851
- #: modules/popup/models/popup.php:756
1852
- msgid "Image background"
1853
- msgstr ""
1854
-
1855
- #: modules/popup/models/popup.php:678
1856
- #: modules/popup/models/popup.php:706
1857
- #: modules/popup/models/popup.php:769
1858
- msgid "Field background"
1859
- msgstr ""
1860
-
1861
- #: modules/popup/models/popup.php:680
1862
- msgid "Go button background"
1863
- msgstr ""
1864
-
1865
- #: modules/popup/models/popup.php:691
1866
- msgid "Right Image background"
1867
- msgstr ""
1868
-
1869
- #: modules/popup/models/popup.php:692
1870
- msgid "Right background"
1871
- msgstr ""
1872
-
1873
- #: modules/popup/models/popup.php:708
1874
- msgid "Get it now button background"
1875
- msgstr ""
1876
-
1877
- #: modules/popup/models/popup.php:716
1878
- #: modules/popup/models/popup.php:739
1879
- msgid "Upper background"
1880
- msgstr ""
1881
-
1882
- #: modules/popup/models/popup.php:718
1883
- msgid "Bottom background"
1884
- msgstr ""
1885
-
1886
- #: modules/popup/models/popup.php:741
1887
- msgid "Yes button background"
1888
- msgstr ""
1889
-
1890
- #: modules/popup/models/popup.php:742
1891
- msgid "No button background"
1892
- msgstr ""
1893
-
1894
- #: modules/popup/views/popup.php:42
1895
- msgid "Modify PopUp Template"
1896
- msgstr ""
1897
-
1898
- #: modules/popup/views/popup.php:52
1899
- msgid "Cannot find required PopUp"
1900
- msgstr ""
1901
-
1902
- #: modules/popup/views/popup.php:89
1903
- msgid "Available in PRO version"
1904
- msgstr ""
1905
-
1906
- #: modules/popup/views/popup.php:92
1907
- #: modules/popup/views/popup.php:393
1908
- #: modules/popup/views/popup.php:743
1909
- msgid "None"
1910
- msgstr ""
1911
-
1912
- #: modules/popup/views/popup.php:93
1913
- msgid "Image"
1914
- msgstr ""
1915
-
1916
- #: modules/popup/views/popup.php:94
1917
- msgid "Color"
1918
- msgstr ""
1919
-
1920
- #: modules/popup/views/popup.php:98
1921
- msgid "Mobile"
1922
- msgstr ""
1923
-
1924
- #: modules/popup/views/popup.php:99
1925
- msgid "Tablet"
1926
- msgstr ""
1927
-
1928
- #: modules/popup/views/popup.php:100
1929
- msgid "Desktop PC"
1930
- msgstr ""
1931
-
1932
- #: modules/popup/views/popup.php:118
1933
- msgid "Main Home page"
1934
- msgstr ""
1935
-
1936
- #: modules/popup/views/popup.php:207
1937
- msgid "Appearance"
1938
- msgstr ""
1939
-
1940
- #: modules/popup/views/popup.php:212
1941
- msgid "Popup Opening Animation"
1942
- msgstr ""
1943
-
1944
- #: modules/popup/views/popup.php:219
1945
- msgid "Texts"
1946
- msgstr ""
1947
-
1948
- #: modules/popup/views/popup.php:226
1949
- msgid "Social"
1950
- msgstr ""
1951
-
1952
- #: modules/popup/views/popup.php:237
1953
- msgid "Main"
1954
- msgstr ""
1955
-
1956
- #: modules/popup/views/popup.php:242
1957
- msgid "Design"
1958
- msgstr ""
1959
-
1960
- #: modules/popup/views/popup.php:247
1961
- msgid "CSS / HTML Code"
1962
- msgstr ""
1963
-
1964
- #: modules/popup/views/popup.php:254
1965
- msgid "Subscribe"
1966
- msgstr ""
1967
-
1968
- #: modules/popup/views/popup.php:278
1969
- msgid "Facebook page URL"
1970
- msgstr ""
1971
-
1972
- #: modules/popup/views/popup.php:280
1973
- msgid "The absolute URL of the Facebook Page that will be liked. This is a required setting."
1974
- msgstr ""
1975
-
1976
- #: modules/popup/views/popup.php:282
1977
- msgid "Color scheme"
1978
- msgstr ""
1979
-
1980
- #: modules/popup/views/popup.php:284
1981
- msgid "Light"
1982
- msgstr ""
1983
-
1984
- #: modules/popup/views/popup.php:284
1985
- msgid "Dark"
1986
- msgstr ""
1987
-
1988
- #: modules/popup/views/popup.php:285
1989
- msgid "The color scheme used by the plugin. Can be \"light\" or \"dark\"."
1990
- msgstr ""
1991
-
1992
- #: modules/popup/views/popup.php:287
1993
- msgid "Force wall"
1994
- msgstr ""
1995
-
1996
- #: modules/popup/views/popup.php:289
1997
- msgid "For \"place\" Pages (Pages that have a physical location that can be used with check-ins), this specifies whether the stream contains posts by the Page or just check-ins from friends."
1998
- msgstr ""
1999
-
2000
- #: modules/popup/views/popup.php:291
2001
- msgid "Header"
2002
- msgstr ""
2003
-
2004
- #: modules/popup/views/popup.php:293
2005
- msgid "Specifies whether to display the Facebook header at the top of the plugin."
2006
- msgstr ""
2007
-
2008
- #: modules/popup/views/popup.php:295
2009
- msgid "Show border"
2010
- msgstr ""
2011
-
2012
- #: modules/popup/views/popup.php:297
2013
- msgid "Specifies whether or not to show a border around the plugin."
2014
- msgstr ""
2015
-
2016
- #: modules/popup/views/popup.php:299
2017
- msgid "Show faces"
2018
- msgstr ""
2019
-
2020
- #: modules/popup/views/popup.php:301
2021
- msgid "Specifies whether to display profile photos of people who like the page."
2022
- msgstr ""
2023
-
2024
- #: modules/popup/views/popup.php:303
2025
- msgid "Stream"
2026
- msgstr ""
2027
-
2028
- #: modules/popup/views/popup.php:305
2029
- msgid "Specifies whether to display a stream of the latest posts by the Page."
2030
- msgstr ""
2031
-
2032
- #: modules/popup/views/popup.php:357
2033
- msgid "None - use Standard PopUp Social Buttons"
2034
- msgstr ""
2035
-
2036
- #: modules/popup/views/popup.php:394
2037
- msgid "Puff"
2038
- msgstr ""
2039
-
2040
- #: modules/popup/views/popup.php:395
2041
- msgid "Vanish"
2042
- msgstr ""
2043
-
2044
- #: modules/popup/views/popup.php:397
2045
- msgid "Open down left"
2046
- msgstr ""
2047
-
2048
- #: modules/popup/views/popup.php:398
2049
- msgid "Open down right"
2050
- msgstr ""
2051
-
2052
- #: modules/popup/views/popup.php:400
2053
- msgid "Perspective down"
2054
- msgstr ""
2055
-
2056
- #: modules/popup/views/popup.php:401
2057
- msgid "Perspective up"
2058
- msgstr ""
2059
-
2060
- #: modules/popup/views/popup.php:403
2061
- msgid "Slide down"
2062
- msgstr ""
2063
-
2064
- #: modules/popup/views/popup.php:404
2065
- msgid "Slide up"
2066
- msgstr ""
2067
-
2068
- #: modules/popup/views/popup.php:406
2069
- msgid "Swash"
2070
- msgstr ""
2071
-
2072
- #: modules/popup/views/popup.php:407
2073
- msgid "Foolis"
2074
- msgstr ""
2075
-
2076
- #: modules/popup/views/popup.php:409
2077
- msgid "Tin right"
2078
- msgstr ""
2079
-
2080
- #: modules/popup/views/popup.php:410
2081
- msgid "Tin left"
2082
- msgstr ""
2083
-
2084
- #: modules/popup/views/popup.php:411
2085
- msgid "Tin up"
2086
- msgstr ""
2087
-
2088
- #: modules/popup/views/popup.php:412
2089
- msgid "Tin down"
2090
- msgstr ""
2091
-
2092
- #: modules/popup/views/popup.php:414
2093
- msgid "Boing"
2094
- msgstr ""
2095
-
2096
- #: modules/popup/views/popup.php:416
2097
- msgid "Space right"
2098
- msgstr ""
2099
-
2100
- #: modules/popup/views/popup.php:417
2101
- msgid "Space left"
2102
- msgstr ""
2103
-
2104
- #: modules/popup/views/popup.php:418
2105
- msgid "Space up"
2106
- msgstr ""
2107
-
2108
- #: modules/popup/views/popup.php:419
2109
- msgid "Space down"
2110
- msgstr ""
2111
-
2112
- #: modules/popup/views/popup.php:426
2113
- msgid "Bounce"
2114
- msgstr ""
2115
-
2116
- #: modules/popup/views/popup.php:427
2117
- msgid "Bounce Up"
2118
- msgstr ""
2119
-
2120
- #: modules/popup/views/popup.php:428
2121
- msgid "Bounce Down"
2122
- msgstr ""
2123
-
2124
- #: modules/popup/views/popup.php:429
2125
- msgid "Bounce Left"
2126
- msgstr ""
2127
-
2128
- #: modules/popup/views/popup.php:430
2129
- msgid "Bounce Right"
2130
- msgstr ""
2131
-
2132
- #: modules/popup/views/popup.php:432
2133
- msgid "Fade"
2134
- msgstr ""
2135
-
2136
- #: modules/popup/views/popup.php:433
2137
- msgid "Fade Up"
2138
- msgstr ""
2139
-
2140
- #: modules/popup/views/popup.php:434
2141
- msgid "Fade Down"
2142
- msgstr ""
2143
-
2144
- #: modules/popup/views/popup.php:435
2145
- msgid "Fade Left"
2146
- msgstr ""
2147
-
2148
- #: modules/popup/views/popup.php:436
2149
- msgid "Fade Right"
2150
- msgstr ""
2151
-
2152
- #: modules/popup/views/popup.php:438
2153
- msgid "Flip X"
2154
- msgstr ""
2155
-
2156
- #: modules/popup/views/popup.php:439
2157
- msgid "Flip Y"
2158
- msgstr ""
2159
-
2160
- #: modules/popup/views/popup.php:441
2161
- msgid "Rotate"
2162
- msgstr ""
2163
-
2164
- #: modules/popup/views/popup.php:442
2165
- msgid "Rotate Up Left"
2166
- msgstr ""
2167
-
2168
- #: modules/popup/views/popup.php:443
2169
- msgid "Rotate Up Right"
2170
- msgstr ""
2171
-
2172
- #: modules/popup/views/popup.php:444
2173
- msgid "Rotate Down Left"
2174
- msgstr ""
2175
-
2176
- #: modules/popup/views/popup.php:445
2177
- msgid "Rotate Down Right"
2178
- msgstr ""
2179
-
2180
- #: modules/popup/views/popup.php:447
2181
- msgid "Slide Up"
2182
- msgstr ""
2183
-
2184
- #: modules/popup/views/popup.php:448
2185
- msgid "Slide Down"
2186
- msgstr ""
2187
-
2188
- #: modules/popup/views/popup.php:449
2189
- msgid "Slide Left"
2190
- msgstr ""
2191
-
2192
- #: modules/popup/views/popup.php:450
2193
- msgid "Slide Right"
2194
- msgstr ""
2195
-
2196
- #: modules/popup/views/popup.php:452
2197
- msgid "Zoom"
2198
- msgstr ""
2199
-
2200
- #: modules/popup/views/popup.php:453
2201
- msgid "Zoom Up"
2202
- msgstr ""
2203
-
2204
- #: modules/popup/views/popup.php:454
2205
- msgid "Zoom Down"
2206
- msgstr ""
2207
-
2208
- #: modules/popup/views/popup.php:455
2209
- msgid "Zoom Left"
2210
- msgstr ""
2211
-
2212
- #: modules/popup/views/popup.php:456
2213
- msgid "Zoom Right"
2214
- msgstr ""
2215
-
2216
- #: modules/popup/views/popup.php:458
2217
- msgid "Light Speed"
2218
- msgstr ""
2219
-
2220
- #: modules/popup/views/popup.php:459
2221
- msgid "Rolling!"
2222
- msgstr ""
2223
-
2224
- #: modules/popup/views/popup.php:767
2225
- msgid "None (standard)"
2226
- msgstr ""
2227
-
2228
- #: modules/popup/views/tpl/popupAddNewAdmin.php:20
2229
- #, php-format
2230
- msgid "Change Template to any other from the list below or <a class=\"button\" href=\"%s\">return to Pop-Up edit</a>"
2231
- msgstr ""
2232
-
2233
- #: modules/popup/views/tpl/popupAddNewAdmin.php:22
2234
- msgid "Choose Pop-Up Template. You can change it later."
2235
- msgstr ""
2236
-
2237
- #: modules/popup/views/tpl/popupAddNewAdmin.php:31
2238
- msgid "PopUp Name"
2239
- msgstr ""
2240
-
2241
- #: modules/popup/views/tpl/popupAddNewAdmin.php:44
2242
- #: modules/popup/views/tpl/popupAddNewAdmin.php:54
2243
- msgid "All"
2244
- msgstr ""
2245
-
2246
- #: modules/popup/views/tpl/popupAddNewAdmin.php:69
2247
- msgid "type"
2248
- msgstr ""
2249
-
2250
- #: modules/popup/views/tpl/popupAddNewAdmin.php:72
2251
- msgid "Get in PRO"
2252
- msgstr ""
2253
-
2254
- #: modules/popup/views/tpl/popupAddNewAdmin.php:83
2255
- msgid "Change Template"
2256
- msgstr ""
2257
-
2258
- #: modules/popup/views/tpl/popupAddNewAdmin.php:85
2259
- msgid "Are you sure you want to change your current template - to "
2260
- msgstr ""
2261
-
2262
- #: modules/popup/views/tpl/popupAdmin.php:11
2263
- #: modules/popup/views/tpl/popupAdmin.php:12
2264
- msgid "Search"
2265
- msgstr ""
2266
-
2267
- #: modules/popup/views/tpl/popupAdmin.php:21
2268
- #, php-format
2269
- msgid "You have no PopUps for now. <a href=\"%s\" style=\"font-style: italic;\">Create</a> your PopUp!"
2270
- msgstr ""
2271
-
2272
- #: modules/popup/views/tpl/popupEditAdmin.php:108
2273
- msgid "Loading preview..."
2274
- msgstr ""
2275
-
2276
- #: modules/popup/views/tpl/popupEditAdmin.php:113
2277
- msgid "Back to top"
2278
- msgstr ""
2279
-
2280
- #: modules/popup/views/tpl/popupEditAdminAnimationOpts.php:2
2281
- msgid "Choose PopUp animation style"
2282
- msgstr ""
2283
-
2284
- #: modules/popup/views/tpl/popupEditAdminAnimationOpts.php:3
2285
- msgid "current style"
2286
- msgstr ""
2287
-
2288
- #: modules/popup/views/tpl/popupEditAdminAnimationOpts.php:30
2289
- msgid "Animation Duration"
2290
- msgstr ""
2291
-
2292
- #: modules/popup/views/tpl/popupEditAdminAnimationOpts.php:32
2293
- msgid "miliseconds"
2294
- msgstr ""
2295
-
2296
- #: modules/popup/views/tpl/popupEditAdminCodeOpts.php:2
2297
- #, php-format
2298
- msgid "Edit this ONLY if you know basics of HTML, CSS and have been acquainted with the rules of template editing described <a target=\"_blank\" href=\"%s\">here</a>"
2299
- msgstr ""
2300
-
2301
- #: modules/popup/views/tpl/popupEditAdminCodeOpts.php:5
2302
- msgid "CSS code"
2303
- msgstr ""
2304
-
2305
- #: modules/popup/views/tpl/popupEditAdminCodeOpts.php:9
2306
- msgid "HTML code"
2307
- msgstr ""
2308
-
2309
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:5
2310
- msgid "Video URL"
2311
- msgstr ""
2312
-
2313
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:6
2314
- msgid "Copy and paste here URL of your video source"
2315
- msgstr ""
2316
-
2317
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:16
2318
- msgid "iFrame URL"
2319
- msgstr ""
2320
-
2321
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:17
2322
- #, php-format
2323
- msgid "Copy and paste here URL of site, that you need to display in PopUp as iFrame. Please note that some sites can block such possibility, you can read more about this <a target=\"_blank\" href=\"%s\">for example here</a>"
2324
- msgstr ""
2325
-
2326
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:27
2327
- msgid "PDF URL"
2328
- msgstr ""
2329
-
2330
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:28
2331
- msgid "Copy and paste here URL to your PDF file. You can simply upload it on your server (using FTP for example), then insert URL in this field - and you will see how it work. Enjoy!"
2332
- msgstr ""
2333
-
2334
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:37
2335
- msgid "Width"
2336
- msgstr ""
2337
-
2338
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:44
2339
- msgid "Max width for percentage - is 100"
2340
- msgstr ""
2341
-
2342
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:46
2343
- msgid "Percents"
2344
- msgstr ""
2345
-
2346
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:50
2347
- msgid "Pixels"
2348
- msgstr ""
2349
-
2350
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:60
2351
- msgid "Height"
2352
- msgstr ""
2353
-
2354
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:72
2355
- msgid "Video Autoplay"
2356
- msgstr ""
2357
-
2358
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:73
2359
- msgid "Play video - right after PopUp show"
2360
- msgstr ""
2361
-
2362
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:83
2363
- msgid "Hide controls"
2364
- msgstr ""
2365
-
2366
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:94
2367
- msgid "Ignore related videos"
2368
- msgstr ""
2369
-
2370
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:135
2371
- msgid "Background overlay opacity"
2372
- msgstr ""
2373
-
2374
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:144
2375
- msgid "Disable window scroll"
2376
- msgstr ""
2377
-
2378
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:145
2379
- msgid "Disable browser window scrolling while PopUp is opened. Good way to disallow viewing your site content before PopUp will be closed."
2380
- msgstr ""
2381
-
2382
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:158
2383
- #, php-format
2384
- msgid "Background %d"
2385
- msgstr ""
2386
-
2387
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:183
2388
- msgid "Label Font style"
2389
- msgstr ""
2390
-
2391
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:192
2392
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:215
2393
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:239
2394
- msgid "Default"
2395
- msgstr ""
2396
-
2397
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:206
2398
- msgid "Text Font style"
2399
- msgstr ""
2400
-
2401
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:206
2402
- #, php-format
2403
- msgid "Text Font style %d"
2404
- msgstr ""
2405
-
2406
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:230
2407
- msgid "Footer Font style"
2408
- msgstr ""
2409
-
2410
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:253
2411
- msgid "Responsive mode"
2412
- msgstr ""
2413
-
2414
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:254
2415
- msgid "You can choose PopUp behavior for responsive mode from one of the following. If you don't know - what to select - you can just try both and leave most suitable for you."
2416
- msgstr ""
2417
-
2418
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:257
2419
- msgid "PopUp will be fully zoomed for smaller screens"
2420
- msgstr ""
2421
-
2422
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:262
2423
- msgid "Full resize"
2424
- msgstr ""
2425
-
2426
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:264
2427
- msgid "PopUp will not be zoomed like with prev. mode, it will adapt only Width for users screen size"
2428
- msgstr ""
2429
-
2430
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:269
2431
- msgid "Width only"
2432
- msgstr ""
2433
-
2434
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:276
2435
- msgid "Close button"
2436
- msgstr ""
2437
-
2438
- #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:296
2439
- msgid "Bullets"
2440
- msgstr ""
2441
-
2442
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:13
2443
- #, php-format
2444
- msgid "You are using Google Maps in this PopUp, but don't have Google Maps Easy plugin installed. You can get it for Free from WordPress site <a target=\"_blank\" href=\"%s\">here</a>, install and start using this PopUp with map."
2445
- msgstr ""
2446
-
2447
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:19
2448
- msgid "Please be advised that you are editing AB Test PopUp. This means that independently of options you select in Main settings - there will be always only one PopUp: Base or one from AB Test."
2449
- msgstr ""
2450
-
2451
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:26
2452
- msgid "When to show PopUp"
2453
- msgstr ""
2454
-
2455
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:32
2456
- msgid "When page loads"
2457
- msgstr ""
2458
-
2459
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:37
2460
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:73
2461
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:90
2462
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:206
2463
- msgid "Delay for"
2464
- msgstr ""
2465
-
2466
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:41
2467
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:78
2468
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:146
2469
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:211
2470
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:271
2471
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:290
2472
- msgid "Seconds"
2473
- msgstr ""
2474
-
2475
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:41
2476
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:78
2477
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:146
2478
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:211
2479
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:271
2480
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:290
2481
- msgid "sec"
2482
- msgstr ""
2483
-
2484
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:48
2485
- msgid "User click on the page"
2486
- msgstr ""
2487
-
2488
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:54
2489
- msgid "Click on certain link / button / other element"
2490
- msgstr ""
2491
-
2492
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:57
2493
- msgid "Copy & paste next code - into required link to open PopUp on Click"
2494
- msgstr ""
2495
-
2496
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:60
2497
- #, php-format
2498
- msgid "Check screenshot with details - <a onclick=\"ppsShowTipScreenPopUp(this); return false;\" href=\"%s\">here</a>."
2499
- msgstr ""
2500
-
2501
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:62
2502
- msgid "Or, if you know HTML basics, - you can insert \"onclick\" attribute to any of your element from code below"
2503
- msgstr ""
2504
-
2505
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:66
2506
- msgid "Or you can even use it for your Menu item, just add code"
2507
- msgstr ""
2508
-
2509
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:70
2510
- msgid "to your menu item \"URL\" or into \"Title Attribute\" field. Don't worry - users will not see this code as menu item title on your site."
2511
- msgstr ""
2512
-
2513
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:85
2514
- msgid "Scroll window"
2515
- msgstr ""
2516
-
2517
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:94
2518
- msgid "seconds after first scroll"
2519
- msgstr ""
2520
-
2521
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:98
2522
- msgid "Scrolled to"
2523
- msgstr ""
2524
-
2525
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:102
2526
- msgid "percents of total scroll"
2527
- msgstr ""
2528
-
2529
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:122
2530
- msgid "When user is at the bottom of the page: scrolls it down to the bottom, or if there is no vertical scroll on his device - just show it right after page loads."
2531
- msgstr ""
2532
-
2533
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:123
2534
- msgid "Bottom of the page"
2535
- msgstr ""
2536
-
2537
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:134
2538
- msgid "After user was inactive on your page for some time."
2539
- msgstr ""
2540
-
2541
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:135
2542
- msgid "After Inactivity"
2543
- msgstr ""
2544
-
2545
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:143
2546
- msgid "After user was inactive for"
2547
- msgstr ""
2548
-
2549
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:153
2550
- msgid "When user adds a comment on your site he will see this PopUp after comment was placed. This will help you to get active users interested in your site."
2551
- msgstr ""
2552
-
2553
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:154
2554
- msgid "After User Comment"
2555
- msgstr ""
2556
-
2557
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:165
2558
- msgid "Show PopUp after successful checkout process in your online store."
2559
- msgstr ""
2560
-
2561
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:166
2562
- msgid "After Purchasing (Checkout)"
2563
- msgstr ""
2564
-
2565
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:174
2566
- msgid "Copy & Paste next code on your Success checkout page content editor"
2567
- msgstr ""
2568
-
2569
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:178
2570
- msgid "Or, if you are using your own html/php for this page - insert there next code"
2571
- msgstr ""
2572
-
2573
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:192
2574
- #, php-format
2575
- msgid "Show when user opens your site exactly with link, where in the end will be #ppsShowPopUp_%d. For example <a href=\"%s\" target=\"_blank\">%s</a> (will work only with PRO version)."
2576
- msgstr ""
2577
-
2578
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:193
2579
- msgid "On Link Follow"
2580
- msgstr ""
2581
-
2582
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:200
2583
- msgid "Copy & paste next code - into end of required link on your site"
2584
- msgstr ""
2585
-
2586
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:222
2587
- msgid "PopUp will be build-in page content - as part of your page."
2588
- msgstr ""
2589
-
2590
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:223
2591
- msgid "Build-In Page"
2592
- msgstr ""
2593
-
2594
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:230
2595
- msgid "Copy & paste next code - into required place in your page"
2596
- msgstr ""
2597
-
2598
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:237
2599
- msgid "When to close PopUp"
2600
- msgstr ""
2601
-
2602
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:243
2603
- msgid "After user close it"
2604
- msgstr ""
2605
-
2606
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:249
2607
- msgid "Close PopUp when user clicks outside of the actually PopUp window."
2608
- msgstr ""
2609
-
2610
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:250
2611
- msgid "Click outside PopUp"
2612
- msgstr ""
2613
-
2614
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:258
2615
- msgid "Will not allow user to close your PopUp - until finish at least one action: Subscribe, Share or Like."
2616
- msgstr ""
2617
-
2618
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:259
2619
- msgid "Only after action (Subscribe / Share / Like)"
2620
- msgstr ""
2621
-
2622
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:268
2623
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:287
2624
- msgid "Close after"
2625
- msgstr ""
2626
-
2627
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:274
2628
- msgid "Close PopUp after it will be visible during specified time."
2629
- msgstr ""
2630
-
2631
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:279
2632
- msgid "After time passed"
2633
- msgstr ""
2634
-
2635
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:294
2636
- msgid "Show on next pages"
2637
- msgstr ""
2638
-
2639
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:300
2640
- msgid "All pages"
2641
- msgstr ""
2642
-
2643
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:306
2644
- msgid "Show on next pages / posts"
2645
- msgstr ""
2646
-
2647
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:309
2648
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:318
2649
- msgid "Choose Pages"
2650
- msgstr ""
2651
-
2652
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:315
2653
- msgid "Don't show on next pages / posts"
2654
- msgstr ""
2655
-
2656
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:321
2657
- msgid "Time display settings"
2658
- msgstr ""
2659
-
2660
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:327
2661
- msgid "Set display time"
2662
- msgstr ""
2663
-
2664
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:330
2665
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:353
2666
- msgid "From"
2667
- msgstr ""
2668
-
2669
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:336
2670
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:357
2671
- msgid "to"
2672
- msgstr ""
2673
-
2674
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:344
2675
- msgid "Date display settings"
2676
- msgstr ""
2677
-
2678
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:350
2679
- msgid "Set display date"
2680
- msgstr ""
2681
-
2682
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:364
2683
- msgid "Whom to show"
2684
- msgstr ""
2685
-
2686
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:370
2687
- msgid "Everyone"
2688
- msgstr ""
2689
-
2690
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:376
2691
- msgid "For first-time visitors"
2692
- msgstr ""
2693
-
2694
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:379
2695
- msgid "Will remember user visit for entered number of days and show PopUp to same user again - after this period. To remember only for one browser session - use 0 here, to remember forever - try to set big number - 99999 for example."
2696
- msgstr ""
2697
-
2698
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:380
2699
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:396
2700
- msgid "Remember for"
2701
- msgstr ""
2702
-
2703
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:385
2704
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:401
2705
- msgid "days"
2706
- msgstr ""
2707
-
2708
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:388
2709
- msgid "Subscribe, share, like, etc."
2710
- msgstr ""
2711
-
2712
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:392
2713
- msgid "Until user makes an action"
2714
- msgstr ""
2715
-
2716
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:395
2717
- msgid "Will remember user action for entered number of days and show PopUp to same user again - after this period. To remember only for one browser session - use 0 here, to remember forever - try to set big number - 99999 for example."
2718
- msgstr ""
2719
-
2720
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:405
2721
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:420
2722
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:435
2723
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:451
2724
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:466
2725
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:485
2726
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:503
2727
- msgid "Click to revert feature function: from Hide - to Show, and vice versa."
2728
- msgstr ""
2729
-
2730
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:406
2731
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:421
2732
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:436
2733
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:452
2734
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:467
2735
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:486
2736
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:504
2737
- msgid "Hide"
2738
- msgstr ""
2739
-
2740
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:406
2741
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:421
2742
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:436
2743
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:452
2744
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:467
2745
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:486
2746
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:504
2747
- msgid "Show Only"
2748
- msgstr ""
2749
-
2750
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:411
2751
- msgid "for Devices"
2752
- msgstr ""
2753
-
2754
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:412
2755
- msgid "You can make PopUp visible or hidden only when users will view your site from selected devices."
2756
- msgstr ""
2757
-
2758
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:417
2759
- msgid "Choose devices"
2760
- msgstr ""
2761
-
2762
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:426
2763
- msgid "for Post Types"
2764
- msgstr ""
2765
-
2766
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:427
2767
- msgid "You can make PopUp visible or hidden only for specified Post Types, for example - hide it on all Pages."
2768
- msgstr ""
2769
-
2770
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:432
2771
- msgid "Choose post types"
2772
- msgstr ""
2773
-
2774
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:441
2775
- msgid "for IP"
2776
- msgstr ""
2777
-
2778
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:442
2779
- #, php-format
2780
- msgid "For those IPs PopUp will not be displayed (or vice versa - depending on Hide/Show Only option). Please be advised that your IP - %s"
2781
- msgstr ""
2782
-
2783
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:444
2784
- msgid "Show IPs List"
2785
- msgstr ""
2786
-
2787
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:457
2788
- msgid "for Countries"
2789
- msgstr ""
2790
-
2791
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:458
2792
- #, php-format
2793
- msgid "For those Countries PopUp will not be displayed (or vice versa - depending on Hide/Show Only option). Please be advised that your Country code is %s"
2794
- msgstr ""
2795
-
2796
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:463
2797
- msgid "Choose countries"
2798
- msgstr ""
2799
-
2800
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:472
2801
- msgid "for Languages"
2802
- msgstr ""
2803
-
2804
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:473
2805
- #, php-format
2806
- msgid "For those Languages PopUp will not be displayed. Language is defined by visitor browser language. Please be advised that your browser language is %s"
2807
- msgstr ""
2808
-
2809
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:479
2810
- msgid "Choose languages"
2811
- msgstr ""
2812
-
2813
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:481
2814
- msgid "This feature is supported only in WordPress version 4.0.0 or higher"
2815
- msgstr ""
2816
-
2817
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:491
2818
- msgid "for Search Engines or Social Media"
2819
- msgstr ""
2820
-
2821
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:492
2822
- msgid "If user coming from those Search Engines - PopUp will not be displayed. This is helpfull when you want to hide or show your PopUp only for users, who come to your site from particular search engine."
2823
- msgstr ""
2824
-
2825
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:497
2826
- msgid "Choose Search Engines"
2827
- msgstr ""
2828
-
2829
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:509
2830
- msgid "for URL match"
2831
- msgstr ""
2832
-
2833
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:510
2834
- #, php-format
2835
- msgid "You can enter here URL pattern - and users with URL matched this pattern will not see (or vice versa) your PopUp. Use <a _target=\"_blank\" href=\"%s\">official documentation</a> about regular expression to make this work correctly."
2836
- msgstr ""
2837
-
2838
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:519
2839
- msgid "Hide PopUp for Logged-in users and show it only for not Logged-in site visitors."
2840
- msgstr ""
2841
-
2842
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:522
2843
- msgid "Hide for Logged-in"
2844
- msgstr ""
2845
-
2846
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:525
2847
- msgid "IPs List"
2848
- msgstr ""
2849
-
2850
- #: modules/popup/views/tpl/popupEditAdminMainOpts.php:527
2851
- msgid "Type here IPs that will not see PopUp, each IP - from new line"
2852
- msgstr ""
2853
-
2854
- #: modules/popup/views/tpl/popupEditAdminSmOpts.php:7
2855
- msgid "Enable Social Buttons"
2856
- msgstr ""
2857
-
2858
- #: modules/popup/views/tpl/popupEditAdminSmOpts.php:21
2859
- msgid "Social links design"
2860
- msgstr ""
2861
-
2862
- #: modules/popup/views/tpl/popupEditAdminSmOpts.php:31
2863
- msgid "OR"
2864
- msgstr ""
2865
-
2866
- #: modules/popup/views/tpl/popupEditAdminSmOpts.php:34
2867
- msgid "Connect <b>around 20 social networks</b> to your PopUp, with various lists of design settings, using our plugin <b>Social Share Buttons by Supsystic</b>"
2868
- msgstr ""
2869
-
2870
- #: modules/popup/views/tpl/popupEditAdminSmOpts.php:38
2871
- msgid "Select Social Button Project"
2872
- msgstr ""
2873
-
2874
- #: modules/popup/views/tpl/popupEditAdminSmOpts.php:49
2875
- #, php-format
2876
- msgid "You have no Social Sharing projects for now. <a href=\"%s\" target=\"_blank\" class=\"button button-primary\">Create your first project</a> - then just reload page with your PopUp settings, and you will see list with available Social Projects for your PopUp."
2877
- msgstr ""
2878
-
2879
- #: modules/popup/views/tpl/popupEditAdminSmOpts.php:55
2880
- #, php-format
2881
- msgid "You need to install Social Share Buttons by Supsystic to use this feature. <a href=\"%s\" target=\"_blank\" class=\"button\">Install plugin</a> from your admin area, or visit it's official page on Wordpress.org <a href=\"%s\" target=\"_blank\">here.</a>"
2882
- msgstr ""
2883
-
2884
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:7
2885
- msgid "Enable Subscription"
2886
- msgstr ""
2887
-
2888
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:14
2889
- msgid "Subscribe to"
2890
- msgstr ""
2891
-
2892
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:15
2893
- msgid "Destination for your Subscribers."
2894
- msgstr ""
2895
-
2896
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:25
2897
- msgid "Create user with the chosen role after subscribing"
2898
- msgstr ""
2899
-
2900
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:26
2901
- msgid "Use this only if you really need it. Remember! After you change this option - your new subscriber will have more privileges than usual subscribers, so be careful with this option!"
2902
- msgstr ""
2903
-
2904
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:36
2905
- msgid "Create Subscriber without confirmation"
2906
- msgstr ""
2907
-
2908
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:37
2909
- msgid "Usually, after user subscribes, we send an email with the confirmation link - to confirm the email address, and only after user clicks on the link from this email - we will create a new subscriber. This option allows you to create a subscriber - right after subscription, without the email confirmation process."
2910
- msgstr ""
2911
-
2912
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:46
2913
- msgid "Export Subscribers"
2914
- msgstr ""
2915
-
2916
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:47
2917
- msgid "Export all subscribers, who subscribed using WordPress \"Subscribe to\" method, as CSV file."
2918
- msgstr ""
2919
-
2920
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:55
2921
- msgid "Aweber Unique List ID"
2922
- msgstr ""
2923
-
2924
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:56
2925
- #, php-format
2926
- msgid "Check <a href=\"%s\" target=\"_blank\">this page</a> for more details"
2927
- msgstr ""
2928
-
2929
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:65
2930
- msgid "Aweber AD Tracking"
2931
- msgstr ""
2932
-
2933
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:66
2934
- #, php-format
2935
- msgid "You can easy track your subscribers from PopUp using this feature. For more info - check <a href=\"%s\" target=\"_blank\">this page</a>."
2936
- msgstr ""
2937
-
2938
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:75
2939
- msgid "MailChimp API key"
2940
- msgstr ""
2941
-
2942
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:76
2943
- #, php-format
2944
- msgid "To find your MailChimp API Key login to your mailchimp account at <a href=\"%s\" target=\"_blank\">%s</a> then from the left main menu, click on your Username, then select \"Account\" in the flyout menu. From the account page select \"Extras\", \"API Keys\". Your API Key will be listed in the table labeled \"Your API Keys\". Copy / Paste your API key into \"MailChimp API key\" field here. For more detailed instruction - check article <a href=\"%s\" target=\"_blank\">here</a>."
2945
- msgstr ""
2946
-
2947
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:87
2948
- msgid "Select lists for subscribe. They are taken from your MailChimp account - so make sure that you entered correct API key before."
2949
- msgstr ""
2950
-
2951
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:96
2952
- msgid "Enter API key - and your list will appear here"
2953
- msgstr ""
2954
-
2955
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:102
2956
- msgid "Disable double opt-in"
2957
- msgstr ""
2958
-
2959
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:103
2960
- msgid "Disable double opt-in confirmation message sending - will create subscriber directly after he will sign-up to your form."
2961
- msgstr ""
2962
-
2963
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:112
2964
- msgid "Group for subscribe"
2965
- msgstr ""
2966
-
2967
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:113
2968
- msgid "In MailChimp there are possibility to select groups for your subscribers. This is not mandatory, but some times is really helpful. So, we added this possibility for you in our plugin too - hope you will like it!"
2969
- msgstr ""
2970
-
2971
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:119
2972
- msgid "Choose Groups"
2973
- msgstr ""
2974
-
2975
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:122
2976
- msgid "Enter API key, select List - and your groups will appear here"
2977
- msgstr ""
2978
-
2979
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:129
2980
- msgid "MailPoet Subscribe Lists"
2981
- msgstr ""
2982
-
2983
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:138
2984
- #, php-format
2985
- msgid "You have no subscribe lists, <a target=\"_blank\" href=\"%s\">create lists</a> at first, then - select them here."
2986
- msgstr ""
2987
-
2988
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:143
2989
- #, php-format
2990
- msgid "To use this subscribe engine - you must have <a target=\"_blank\" href=\"%s\">MailPoet plugin</a> installed on your site"
2991
- msgstr ""
2992
-
2993
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:170
2994
- #, php-format
2995
- msgid "To use this subscribe engine - you must have <a target=\"_blank\" href=\"%s\">Jetpack plugin</a> installed on your site"
2996
- msgstr ""
2997
-
2998
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:183
2999
- msgid "Infusion Soft"
3000
- msgstr ""
3001
-
3002
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:200
3003
- msgid "Activate License or update PRO version plugin"
3004
- msgstr ""
3005
-
3006
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:201
3007
- msgid "Apparently - you have installed PRO version, but did not activate it license - then please activate it. Or you have old version of plugin - then you need go to Plugins page and Update PRO version plugin, after this go to License tab and re-activate license (just click one more time on \"Activate\" button)."
3008
- msgstr ""
3009
-
3010
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:210
3011
- #, php-format
3012
- msgid "Enable %s with PRO"
3013
- msgstr ""
3014
-
3015
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:211
3016
- #, php-format
3017
- msgid "This is PRO feature, and it will be available once you will install <a href=\"%s\" target=\"_blank\">PRO version</a> of our plugin"
3018
- msgstr ""
3019
-
3020
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:215
3021
- msgid "Get PRO"
3022
- msgstr ""
3023
-
3024
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:222
3025
- msgid "Subscribe with Facebook"
3026
- msgstr ""
3027
-
3028
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:223
3029
- #, php-format
3030
- msgid "Add button to your PopUp with possibility to subscribe just in one click - without filling fields in your subscribe form, <img src=\"%s\" />"
3031
- msgstr ""
3032
-
3033
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:236
3034
- msgid "Create WP user"
3035
- msgstr ""
3036
-
3037
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:237
3038
- msgid "Once user will subscribe to selected Subscription service - it will create WordPress Subscriber too. PLease be carefull using this option: WordPressusers will be created right after you submit your Subscribe form without confirmation."
3039
- msgstr ""
3040
-
3041
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:246
3042
- msgid "Test Email Function"
3043
- msgstr ""
3044
-
3045
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:247
3046
- msgid "Email delivery depends from your server configuration. For some cases - you and your subscribers can not receive emails just because email on your server is not working correctly. You can easy test it here - by sending test email. If you receive it - then it means that email functionality on your server works well. If not - this means that it is not working correctly and you should contact your hosting provider with this issue and ask them to setup email functionality for you on your server."
3047
- msgstr ""
3048
-
3049
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:255
3050
- msgid "Send Test Email"
3051
- msgstr ""
3052
-
3053
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:258
3054
- msgid "Email was sent. Now check your email inbox / spam folders for test mail. If you don’t find it - it means that your server can't send emails - and you need to contact your hosting provider with this issue."
3055
- msgstr ""
3056
-
3057
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:266
3058
- msgid "Subscription fields"
3059
- msgstr ""
3060
-
3061
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:267
3062
- msgid "To change field position - just drag-&-drop it to required place between other fields. To add new field to Subscribe form - click on \"+ Add\" button."
3063
- msgstr ""
3064
-
3065
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:330
3066
- msgid "This is the message that the user will see after subscription, when letter with confirmation link was sent."
3067
- msgstr ""
3068
-
3069
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:340
3070
- msgid "Subscribe success message"
3071
- msgstr ""
3072
-
3073
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:341
3074
- msgid "Right after subscriber will be created and confirmed - this message will be shown."
3075
- msgstr ""
3076
-
3077
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:345
3078
- #: modules/subscribe/controller.php:40
3079
- msgid "Thank you for subscribing!"
3080
- msgstr ""
3081
-
3082
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:362
3083
- msgid "Email exists error message"
3084
- msgstr ""
3085
-
3086
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:363
3087
- msgid "If email that was entered by user already exists - user will see this message. But be careful: this can be used by hackers - to detect existing email in your database, so it's better for you to leave this message same as error message about invalid email above."
3088
- msgstr ""
3089
-
3090
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:373
3091
- msgid "Redirect after subscription URL"
3092
- msgstr ""
3093
-
3094
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:374
3095
- msgid "You can enable redirection after subscription, just enter here URL that you want to redirect to after subscribe - and user will be redirected there. If you don't need this feature - just leave this field empty."
3096
- msgstr ""
3097
-
3098
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:397
3099
- #: modules/subscribe/models/subscribe.php:386
3100
- msgid "Confirm subscription on [sitename]"
3101
- msgstr ""
3102
-
3103
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:425
3104
- #: modules/subscribe/models/subscribe.php:389
3105
- msgid "You subscribed on site <a href=\"[siteurl]\">[sitename]</a>. Follow <a href=\"[confirm_link]\">this link</a> to complete your subscription. If you did not subscribe here - just ignore this message."
3106
- msgstr ""
3107
-
3108
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:428
3109
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:472
3110
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:525
3111
- msgid "Add Attach"
3112
- msgstr ""
3113
-
3114
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:434
3115
- msgid "New Subscriber email subject"
3116
- msgstr ""
3117
-
3118
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:435
3119
- msgid "Email to New Subscriber subject"
3120
- msgstr ""
3121
-
3122
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:447
3123
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:448
3124
- msgid "New Subscriber email From field"
3125
- msgstr ""
3126
-
3127
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:460
3128
- msgid "New Subscriber email text"
3129
- msgstr ""
3130
-
3131
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:461
3132
- msgid "Email to New Subscriber content"
3133
- msgstr ""
3134
-
3135
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:478
3136
- msgid "Redirect if email already exists"
3137
- msgstr ""
3138
-
3139
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:479
3140
- msgid "Link to redirect to if user subscribes - but this email already exists"
3141
- msgstr ""
3142
-
3143
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:492
3144
- msgid "Submit button name"
3145
- msgstr ""
3146
-
3147
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:500
3148
- msgid "New Subscriber Notification"
3149
- msgstr ""
3150
-
3151
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:513
3152
- msgid "New Subscriber Notification email text"
3153
- msgstr ""
3154
-
3155
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:514
3156
- msgid "Message that you will receive about new subscribers on your site."
3157
- msgstr ""
3158
-
3159
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:522
3160
- #: modules/subscribe/models/subscribe.php:81
3161
- msgid "You have new subscriber on your site <a href=\"[siteurl]\">[sitename]</a>, here is subscriber information:<br />[subscriber_data]"
3162
- msgstr ""
3163
-
3164
- #: modules/popup/views/tpl/popupEditAdminSubOpts.php:570
3165
- msgid "Select File"
3166
- msgstr ""
3167
-
3168
- #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:19
3169
- msgid "Text block"
3170
- msgstr ""
3171
-
3172
- #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:19
3173
- #, php-format
3174
- msgid "Text block %d"
3175
- msgstr ""
3176
-
3177
- #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:39
3178
- msgid "Button block"
3179
- msgstr ""
3180
-
3181
- #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:39
3182
- #, php-format
3183
- msgid "Button block %d"
3184
- msgstr ""
3185
-
3186
- #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:44
3187
- msgid "Button Name"
3188
- msgstr ""
3189
-
3190
- #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:50
3191
- msgid "Button URL"
3192
- msgstr ""
3193
-
3194
- #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:56
3195
- msgid "or close PopUp on click"
3196
- msgstr ""
3197
-
3198
- #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:73
3199
- msgid "Foot note"
3200
- msgstr ""
3201
-
3202
- #: modules/popup/views/tpl/popupEditAdminTplOpts.php:3
3203
- msgid "Change PopUp Template"
3204
- msgstr ""
3205
-
3206
- #: modules/popup/views/tpl/popupEditFormControls.php:1
3207
- msgid "Click to Edit"
3208
- msgstr ""
3209
-
3210
- #: modules/popup/views/tpl/popupEditFormControls.php:9
3211
- msgid "Save all changes"
3212
- msgstr ""
3213
-
3214
- #: modules/popup/views/tpl/popupEditFormControls.php:13
3215
- msgid "Clone to New PopUp"
3216
- msgstr ""
3217
-
3218
- #: modules/popup/views/tpl/popupEditFormControls.php:15
3219
- msgid "Clone"
3220
- msgstr ""
3221
-
3222
- #: modules/popup/views/tpl/popupEditFormControls.php:19
3223
- msgid "Preview"
3224
- msgstr ""
3225
-
3226
- #: modules/popup/views/tpl/popupEditFormControls.php:21
3227
- msgid "Turn Off"
3228
- msgstr ""
3229
-
3230
- #: modules/popup/views/tpl/popupEditFormControls.php:21
3231
- msgid "Turn On"
3232
- msgstr ""
3233
-
3234
- #: modules/popup/views/tpl/popupEditFormControls.php:27
3235
- msgid "Delete"
3236
- msgstr ""
3237
-
3238
- #: modules/popup/views/tpl/popupEditFormControls.php:34
3239
- msgid "New Name"
3240
- msgstr ""
3241
-
3242
- #: modules/popup/views/tpl/popupEditFormControls.php:35
3243
- msgid "Copy"
3244
- msgstr ""
3245
-
3246
- #: modules/sm/mod.php:31
3247
- msgid "Google+"
3248
- msgstr ""
3249
-
3250
- #: modules/sm/mod.php:32
3251
- msgid "Twitter"
3252
- msgstr ""
3253
-
3254
- #: modules/sm/mod.php:56
3255
- msgid "Simple"
3256
- msgstr ""
3257
-
3258
- #: modules/sm/mod.php:57
3259
- msgid "Boxy"
3260
- msgstr ""
3261
-
3262
- #: modules/statistics/controller.php:40
3263
- #, php-format
3264
- msgid "Statistics for %s"
3265
- msgstr ""
3266
-
3267
- #: modules/statistics/controller.php:42
3268
- msgid "Date"
3269
- msgstr ""
3270
-
3271
- #: modules/statistics/controller.php:43
3272
- msgid "Views"
3273
- msgstr ""
3274
-
3275
- #: modules/statistics/controller.php:44
3276
- msgid "Unique Views"
3277
- msgstr ""
3278
-
3279
- #: modules/statistics/controller.php:45
3280
- msgid "Actions"
3281
- msgstr ""
3282
-
3283
- #: modules/statistics/controller.php:46
3284
- msgid "Conversion"
3285
- msgstr ""
3286
-
3287
- #: modules/statistics/mod.php:11
3288
- msgid "Displayed"
3289
- msgstr ""
3290
-
3291
- #: modules/statistics/mod.php:12
3292
- msgid "Subscribed"
3293
- msgstr ""
3294
-
3295
- #: modules/statistics/mod.php:13
3296
- msgid "Shared"
3297
- msgstr ""
3298
-
3299
- #: modules/statistics/mod.php:14
3300
- msgid "Facebook Liked"
3301
- msgstr ""
3302
-
3303
- #: modules/statistics/mod.php:16
3304
- msgid "Registration"
3305
- msgstr ""
3306
-
3307
- #: modules/statistics/mod.php:27
3308
- msgid "Statistics"
3309
- msgstr ""
3310
-
3311
- #: modules/statistics/models/statistics.php:35
3312
- #: modules/subscribe/models/subscribe.php:452
3313
- msgid "Send me some info, pls"
3314
- msgstr ""
3315
-
3316
- #: modules/statistics/models/statistics.php:165
3317
- msgid "No data found"
3318
- msgstr ""
3319
-
3320
- #: modules/statistics/views/tpl/statPopupEditTab.php:4
3321
- #, php-format
3322
- msgid "Want to increase conversion, subscribers and social share? <a target=\"_blank\" href=\"%s\" class=\"button\">Get know - how!</a>"
3323
- msgstr ""
3324
-
3325
- #: modules/statistics/views/tpl/statPopupEditTab.php:8
3326
- msgid "Main PopUp Usage Statistics"
3327
- msgstr ""
3328
-
3329
- #: modules/statistics/views/tpl/statPopupEditTab.php:10
3330
- msgid "Clear selection"
3331
- msgstr ""
3332
-
3333
- #: modules/statistics/views/tpl/statPopupEditTab.php:12
3334
- msgid "To"
3335
- msgstr ""
3336
-
3337
- #: modules/statistics/views/tpl/statPopupEditTab.php:26
3338
- msgid "Reset Zoom"
3339
- msgstr ""
3340
-
3341
- #: modules/statistics/views/tpl/statPopupEditTab.php:31
3342
- msgid "Group by"
3343
- msgstr ""
3344
-
3345
- #: modules/statistics/views/tpl/statPopupEditTab.php:32
3346
- msgid "Hour"
3347
- msgstr ""
3348
-
3349
- #: modules/statistics/views/tpl/statPopupEditTab.php:33
3350
- msgid "Day"
3351
- msgstr ""
3352
-
3353
- #: modules/statistics/views/tpl/statPopupEditTab.php:34
3354
- msgid "Week"
3355
- msgstr ""
3356
-
3357
- #: modules/statistics/views/tpl/statPopupEditTab.php:35
3358
- msgid "Month"
3359
- msgstr ""
3360
-
3361
- #: modules/statistics/views/tpl/statPopupEditTab.php:37
3362
- msgid "Export to CSV"
3363
- msgstr ""
3364
-
3365
- #: modules/statistics/views/tpl/statPopupEditTab.php:42
3366
- msgid "Clear data"
3367
- msgstr ""
3368
-
3369
- #: modules/statistics/views/tpl/statPopupEditTab.php:48
3370
- msgid "You can Zoom In by allocating mouse on Graph area."
3371
- msgstr ""
3372
-
3373
- #: modules/statistics/views/tpl/statPopupEditTab.php:51
3374
- msgid "Ratio of All Actions"
3375
- msgstr ""
3376
-
3377
- #: modules/statistics/views/tpl/statPopupEditTab.php:56
3378
- msgid "Once you will have enough different statistics - like shares, subscribes, likes - you will be able to see here which action is used more or less frequently."
3379
- msgstr ""
3380
-
3381
- #: modules/statistics/views/tpl/statPopupEditTab.php:60
3382
- msgid "Ratio of All Social Share"
3383
- msgstr ""
3384
-
3385
- #: modules/statistics/views/tpl/statPopupEditTab.php:65
3386
- msgid "Once you will have enough different statistics about share from PopUp on social media, you will be able to see here which social media is used more or less frequently."
3387
- msgstr ""
3388
-
3389
- #: modules/statistics/views/tpl/statPopupEditTab.php:72
3390
- #, php-format
3391
- msgid "You have no statistics for \"%s\" PopUp for now. Setup its options and wait until users will view it on your site."
3392
- msgstr ""
3393
-
3394
- #: modules/subscribe/controller.php:113
3395
- #, php-format
3396
- msgid "Registered from %s"
3397
- msgstr ""
3398
-
3399
- #: modules/subscribe/controller.php:114
3400
- #, php-format
3401
- msgid "Subscribed to %s"
3402
- msgstr ""
3403
-
3404
- #: modules/subscribe/controller.php:128
3405
- msgid "Activated"
3406
- msgstr ""
3407
-
3408
- #: modules/subscribe/controller.php:129
3409
- msgid "PopUp ID"
3410
- msgstr ""
3411
-
3412
- #: modules/subscribe/controller.php:130
3413
- msgid "Date Created"
3414
- msgstr ""
3415
-
3416
- #: modules/subscribe/controller.php:165
3417
- msgid "There are no members for now"
3418
- msgstr ""
3419
-
3420
- #: modules/subscribe/controller.php:166
3421
- msgid "There are no subscribers for now"
3422
- msgstr ""
3423
-
3424
- #: modules/subscribe/mod.php:7
3425
- msgid "WordPress"
3426
- msgstr ""
3427
-
3428
- #: modules/subscribe/mod.php:8
3429
- msgid "Aweber"
3430
- msgstr ""
3431
-
3432
- #: modules/subscribe/mod.php:9
3433
- msgid "MailChimp"
3434
- msgstr ""
3435
-
3436
- #: modules/subscribe/mod.php:10
3437
- msgid "MailPoet"
3438
- msgstr ""
3439
-
3440
- #: modules/subscribe/mod.php:12
3441
- msgid "Jetpack"
3442
- msgstr ""
3443
-
3444
- #: modules/subscribe/models/subscribe.php:50
3445
- msgid "Something goes wrong"
3446
- msgstr ""
3447
-
3448
- #: modules/subscribe/models/subscribe.php:77
3449
- msgid "New Subscriber notification"
3450
- msgstr ""
3451
-
3452
- #: modules/subscribe/models/subscribe.php:78
3453
- #, php-format
3454
- msgid "New Subscriber on %s"
3455
- msgstr ""
3456
-
3457
- #: modules/subscribe/models/subscribe.php:136
3458
- #, php-format
3459
- msgid "Please check %s"
3460
- msgstr ""
3461
-
3462
- #: modules/subscribe/models/subscribe.php:173
3463
- msgid "Can't detect your IP, please don't spam"
3464
- msgstr ""
3465
-
3466
- #: modules/subscribe/models/subscribe.php:205
3467
- msgid "You just subscribed from this IP"
3468
- msgstr ""
3469
-
3470
- #: modules/subscribe/models/subscribe.php:321
3471
- msgid "Can't registrate for now. Please try again later."
3472
- msgstr ""
3473
-
3474
- #: modules/subscribe/models/subscribe.php:321
3475
- msgid "Can't subscribe for now. Please try again later."
3476
- msgstr ""
3477
-
3478
- #: modules/subscribe/models/subscribe.php:489
3479
- msgid "MailChimp requires CURL to be setup on your server. Please contact your hosting provider and ask them to setup CURL library for you."
3480
- msgstr ""
3481
-
3482
- #: modules/subscribe/models/subscribe.php:513
3483
- #: modules/subscribe/models/subscribe.php:547
3484
- msgid "There was some problem while trying to get your lists. Make sure that your API key is correct."
3485
- msgstr ""
3486
-
3487
- #: modules/subscribe/models/subscribe.php:517
3488
- #: modules/subscribe/models/subscribe.php:555
3489
- msgid "Empty API key"
3490
- msgstr ""
3491
-
3492
- #: modules/subscribe/models/subscribe.php:553
3493
- msgid "Select some Lists before"
3494
- msgstr ""
3495
-
3496
- #: modules/subscribe/models/subscribe.php:627
3497
- msgid "Something going wrong while trying to send data to MailChimp. Please contact site owner."
3498
- msgstr ""
3499
-
3500
- #: modules/subscribe/models/subscribe.php:646
3501
- msgid "No API key entered in admin area - contact site owner to resolve this issue."
3502
- msgstr ""
3503
-
3504
- #: modules/subscribe/models/subscribe.php:738
3505
- msgid "Some error occured during subscription process"
3506
- msgstr ""
3507
-
3508
- #: modules/subscribe/models/subscribe.php:741
3509
- msgid "Can't find MailPoet on this server"
3510
- msgstr ""
3511
-
3512
- #: modules/subscribe/models/subscribe.php:789
3513
- msgid "Not a valid email address"
3514
- msgstr ""
3515
-
3516
- #: modules/subscribe/models/subscribe.php:790
3517
- msgid "Not a valid post ID"
3518
- msgstr ""
3519
-
3520
- #: modules/subscribe/models/subscribe.php:791
3521
- msgid "Unknown post"
3522
- msgstr ""
3523
-
3524
- #: modules/subscribe/models/subscribe.php:792
3525
- msgid "Strange error. Jetpack servers at WordPress.com could subscribe the email."
3526
- msgstr ""
3527
-
3528
- #: modules/subscribe/models/subscribe.php:793
3529
- msgid "Site owner has disabled subscriptions."
3530
- msgstr ""
3531
-
3532
- #: modules/subscribe/models/subscribe.php:794
3533
- msgid "Already subscribed."
3534
- msgstr ""
3535
-
3536
- #: modules/subscribe/models/subscribe.php:795
3537
- msgid "Strange error. Jetpack servers at WordPress.com returned something malformed."
3538
- msgstr ""
3539
-
3540
- #: modules/subscribe/models/subscribe.php:796
3541
- msgid "Strange error. Jetpack servers at WordPress.com returned something I didn't understand."
3542
- msgstr ""
3543
-
3544
- #: modules/subscribe/models/subscribe.php:799
3545
- msgid "SOmething is going wrong"
3546
- msgstr ""
3547
-
3548
- #: modules/subscribe/models/subscribe.php:805
3549
- msgid "Empty response from Jetpack"
3550
- msgstr ""
3551
-
3552
- #: modules/subscribe/models/subscribe.php:807
3553
- msgid "Subscriptions module is not activated in Jetpack plugin settings. Activate it before start using this subscribe method."
3554
- msgstr ""
3555
-
3556
- #: modules/subscribe/models/subscribe.php:809
3557
- msgid "Can't find Jetpack plugin on this server"
3558
- msgstr ""
3559
-
3560
- #: modules/subscribe/views/tpl/subSuccessPage.php:10
3561
- msgid "Registration Confirmation"
3562
- msgstr ""
3563
-
3564
- #: modules/subscribe/views/tpl/subSuccessPage.php:11
3565
- msgid "Subscribe Confirmation"
3566
- msgstr ""
3567
-
3568
- #: modules/subscribe/views/tpl/subSuccessPage.php:53
3569
- msgid "Some errors occured while trying to registrate"
3570
- msgstr ""
3571
-
3572
- #: modules/subscribe/views/tpl/subSuccessPage.php:54
3573
- msgid "Some errors occured while trying to subscribe"
3574
- msgstr ""
3575
-
3576
- #: modules/subscribe/views/tpl/subSuccessPage.php:75
3577
- msgid "Registration confirmed"
3578
- msgstr ""
3579
-
3580
- #: modules/subscribe/views/tpl/subSuccessPage.php:76
3581
- msgid "Subscription confirmed"
3582
- msgstr ""
3583
-
3584
- #: modules/subscribe/views/tpl/subSuccessPage.php:81
3585
- #, php-format
3586
- msgid "<a href=\"%s\">Back to site</a> in <i id=\"ppsConfirmBackCounter\">%d</i> seconds"
3587
- msgstr ""
3588
-
3589
- #: modules/supsystic_promo/controller.php:7
3590
- #: modules/supsystic_promo/controller.php:100
3591
- #: modules/supsystic_promo/controller.php:108
3592
- #: modules/supsystic_promo/controller.php:116
3593
- msgid "Information was saved. Thank you!"
3594
- msgstr ""
3595
-
3596
- #: modules/supsystic_promo/controller.php:23
3597
- msgid "Please don't send contact requests so often - wait for response for your previous requests."
3598
- msgstr ""
3599
-
3600
- #: modules/supsystic_promo/controller.php:45
3601
- msgid "Please enter valid email address"
3602
- msgstr ""
3603
-
3604
- #: modules/supsystic_promo/mod.php:36
3605
- #, php-format
3606
- msgid "<h3>Hey, I noticed you just use %s over a week – that’s awesome!</h3><p>Could you please do me a BIG favor and give it a 5-star rating on WordPress? Just to help us spread the word and boost our motivation.</p>"
3607
- msgstr ""
3608
-
3609
- #: modules/supsystic_promo/mod.php:37
3610
- #: modules/supsystic_promo/mod.php:43
3611
- msgid "Ok, you deserve it"
3612
- msgstr ""
3613
-
3614
- #: modules/supsystic_promo/mod.php:38
3615
- #: modules/supsystic_promo/mod.php:44
3616
- msgid "Nope, maybe later"
3617
- msgstr ""
3618
-
3619
- #: modules/supsystic_promo/mod.php:39
3620
- msgid "I already did"
3621
- msgstr ""
3622
-
3623
- #: modules/supsystic_promo/mod.php:40
3624
- #, php-format
3625
- msgid "<h3>More then eleven days with our %s plugin - Congratulations!</h3>"
3626
- msgstr ""
3627
-
3628
- #: modules/supsystic_promo/mod.php:41
3629
- msgid "<p>On behalf of the entire <a href=\"https://supsystic.com/\" target=\"_blank\">supsystic.com</a> company I would like to thank you for been with us, and I really hope that our software helped you.</p>"
3630
- msgstr ""
3631
-
3632
- #: modules/supsystic_promo/mod.php:42
3633
- msgid "<p>And today, if you want, - you can help us. This is really simple - you can just add small promo link to our site under your PopUps. This is small step for you, but a big help for us! Sure, if you don't want - just skip this and continue enjoy our software!</p>"
3634
- msgstr ""
3635
-
3636
- #: modules/supsystic_promo/mod.php:45
3637
- msgid "Skip"
3638
- msgstr ""
3639
-
3640
- #: modules/supsystic_promo/mod.php:92
3641
- msgid "Overview"
3642
- msgstr ""
3643
-
3644
- #: modules/supsystic_promo/mod.php:99
3645
- msgid "Constant Contact - PRO"
3646
- msgstr ""
3647
-
3648
- #: modules/supsystic_promo/mod.php:100
3649
- msgid "Campaign Monitor - PRO"
3650
- msgstr ""
3651
-
3652
- #: modules/supsystic_promo/mod.php:101
3653
- msgid "Vertical Response - PRO"
3654
- msgstr ""
3655
-
3656
- #: modules/supsystic_promo/mod.php:102
3657
- msgid "SendGrid - PRO"
3658
- msgstr ""
3659
-
3660
- #: modules/supsystic_promo/mod.php:103
3661
- msgid "GetResponse - PRO"
3662
- msgstr ""
3663
-
3664
- #: modules/supsystic_promo/mod.php:105
3665
- msgid "Active Campaign - PRO"
3666
- msgstr ""
3667
-
3668
- #: modules/supsystic_promo/mod.php:106
3669
- msgid "Mailrelay - PRO"
3670
- msgstr ""
3671
-
3672
- #: modules/supsystic_promo/mod.php:107
3673
- msgid "arpReach - PRO"
3674
- msgstr ""
3675
-
3676
- #: modules/supsystic_promo/mod.php:108
3677
- msgid "SG Autorepondeur - PRO"
3678
- msgstr ""
3679
-
3680
- #: modules/supsystic_promo/mod.php:109
3681
- msgid "Benchmark - PRO"
3682
- msgstr ""
3683
-
3684
- #: modules/supsystic_promo/mod.php:110
3685
- msgid "InfusionSoft - PRO"
3686
- msgstr ""
3687
-
3688
- #: modules/supsystic_promo/mod.php:111
3689
- msgid "SalesForce - Web-to-Lead - PRO"
3690
- msgstr ""
3691
-
3692
- #: modules/supsystic_promo/mod.php:218
3693
- msgid "Website"
3694
- msgstr ""
3695
-
3696
- #: modules/supsystic_promo/mod.php:219
3697
- msgid "Subject"
3698
- msgstr ""
3699
-
3700
- #: modules/supsystic_promo/mod.php:220
3701
- msgid "Topic"
3702
- msgstr ""
3703
-
3704
- #: modules/supsystic_promo/mod.php:221
3705
- msgid "Plugin options"
3706
- msgstr ""
3707
-
3708
- #: modules/supsystic_promo/mod.php:222
3709
- msgid "Report a bug"
3710
- msgstr ""
3711
-
3712
- #: modules/supsystic_promo/mod.php:223
3713
- msgid "Require a new functionality"
3714
- msgstr ""
3715
-
3716
- #: modules/supsystic_promo/mod.php:224
3717
- msgid "Other"
3718
- msgstr ""
3719
-
3720
- #: modules/supsystic_promo/mod.php:226
3721
- msgid "Message"
3722
- msgstr ""
3723
-
3724
- #: modules/supsystic_promo/mod.php:226
3725
- msgid "Hello Supsystic Team!"
3726
- msgstr ""
3727
-
3728
- #: modules/supsystic_promo/views/supsystic_promo.php:25
3729
- msgid "Why Popup by Supsystic is \"must have\" for your website?"
3730
- msgstr ""
3731
-
3732
- #: modules/supsystic_promo/views/supsystic_promo.php:26
3733
- #, php-format
3734
- msgid "Increase your sales by 500%% using Popup by Supsystic! More subscribers = more sales! It's that simple!<br />More info you can find here <a target=\"_blank\" href=\"%s\">Popup by Supsystic is \"must have\" for your website</a>"
3735
- msgstr ""
3736
-
3737
- #: modules/supsystic_promo/views/supsystic_promo.php:27
3738
- msgid "What is A/B testing?"
3739
- msgstr ""
3740
-
3741
- #: modules/supsystic_promo/views/supsystic_promo.php:28
3742
- #, php-format
3743
- msgid "A/B testing is one of the easiest ways to increase conversion rates and learn more about your audience!<br />A/B test in Popup plugin involves testing two or more versions of a popup window - an A version (original) and a B versions (the variation) - with live traffic and measuring the effect each version has on your conversion rate.<br />To know more detail – click <a target=\"_blank\" href=\"%s\">here</a>"
3744
- msgstr ""
3745
-
3746
- #: modules/supsystic_promo/views/supsystic_promo.php:29
3747
- msgid "How to enable subscription to Aweber?"
3748
- msgstr ""
3749
-
3750
- #: modules/supsystic_promo/views/supsystic_promo.php:30
3751
- #, php-format
3752
- msgid "In order to subscribe to Aweber you need to know unique list id of your aweber account - check this <a target=\"_blank\" href=\"%s\">page</a> for more details."
3753
- msgstr ""
3754
-
3755
- #: modules/supsystic_promo/views/supsystic_promo.php:31
3756
- msgid "How to subscribe to MailChimp?"
3757
- msgstr ""
3758
-
3759
- #: modules/supsystic_promo/views/supsystic_promo.php:32
3760
- msgid ""
3761
- "To subscribe to MailChimp you need enter your MailChimp API key and name of list for subscription. To find your MailChimp API key - follow the instructions below:<br />\n"
3762
- "\t\t\t\t1. Login to your mailchimp account at http://mailchimp.com<br />\n"
3763
- "\t\t\t\t2. From the left main menu, click on your Username, then select \"Account\" in the flyout menu.<br />\n"
3764
- "\t\t\t\t3. From the account page select \"Extras\" -> \"API Keys\".<br />\n"
3765
- "\t\t\t\t4. Your API Key will be listed in the table labeled \"Your API Keys\".<br />\n"
3766
- "\t\t\t\t5. Copy / Paste your API key into \"MailChimp API key\" field in PopUp edit screen -> Subscribe section."
3767
- msgstr ""
3768
-
3769
- #: modules/supsystic_promo/views/supsystic_promo.php:38
3770
- msgid "Where to find css code for the pop-up window?"
3771
- msgstr ""
3772
-
3773
- #: modules/supsystic_promo/views/supsystic_promo.php:39
3774
- msgid ""
3775
- "With Popup by Supsystic you can edit CSS style directly from the plugin. <br />\n"
3776
- "\t\t\t\tIn WordPress admin area - \n"
3777
- "go to Popup by Supsystic -> choose a popup, what you need -> click Code tab. <br />\n"
3778
- "Here you can edit css style of the pop-up window."
3779
- msgstr ""
3780
-
3781
- #: modules/supsystic_promo/views/supsystic_promo.php:43
3782
- msgid "How to get PRO version of plugin for FREE?"
3783
- msgstr ""
3784
-
3785
- #: modules/supsystic_promo/views/supsystic_promo.php:44
3786
- #, php-format
3787
- msgid ""
3788
- "You have an incredible opportunity to get PRO version for free. Make Translation of the plugin! It will be amazing if you take advantage of this offer!<br />\n"
3789
- "\t\t\t\t\tMore info you can find here <a target=\"_blank\" href=\"%s\">“Get PRO version of any plugin for FREE”</a>"
3790
- msgstr ""
3791
-
3792
- #: modules/supsystic_promo/views/supsystic_promo.php:46
3793
- msgid "Translation"
3794
- msgstr ""
3795
-
3796
- #: modules/supsystic_promo/views/supsystic_promo.php:47
3797
- #, php-format
3798
- msgid ""
3799
- "All available languages are provided with the Supsystic Popup plugin. If your language isn’t available, your plugin will be in English by default.<br />\n"
3800
- "\t\t\t\t\tAvailable Translations: English, French, German, Spanish, Russian<br />\n"
3801
- "\t\t\t\t\tTranslate or update a translation Popup WordPress plugin in your language and get a Premium license for FREE. <a target=\"_blank\" href=\"%s\">Contact us.</a>"
3802
- msgstr ""
3803
-
3804
- #: modules/supsystic_promo/views/supsystic_promo.php:54
3805
- msgid "Where's my subscribers?"
3806
- msgstr ""
3807
-
3808
- #: modules/supsystic_promo/views/supsystic_promo.php:55
3809
- #, php-format
3810
- msgid ""
3811
- "By default all subscribers add to the WordPress. \n"
3812
- "\t\t\t\t\tTo find your subscribers go to Users tab on the left navigation menu of WordPress admin area. \n"
3813
- "\t\t\t\t\tAlso available subscription to the Aweber, MailChimp, MailPoet <a href='%s' target='_blank'>and other</a>. \n"
3814
- "\t\t\t\t\tIf you want to add another subscription service - just <a href='%s' target='_blank'>contact us</a> and provide URL of the subscription service."
3815
- msgstr ""
3816
-
3817
- #: modules/supsystic_promo/views/supsystic_promo.php:59
3818
- msgid "PopUp doesn't appear on the website"
3819
- msgstr ""
3820
-
3821
- #: modules/supsystic_promo/views/supsystic_promo.php:60
3822
- #, php-format
3823
- msgid "If you setup you're PopUp properly, and it still doesn't show on the page - there are can be conflict with your WordPress theme or other plugins. <a href='%s' target='_blank'>Contact us</a> with the URL of the webpage you add popup and screenshots / text of the error messages, if you have one - and we will help you resolve your issue."
3824
- msgstr ""
3825
-
3826
- #: modules/supsystic_promo/views/supsystic_promo.php:76
3827
- #, php-format
3828
- msgid "There were some problems while trying to retrieve our news, but you can always check all list <a target=\"_blank\" href=\"%s\">here</a>."
3829
- msgstr ""
3830
-
3831
- #: modules/supsystic_promo/views/supsystic_promo.php:85
3832
- msgid "Undefined"
3833
- msgstr ""
3834
-
3835
- #: modules/supsystic_promo/views/tpl/additionalmainAdminShowOnOptions.php:9
3836
- #: modules/supsystic_promo/views/tpl/layeredStylePromo.php:10
3837
- msgid "Available in PRO"
3838
- msgstr ""
3839
-
3840
- #: modules/supsystic_promo/views/tpl/adminFooter.php:4
3841
- msgid "Version"
3842
- msgstr ""
3843
-
3844
- #: modules/supsystic_promo/views/tpl/adminFooter.php:10
3845
- msgid "Go"
3846
- msgstr ""
3847
-
3848
- #: modules/supsystic_promo/views/tpl/adminFooter.php:10
3849
- msgid "PRO"
3850
- msgstr ""
3851
-
3852
- #: modules/supsystic_promo/views/tpl/adminFooter.php:15
3853
- #: modules/supsystic_promo/views/tpl/welcomePage.php:28
3854
- msgid "Support"
3855
- msgstr ""
3856
-
3857
- #: modules/supsystic_promo/views/tpl/adminTour.php:4
3858
- #, php-format
3859
- msgid "Welcome to %s plugin!"
3860
- msgstr ""
3861
-
3862
- #: modules/supsystic_promo/views/tpl/adminTour.php:5
3863
- #, php-format
3864
- msgid "Thank you for choosing our %s plugin. Just click here to start using it - and we will show you it's possibilities and powerfull features."
3865
- msgstr ""
3866
-
3867
- #: modules/supsystic_promo/views/tpl/adminTour.php:8
3868
- #: modules/supsystic_promo/views/tpl/adminTour.php:18
3869
- #: modules/supsystic_promo/views/tpl/adminTour.php:28
3870
- #: modules/supsystic_promo/views/tpl/adminTour.php:38
3871
- #: modules/supsystic_promo/views/tpl/adminTour.php:48
3872
- #: modules/supsystic_promo/views/tpl/adminTour.php:58
3873
- #: modules/supsystic_promo/views/tpl/adminTour.php:68
3874
- #: modules/supsystic_promo/views/tpl/adminTour.php:78
3875
- #: modules/supsystic_promo/views/tpl/adminTour.php:88
3876
- #: modules/supsystic_promo/views/tpl/adminTour.php:98
3877
- msgid "Close"
3878
- msgstr ""
3879
-
3880
- #: modules/supsystic_promo/views/tpl/adminTour.php:9
3881
- #: modules/supsystic_promo/views/tpl/adminTour.php:19
3882
- #: modules/supsystic_promo/views/tpl/adminTour.php:29
3883
- #: modules/supsystic_promo/views/tpl/adminTour.php:39
3884
- #: modules/supsystic_promo/views/tpl/adminTour.php:49
3885
- #: modules/supsystic_promo/views/tpl/adminTour.php:59
3886
- #: modules/supsystic_promo/views/tpl/adminTour.php:69
3887
- #: modules/supsystic_promo/views/tpl/adminTour.php:79
3888
- #: modules/supsystic_promo/views/tpl/adminTour.php:89
3889
- #: modules/supsystic_promo/views/tpl/adminTour.php:99
3890
- msgid "Next"
3891
- msgstr ""
3892
-
3893
- #: modules/supsystic_promo/views/tpl/adminTour.php:14
3894
- msgid "Create your firs PopUp"
3895
- msgstr ""
3896
-
3897
- #: modules/supsystic_promo/views/tpl/adminTour.php:15
3898
- msgid "Click on \"Add New PopUp\" button to create your firs PopUp. Just try - this is really simple!"
3899
- msgstr ""
3900
-
3901
- #: modules/supsystic_promo/views/tpl/adminTour.php:24
3902
- msgid "Enter name for your PopUp"
3903
- msgstr ""
3904
-
3905
- #: modules/supsystic_promo/views/tpl/adminTour.php:25
3906
- msgid "This will be name of your PopUp. You can change it latter."
3907
- msgstr ""
3908
-
3909
- #: modules/supsystic_promo/views/tpl/adminTour.php:34
3910
- msgid "Selecte template for your PopUp"
3911
- msgstr ""
3912
-
3913
- #: modules/supsystic_promo/views/tpl/adminTour.php:35
3914
- msgid "Choose any templates from this list. You will be able to customize it after creation, and also - you will be able to change it latter if you will need this."
3915
- msgstr ""
3916
-
3917
- #: modules/supsystic_promo/views/tpl/adminTour.php:44
3918
- msgid "Save first PopUp"
3919
- msgstr ""
3920
-
3921
- #: modules/supsystic_promo/views/tpl/adminTour.php:45
3922
- msgid "After you entered name of your PopUp and selected it's template - just save it, and you will be redirected to PopUp edit screen - where you will be able to customize your PopUp."
3923
- msgstr ""
3924
-
3925
- #: modules/supsystic_promo/views/tpl/adminTour.php:54
3926
- msgid "Main Settings"
3927
- msgstr ""
3928
-
3929
- #: modules/supsystic_promo/views/tpl/adminTour.php:55
3930
- msgid "Here you can setup main display settings for your PopUp - when it should be visible for your user, when it need to be closed, if required - select specific pages/posts where you need to show your PopUp."
3931
- msgstr ""
3932
-
3933
- #: modules/supsystic_promo/views/tpl/adminTour.php:64
3934
- msgid "Design Settings"
3935
- msgstr ""
3936
-
3937
- #: modules/supsystic_promo/views/tpl/adminTour.php:65
3938
- msgid "One of our most powerfull features - possibility to <strong>customize</strong> design for each PopUp window for your needs. In this section you can select your PopUp colors and images, enter required texts that will describe your neds for your visitors, setup social settings (if required), select PopUp location, and in the end - select Animation style for your PopUp from list of more then 20 different animation styles!"
3939
- msgstr ""
3940
-
3941
- #: modules/supsystic_promo/views/tpl/adminTour.php:74
3942
- msgid "Subscribe Settings"
3943
- msgstr ""
3944
-
3945
- #: modules/supsystic_promo/views/tpl/adminTour.php:75
3946
- msgid "Setup your Subscription settings here - select Subscribers destination in \"Subscribe to\" option - it allow to flow your subscribers not only to WordPress Users, but to other popular subscribe services. With other subscription options you will be able to easily customize your subscribe form in PopUp window."
3947
- msgstr ""
3948
-
3949
- #: modules/supsystic_promo/views/tpl/adminTour.php:84
3950
- msgid "PopUp Statistics"
3951
- msgstr ""
3952
-
3953
- #: modules/supsystic_promo/views/tpl/adminTour.php:85
3954
- msgid "After you will setup your PopUp - it will start displaying to your site visitors. And now - you need to check it's displaying statistics. Here, in Statistics tab, you will be able to see how many times PopUp was shown to your visitors, how many times visitors subscribed to it (if subscription is enabled), how many times visitors shared your site using Social Share PopUp functionality and what social networks for share is most popular (if it was enabled). If you will use AB Testing feature to increase your site popularity - you will see here all your main and tested PopUps statistics - in one graph or diagramm, - and this will provide you with all required information about your POpUp popularity!"
3955
- msgstr ""
3956
-
3957
- #: modules/supsystic_promo/views/tpl/adminTour.php:94
3958
- msgid "PopUp CSS / HTML Code"
3959
- msgstr ""
3960
-
3961
- #: modules/supsystic_promo/views/tpl/adminTour.php:95
3962
- #, php-format
3963
- msgid "In case you will need modify source CSS / HTML code of your PopUp - you can easily do this here. Just make sure that you know what you are doing - don't break PopUp. You can also find additional information about editing source code <a href=\"%s\" target=\"_blank\">here</a>."
3964
- msgstr ""
3965
-
3966
- #: modules/supsystic_promo/views/tpl/adminTour.php:104
3967
- msgid "Well Done!"
3968
- msgstr ""
3969
-
3970
- #: modules/supsystic_promo/views/tpl/adminTour.php:105
3971
- #, php-format
3972
- msgid "That's it! Now you know how to use our %s. Just save your PopUp after you will setup it - and you will see results. You can also check our site - <a href=\"%s\" target=\"_blank\">supsystic.com</a> to find out more about our %s plugin. If you will have any questions - you can always contact us on <a href=\"%s\" target=\"_blank\">WordPress plugin forum</a> or in <a href=\"%s\" target=\"_blank\">our support system</a>. We really hope that our solution will be helpful for you. Good luck!"
3973
- msgstr ""
3974
-
3975
- #: modules/supsystic_promo/views/tpl/adminTour.php:108
3976
- msgid "Finish"
3977
- msgstr ""
3978
-
3979
- #: modules/supsystic_promo/views/tpl/layeredStylePromo.php:77
3980
- #, php-format
3981
- msgid "This functionality and more - is available in PRO version. <a class=\"button button-primary\" target=\"_blank\" href=\"%s\">Get it</a> today for 29$"
3982
- msgstr ""
3983
-
3984
- #: modules/supsystic_promo/views/tpl/overviewTabContent.php:5
3985
- msgid "FAQ and Documentation"
3986
- msgstr ""
3987
-
3988
- #: modules/supsystic_promo/views/tpl/overviewTabContent.php:17
3989
- #: modules/supsystic_promo/views/tpl/welcomePage.php:51
3990
- msgid "Check all FAQs"
3991
- msgstr ""
3992
-
3993
- #: modules/supsystic_promo/views/tpl/overviewTabContent.php:22
3994
- #: modules/supsystic_promo/views/tpl/welcomePage.php:36
3995
- msgid "Video Tutorial"
3996
- msgstr ""
3997
-
3998
- #: modules/supsystic_promo/views/tpl/overviewTabContent.php:31
3999
- msgid "Server Settings"
4000
- msgstr ""
4001
-
4002
- #: modules/supsystic_promo/views/tpl/overviewTabContent.php:44
4003
- msgid "News"
4004
- msgstr ""
4005
-
4006
- #: modules/supsystic_promo/views/tpl/overviewTabContent.php:50
4007
- msgid "All news and info"
4008
- msgstr ""
4009
-
4010
- #: modules/supsystic_promo/views/tpl/overviewTabContent.php:55
4011
- msgid "Contact form"
4012
- msgstr ""
4013
-
4014
- #: modules/supsystic_promo/views/tpl/overviewTabContent.php:87
4015
- msgid "Send email"
4016
- msgstr ""
4017
-
4018
- #: modules/supsystic_promo/views/tpl/overviewTabContent.php:96
4019
- msgid "Your email was sent, we will try to respond to your as soon as possible. Thank you for support!"
4020
- msgstr ""
4021
-
4022
- #: modules/supsystic_promo/views/tpl/welcomePage.php:7
4023
- #, php-format
4024
- msgid "Welcome to the %s v %s"
4025
- msgstr ""
4026
-
4027
- #: modules/supsystic_promo/views/tpl/welcomePage.php:8
4028
- msgid "Skip tutorial"
4029
- msgstr ""
4030
-
4031
- #: modules/supsystic_promo/views/tpl/welcomePage.php:11
4032
- msgid "The best way to collect subscribers and show notifications.<br />We are trying to make our plugin work in most comfortable way for you. Here is some base information about it."
4033
- msgstr ""
4034
-
4035
- #: modules/supsystic_promo/views/tpl/welcomePage.php:19
4036
- msgid "Step-by-step tutorial"
4037
- msgstr ""
4038
-
4039
- #: modules/supsystic_promo/views/tpl/welcomePage.php:21
4040
- msgid "There're really many options of popup customization. So as soon as you close that page, I'll show you step-by-step tutorial of how to use plugin. Hope it will be usefull for you :)"
4041
- msgstr ""
4042
-
4043
- #: modules/supsystic_promo/views/tpl/welcomePage.php:24
4044
- msgid "As an option we can install and setup plugin for you."
4045
- msgstr ""
4046
-
4047
- #: modules/supsystic_promo/views/tpl/welcomePage.php:30
4048
- #, php-format
4049
- msgid "We love our plugin and do the best to improve all features for You. But sometimes issues happened, or you can't find required feature that you need. Don't worry, just <a href='%s' target='_blank'>contact us</a> and we will help you!"
4050
- msgstr ""
4051
-
4052
- #: modules/supsystic_promo/views/tpl/welcomePage.php:48
4053
- msgid "Frequently Asked Questions"
4054
- msgstr ""
4055
-
4056
- #: modules/supsystic_promo/views/tpl/welcomePage.php:59
4057
- msgid "Let's Start!"
4058
- msgstr ""
4059
-
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: PopUp by Supsystic\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2016-03-01 16:11+0200\n"
6
+ "PO-Revision-Date: 2016-11-23 14:15+0200\n"
7
+ "Last-Translator: supsystic.com <supsystic.team@gmail.com>\n"
8
+ "Language-Team: supsystic.com <supsystic.team@gmail.com>\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "Language: en\n"
13
+ "X-Generator: Poedit 1.8.3\n"
14
+ "X-Poedit-KeywordsList: _;gettext;gettext_noop;__;_e\n"
15
+ "X-Poedit-Basepath: ..\n"
16
+ "X-Poedit-SourceCharset: UTF-8\n"
17
+ "X-Poedit-SearchPathExcluded-0: doc/promo-popup-by-supsystic-pro\n"
18
+ "X-Poedit-SearchPath-0: lang\n"
19
+ "X-Poedit-SearchPath-1: .\n"
20
+ "X-Poedit-SearchPath-2: .\n"
21
+
22
+ #: classes/controller.php:199
23
+ #: classes/controller.php:207
24
+ msgid "Done"
25
+ msgstr ""
26
+
27
+ #: classes/field.php:131
28
+ msgid "Select"
29
+ msgstr ""
30
+
31
+ #: classes/field.php:170
32
+ #: classes/field.php:179
33
+ #: classes/field.php:184
34
+ msgid "N/A"
35
+ msgstr ""
36
+
37
+ #: classes/field.php:277
38
+ msgid "Add Checkbox"
39
+ msgstr ""
40
+
41
+ #: classes/field.php:282
42
+ #: classes/field.php:287
43
+ msgid "Add Item"
44
+ msgstr ""
45
+
46
+ #: classes/field.php:293
47
+ msgid "Add Radio Button"
48
+ msgstr ""
49
+
50
+ #: classes/field.php:311
51
+ msgid "Dimensions"
52
+ msgstr ""
53
+
54
+ #: classes/field.php:314
55
+ msgid "width"
56
+ msgstr ""
57
+
58
+ #: classes/field.php:316
59
+ msgid "height"
60
+ msgstr ""
61
+
62
+ #: classes/field.php:323
63
+ msgid "Click to set field \"id\" and \"class\""
64
+ msgstr ""
65
+
66
+ #: classes/field.php:324
67
+ msgid "Attributes"
68
+ msgstr ""
69
+
70
+ #: classes/field.php:402
71
+ msgid "There are no configuration options for this module"
72
+ msgstr ""
73
+
74
+ #: classes/fieldAdapter.php:93
75
+ msgid "Apply To"
76
+ msgstr ""
77
+
78
+ #: classes/fieldAdapter.php:95
79
+ msgid "Address"
80
+ msgstr ""
81
+
82
+ #: classes/fieldAdapter.php:96
83
+ msgid "Destination"
84
+ msgstr ""
85
+
86
+ #: classes/fieldAdapter.php:97
87
+ msgid "Country"
88
+ msgstr ""
89
+
90
+ #: classes/fieldAdapter.php:100
91
+ msgid "Categories"
92
+ msgstr ""
93
+
94
+ #: classes/fieldAdapter.php:101
95
+ msgid "You have no categories"
96
+ msgstr ""
97
+
98
+ #: classes/fieldAdapter.php:102
99
+ msgid "Brands"
100
+ msgstr ""
101
+
102
+ #: classes/fieldAdapter.php:103
103
+ msgid "You have no brands"
104
+ msgstr ""
105
+
106
+ #: classes/fieldAdapter.php:105
107
+ msgid "Tax Rate"
108
+ msgstr ""
109
+
110
+ #: classes/fieldAdapter.php:106
111
+ msgid "Absolute"
112
+ msgstr ""
113
+
114
+ #: classes/fieldAdapter.php:134
115
+ msgid "Not selected"
116
+ msgstr ""
117
+
118
+ #: classes/fieldAdapter.php:184
119
+ msgid "class"
120
+ msgstr ""
121
+
122
+ #: classes/fieldAdapter.php:186
123
+ msgid "id"
124
+ msgstr ""
125
+
126
+ #: classes/frame.php:139
127
+ msgid "You have no permissions to view this page"
128
+ msgstr ""
129
+
130
+ #: classes/html.php:231
131
+ msgid "Upload"
132
+ msgstr ""
133
+
134
+ #: classes/html.php:648
135
+ msgid "ON"
136
+ msgstr ""
137
+
138
+ #: classes/html.php:649
139
+ msgid "OFF"
140
+ msgstr ""
141
+
142
+ #: classes/html.php:673
143
+ #, php-format
144
+ msgid "Select %s"
145
+ msgstr ""
146
+
147
+ #: classes/model.php:176
148
+ #: classes/model.php:188
149
+ msgid "Database error detected"
150
+ msgstr ""
151
+
152
+ #: classes/model.php:178
153
+ msgid "Invalid ID"
154
+ msgstr ""
155
+
156
+ #: classes/model.php:211
157
+ msgid "Empty or invalid ID"
158
+ msgstr ""
159
+
160
+ #: classes/modInstaller.php:34
161
+ #, php-format
162
+ msgid "Move files for %s failed"
163
+ msgstr ""
164
+
165
+ #: classes/modInstaller.php:37
166
+ #, php-format
167
+ msgid "%s is not plugin module"
168
+ msgstr ""
169
+
170
+ #: classes/modInstaller.php:76
171
+ msgid "Cannot create module directory. Try to set permission to "
172
+ msgstr ""
173
+
174
+ #: classes/modInstaller.php:103
175
+ msgid "No modules were found in XML file"
176
+ msgstr ""
177
+
178
+ #: classes/modInstaller.php:107
179
+ msgid "Invalid XML file"
180
+ msgstr ""
181
+
182
+ #: classes/modInstaller.php:109
183
+ msgid "No XML file were found"
184
+ msgstr ""
185
+
186
+ #: classes/modInstaller.php:132
187
+ #, php-format
188
+ msgid "Install %s failed"
189
+ msgstr ""
190
+
191
+ #: classes/modInstaller.php:138
192
+ msgid "Error Activate module"
193
+ msgstr ""
194
+
195
+ #: classes/modInstaller.php:168
196
+ msgid "Error Deactivation module"
197
+ msgstr ""
198
+
199
+ #: classes/modInstaller.php:189
200
+ msgid "Error Activating module"
201
+ msgstr ""
202
+
203
+ #: classes/table.php:277
204
+ msgid "Nothing to update"
205
+ msgstr ""
206
+
207
+ #: classes/table.php:293
208
+ msgid "Database error. Please contact your developer."
209
+ msgstr ""
210
+
211
+ #: classes/validator.php:30
212
+ #, php-format
213
+ msgid "Invalid length for %s, max length is %s"
214
+ msgstr ""
215
+
216
+ #: classes/validator.php:43
217
+ #, php-format
218
+ msgid "Invalid numeric value for %s"
219
+ msgstr ""
220
+
221
+ #: classes/validator.php:71
222
+ #, php-format
223
+ msgid "Please enter %s"
224
+ msgstr ""
225
+
226
+ #: classes/validator.php:78
227
+ #, php-format
228
+ msgid "Please select %s"
229
+ msgstr ""
230
+
231
+ #: classes/validator.php:85
232
+ #: classes/validator.php:101
233
+ #, php-format
234
+ msgid "Invalid %s"
235
+ msgstr ""
236
+
237
+ #: classes/validator.php:88
238
+ #, php-format
239
+ msgid "%s is already registered"
240
+ msgstr ""
241
+
242
+ #: classes/tables/modules.php:7
243
+ #: classes/tables/modules_type.php:8
244
+ msgid "Label"
245
+ msgstr ""
246
+
247
+ #: classes/tables/modules.php:8
248
+ msgid "Type"
249
+ msgstr ""
250
+
251
+ #: classes/tables/modules.php:9
252
+ msgid "Active"
253
+ msgstr ""
254
+
255
+ #: classes/tables/modules.php:10
256
+ msgid "Params"
257
+ msgstr ""
258
+
259
+ #: classes/tables/modules.php:13
260
+ msgid "Code"
261
+ msgstr ""
262
+
263
+ #: classes/tables/modules.php:14
264
+ msgid "External plugin directory"
265
+ msgstr ""
266
+
267
+ #: classes/tables/modules_type.php:7
268
+ msgid "ID"
269
+ msgstr ""
270
+
271
+ #: classes/tables/usage_stat.php:8
272
+ msgid "code"
273
+ msgstr ""
274
+
275
+ #: classes/tables/usage_stat.php:9
276
+ msgid "visits"
277
+ msgstr ""
278
+
279
+ #: classes/tables/usage_stat.php:10
280
+ msgid "spent_time"
281
+ msgstr ""
282
+
283
+ #: classes/tables/usage_stat.php:11
284
+ msgid "modify_timestamp"
285
+ msgstr ""
286
+
287
+ #: doc/popup-by-supsystic-pro/wpUpdater.php:68
288
+ msgid "An Unexpected HTTP Error occurred during the API request.</p> <p><a href=\"?\" onclick=\"document.location.reload(); return false;\">Try again</a>"
289
+ msgstr ""
290
+
291
+ #: doc/popup-by-supsystic-pro/wpUpdater.php:73
292
+ msgid "An unknown error occurred"
293
+ msgstr ""
294
+
295
+ #: doc/popup-by-supsystic-pro/ab_testing/mod.php:21
296
+ msgid "Testing"
297
+ msgstr ""
298
+
299
+ #: doc/popup-by-supsystic-pro/ab_testing/models/ab_testing.php:18
300
+ msgid "Enter Name"
301
+ msgstr ""
302
+
303
+ #: doc/popup-by-supsystic-pro/ab_testing/models/ab_testing.php:20
304
+ #: doc/popup-by-supsystic-pro/ab_testing/models/ab_testing.php:32
305
+ msgid "Empty Base ID"
306
+ msgstr ""
307
+
308
+ #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abEditFormControls.php:3
309
+ msgid "Back to Main PopUp"
310
+ msgstr ""
311
+
312
+ #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abNewForm.php:2
313
+ #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abPopupEditTab.php:3
314
+ msgid "Add New Test"
315
+ msgstr ""
316
+
317
+ #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abNewForm.php:5
318
+ msgid "Test PopUp Name"
319
+ msgstr ""
320
+
321
+ #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abPopupEditTab.php:7
322
+ msgid "Delete selected"
323
+ msgstr ""
324
+
325
+ #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abPopupEditTab.php:11
326
+ msgid "Clear"
327
+ msgstr ""
328
+
329
+ #: doc/popup-by-supsystic-pro/ab_testing/views/tpl/abPopupEditTab.php:17
330
+ msgid "You have no Test PopUps for now. <a href=\"#\" class=\"ppsAbAddNew\" style=\"font-style: italic;\">Create</a> your first Test!"
331
+ msgstr ""
332
+
333
+ #: doc/popup-by-supsystic-pro/activecampaign/mod.php:11
334
+ msgid "Active Campaign"
335
+ msgstr ""
336
+
337
+ #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:22
338
+ msgid "Please make sure that you created some Lists under your Active Campaign account."
339
+ msgstr ""
340
+
341
+ #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:26
342
+ msgid "Make sure that you entered correct API data."
343
+ msgstr ""
344
+
345
+ #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:40
346
+ msgid "Please enter your API URL"
347
+ msgstr ""
348
+
349
+ #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:42
350
+ msgid "Please enter your API key"
351
+ msgstr ""
352
+
353
+ #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:82
354
+ #, php-format
355
+ msgid "Add contact failed with error: %s"
356
+ msgstr ""
357
+
358
+ #: doc/popup-by-supsystic-pro/activecampaign/models/activecampaign.php:94
359
+ msgid "No lists to add selected in admin area - contact site owner to resolve this issue."
360
+ msgstr ""
361
+
362
+ #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:4
363
+ msgid "Not supported by Server"
364
+ msgstr ""
365
+
366
+ #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:5
367
+ msgid "Not supported on your server"
368
+ msgstr ""
369
+
370
+ #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:8
371
+ msgid "This module require to have cUrl library for PHP on server installed. Please contact your hosting provider and ask them to enable cUrl for you, this is Free library."
372
+ msgstr ""
373
+
374
+ #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:14
375
+ msgid "API URL"
376
+ msgstr ""
377
+
378
+ #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:15
379
+ #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:27
380
+ #, php-format
381
+ msgid "You can find it under your Active Campaign Account -> My Settings -> API, here is <a href=\"%s\" class=\"ppsAcHelpApiKeyLink\">help screenshot</a>"
382
+ msgstr ""
383
+
384
+ #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:26
385
+ msgid "API Key"
386
+ msgstr ""
387
+
388
+ #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:38
389
+ msgid "Campaigns for subscribe"
390
+ msgstr ""
391
+
392
+ #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:39
393
+ msgid "Select Campaigns for subscribe. They are taken from your Active Campaign account."
394
+ msgstr ""
395
+
396
+ #: doc/popup-by-supsystic-pro/activecampaign/views/tpl/acAdminFields.php:46
397
+ msgid "Choose Lists"
398
+ msgstr ""
399
+
400
+ #: doc/popup-by-supsystic-pro/arpreach/mod.php:8
401
+ msgid "arpReach"
402
+ msgstr ""
403
+
404
+ #: doc/popup-by-supsystic-pro/arpreach/views/tpl/arAdminFields.php:4
405
+ msgid "arpReach not supported"
406
+ msgstr ""
407
+
408
+ #: doc/popup-by-supsystic-pro/arpreach/views/tpl/arAdminFields.php:5
409
+ msgid "This module is not supported by your server configuration."
410
+ msgstr ""
411
+
412
+ #: doc/popup-by-supsystic-pro/arpreach/views/tpl/arAdminFields.php:8
413
+ msgid "arpReach is not supported on your server."
414
+ msgstr ""
415
+
416
+ #: doc/popup-by-supsystic-pro/arpreach/views/tpl/arAdminFields.php:14
417
+ msgid "arpReach intake form Action URL"
418
+ msgstr ""
419
+
420
+ #: doc/popup-by-supsystic-pro/arpreach/views/tpl/arAdminFields.php:15
421
+ msgid "Open your script for intake form, find there form tag with form method='post' action='http://yourdomain.coma/a/a.php/sub/a/xxxxxx', then copy \"action\" attribute - and paste it in text field below."
422
+ msgstr ""
423
+
424
+ #: doc/popup-by-supsystic-pro/benchmarkemail/mod.php:12
425
+ msgid "Benchmark"
426
+ msgstr ""
427
+
428
+ #: doc/popup-by-supsystic-pro/benchmarkemail/models/benchmarkemail.php:41
429
+ msgid "Please make sure that you created some Lists under your Benchmark account."
430
+ msgstr ""
431
+
432
+ #: doc/popup-by-supsystic-pro/benchmarkemail/models/benchmarkemail.php:45
433
+ msgid "Please enter your Benchmark Password"
434
+ msgstr ""
435
+
436
+ #: doc/popup-by-supsystic-pro/benchmarkemail/models/benchmarkemail.php:47
437
+ msgid "Please enter your Benchmark Login"
438
+ msgstr ""
439
+
440
+ #: doc/popup-by-supsystic-pro/benchmarkemail/views/tpl/beAdminFields.php:15
441
+ msgid "Benchmark Login"
442
+ msgstr ""
443
+
444
+ #: doc/popup-by-supsystic-pro/benchmarkemail/views/tpl/beAdminFields.php:16
445
+ msgid "Login for your Benchmark account."
446
+ msgstr ""
447
+
448
+ #: doc/popup-by-supsystic-pro/benchmarkemail/views/tpl/beAdminFields.php:27
449
+ msgid "Benchmark Password"
450
+ msgstr ""
451
+
452
+ #: doc/popup-by-supsystic-pro/benchmarkemail/views/tpl/beAdminFields.php:28
453
+ msgid "Password for your Benchmark account."
454
+ msgstr ""
455
+
456
+ #: doc/popup-by-supsystic-pro/benchmarkemail/views/tpl/beAdminFields.php:40
457
+ msgid "Select Campaigns for subscribe. They are taken from your Benchmark account."
458
+ msgstr ""
459
+
460
+ #: doc/popup-by-supsystic-pro/campaignmonitor/mod.php:8
461
+ msgid "Campaign Monitor"
462
+ msgstr ""
463
+
464
+ #: doc/popup-by-supsystic-pro/campaignmonitor/models/campaignmonitor.php:16
465
+ #, php-format
466
+ msgid "You have no lists for now. Go to your <a href=\"%s\" target=\"_blank\">Campaign Monitor Account -> Lists & Subscribers</a> and create list at first, then just reload this page"
467
+ msgstr ""
468
+
469
+ #: doc/popup-by-supsystic-pro/campaignmonitor/models/campaignmonitor.php:185
470
+ msgid "Something going wrong while trying to send data to mail list service. Please contact site owner."
471
+ msgstr ""
472
+
473
+ #: doc/popup-by-supsystic-pro/campaignmonitor/models/campaignmonitor.php:195
474
+ msgid "Can not detect authorization fo account owner. Contact site owner to resolve this issue."
475
+ msgstr ""
476
+
477
+ #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:4
478
+ msgid "Campaign Monitor not supported"
479
+ msgstr ""
480
+
481
+ #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:8
482
+ msgid "Campaign Monitor require at least PHP version 5.3. Please contact your hosting provider and ask them to switch your PHP to version 5.3. or higher."
483
+ msgstr ""
484
+
485
+ #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:14
486
+ msgid "Campaign Monitor Setup"
487
+ msgstr ""
488
+
489
+ #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:15
490
+ msgid "You must authorize to use Campaign Monitor features"
491
+ msgstr ""
492
+
493
+ #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:18
494
+ msgid "Authorize in Campaign Monitor"
495
+ msgstr ""
496
+
497
+ #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:24
498
+ msgid "Lists for subscribe"
499
+ msgstr ""
500
+
501
+ #: doc/popup-by-supsystic-pro/campaignmonitor/views/tpl/cmAdminFields.php:25
502
+ msgid "Select lists for subscribe. They are taken from your Campaign Monitor account."
503
+ msgstr ""
504
+
505
+ #: doc/popup-by-supsystic-pro/constantcontact/mod.php:11
506
+ msgid "Constant Contact"
507
+ msgstr ""
508
+
509
+ #: doc/popup-by-supsystic-pro/constantcontact/models/constantcontact.php:39
510
+ msgid "You are not logged-in"
511
+ msgstr ""
512
+
513
+ #: doc/popup-by-supsystic-pro/constantcontact/models/constantcontact.php:41
514
+ msgid "Can not get cc obj"
515
+ msgstr ""
516
+
517
+ #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:4
518
+ msgid "Constant Contact not supported"
519
+ msgstr ""
520
+
521
+ #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:8
522
+ msgid "Constant Contact require at least PHP version 5.3. Please contact your hosting provider and ask them to switch your PHP to version 5.3. or higher."
523
+ msgstr ""
524
+
525
+ #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:14
526
+ msgid "Constant Contact Setup"
527
+ msgstr ""
528
+
529
+ #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:15
530
+ msgid "You must authorize to use Constant Contact features"
531
+ msgstr ""
532
+
533
+ #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:18
534
+ msgid "Authorize in Constant Contact"
535
+ msgstr ""
536
+
537
+ #: doc/popup-by-supsystic-pro/constantcontact/views/tpl/ccAdminFields.php:25
538
+ msgid "Select lists for subscribe. They are taken from your Constant Contact account."
539
+ msgstr ""
540
+
541
+ #: doc/popup-by-supsystic-pro/feedblitz/mod.php:8
542
+ msgid "FeedBlitz"
543
+ msgstr ""
544
+
545
+ #: doc/popup-by-supsystic-pro/feedblitz/models/feedblitz.php:11
546
+ msgid "You have no lists. Login to your SendGrid account and create your first list before start using this functionality."
547
+ msgstr ""
548
+
549
+ #: doc/popup-by-supsystic-pro/feedblitz/models/feedblitz.php:61
550
+ msgid "Some error occured during connection to the server"
551
+ msgstr ""
552
+
553
+ #: doc/popup-by-supsystic-pro/feedblitz/views/tpl/feedbAdminFields.php:4
554
+ msgid "FeedBlitz not supported"
555
+ msgstr ""
556
+
557
+ #: doc/popup-by-supsystic-pro/feedblitz/views/tpl/feedbAdminFields.php:8
558
+ msgid "FeedBlitz is not supported on your server"
559
+ msgstr ""
560
+
561
+ #: doc/popup-by-supsystic-pro/feedblitz/views/tpl/feedbAdminFields.php:14
562
+ msgid "FeedBlitz API Key"
563
+ msgstr ""
564
+
565
+ #: doc/popup-by-supsystic-pro/feedblitz/views/tpl/feedbAdminFields.php:15
566
+ msgid "Your FeedBlitz API Key"
567
+ msgstr ""
568
+
569
+ #: doc/popup-by-supsystic-pro/feedblitz/views/tpl/feedbAdminFields.php:26
570
+ msgid "Select lists for subscribe. They are taken from your FeedBlitz account."
571
+ msgstr ""
572
+
573
+ #: doc/popup-by-supsystic-pro/get_response/mod.php:11
574
+ msgid "GetResponse"
575
+ msgstr ""
576
+
577
+ #: doc/popup-by-supsystic-pro/get_response/views/tpl/grAdminFields.php:15
578
+ #, php-format
579
+ msgid "You can find it under your GetResponse Account -> GetResponse API, here is <a href=\"%s\" class=\"ppsGrHelpApiKeyLink\" target=\"_blank\">help screenshot</a>"
580
+ msgstr ""
581
+
582
+ #: doc/popup-by-supsystic-pro/get_response/views/tpl/grAdminFields.php:26
583
+ msgid "Select Campaigns for subscribe. They are taken from your GetResponse account."
584
+ msgstr ""
585
+
586
+ #: doc/popup-by-supsystic-pro/get_response/views/tpl/grAdminFields.php:41
587
+ msgid "Cycle Day"
588
+ msgstr ""
589
+
590
+ #: doc/popup-by-supsystic-pro/get_response/views/tpl/grAdminFields.php:42
591
+ msgid "Insert contact on a given day at the autoresponder cycle. Value of 0 means the beginning of the cycle. Lack of this param means that a contact will not be inserted into cycle."
592
+ msgstr ""
593
+
594
+ #: doc/popup-by-supsystic-pro/icontact/mod.php:11
595
+ msgid "iContact"
596
+ msgstr ""
597
+
598
+ #: doc/popup-by-supsystic-pro/icontact/models/icontact.php:20
599
+ msgid "Please enter your Application ID"
600
+ msgstr ""
601
+
602
+ #: doc/popup-by-supsystic-pro/icontact/models/icontact.php:23
603
+ msgid "Please enter your API Username"
604
+ msgstr ""
605
+
606
+ #: doc/popup-by-supsystic-pro/icontact/models/icontact.php:26
607
+ msgid "Please enter your API Password"
608
+ msgstr ""
609
+
610
+ #: doc/popup-by-supsystic-pro/icontact/models/icontact.php:43
611
+ msgid "You have no lists in your iContact account for now."
612
+ msgstr ""
613
+
614
+ #: doc/popup-by-supsystic-pro/icontact/models/icontact.php:107
615
+ msgid "Can't add contact"
616
+ msgstr ""
617
+
618
+ #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:14
619
+ msgid "Application ID"
620
+ msgstr ""
621
+
622
+ #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:15
623
+ #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:26
624
+ #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:37
625
+ #, php-format
626
+ msgid "You can create it <a href=\"%s\" target=\"_blank\">here</a>. More info can be found <a href=\"%s\" target=\"_blank\">here</a>"
627
+ msgstr ""
628
+
629
+ #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:25
630
+ msgid "API Username"
631
+ msgstr ""
632
+
633
+ #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:36
634
+ msgid "API Password"
635
+ msgstr ""
636
+
637
+ #: doc/popup-by-supsystic-pro/icontact/views/tpl/icAdminFields.php:48
638
+ msgid "Select Lists for subscribe. They are taken from your iContact account."
639
+ msgstr ""
640
+
641
+ #: doc/popup-by-supsystic-pro/infusionsoft/mod.php:13
642
+ msgid "InfusionSoft"
643
+ msgstr ""
644
+
645
+ #: doc/popup-by-supsystic-pro/infusionsoft/models/infusionsoft.php:87
646
+ msgid "Administrator of this site need to re-autentificate in InfusionSoft system from admin area"
647
+ msgstr ""
648
+
649
+ #: doc/popup-by-supsystic-pro/infusionsoft/views/tpl/isAdminFields.php:8
650
+ msgid "This module require to have cUrl library for PHP on server installed and PHP version to be at least 5.3.2. Please contact your hosting provider and ask them to enable cUrl for you, this is Free library, and check your PHP version."
651
+ msgstr ""
652
+
653
+ #: doc/popup-by-supsystic-pro/infusionsoft/views/tpl/isAdminFields.php:14
654
+ msgid "InfusionSoft Setup"
655
+ msgstr ""
656
+
657
+ #: doc/popup-by-supsystic-pro/infusionsoft/views/tpl/isAdminFields.php:15
658
+ msgid "You must authorize to use InfusionSoft features"
659
+ msgstr ""
660
+
661
+ #: doc/popup-by-supsystic-pro/infusionsoft/views/tpl/isAdminFields.php:18
662
+ msgid "Authorize in InfusionSoft"
663
+ msgstr ""
664
+
665
+ #: doc/popup-by-supsystic-pro/layered_popup/mod.php:10
666
+ msgid "Popup Location"
667
+ msgstr ""
668
+
669
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:7
670
+ msgid "Enable Layered PopUp Style"
671
+ msgstr ""
672
+
673
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:9
674
+ msgid "By default all PopUps have modal style: it appears on user screen over the whole site. Layered style allows you to show your PopUp - on selected position: top, bottom, etc. and not over your site - but right near your content."
675
+ msgstr ""
676
+
677
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:13
678
+ msgid "Select position for your PopUp"
679
+ msgstr ""
680
+
681
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:16
682
+ msgid "Top Left"
683
+ msgstr ""
684
+
685
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:17
686
+ msgid "Top"
687
+ msgstr ""
688
+
689
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:18
690
+ msgid "Top Right"
691
+ msgstr ""
692
+
693
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:20
694
+ msgid "Center Left"
695
+ msgstr ""
696
+
697
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:21
698
+ msgid "Center"
699
+ msgstr ""
700
+
701
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:22
702
+ msgid "Center Right"
703
+ msgstr ""
704
+
705
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:24
706
+ msgid "Bottom Left"
707
+ msgstr ""
708
+
709
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:25
710
+ msgid "Bottom"
711
+ msgstr ""
712
+
713
+ #: doc/popup-by-supsystic-pro/layered_popup/views/tpl/lpPopupEditTab.php:26
714
+ msgid "Bottom Right"
715
+ msgstr ""
716
+
717
+ #: doc/popup-by-supsystic-pro/license/mod.php:30
718
+ #, php-format
719
+ msgid "Your license has expired. Once you extend your license - you will be able to Update PRO version. To extend PRO version license - follow <a href=\"%s\" target=\"_blank\">this link</a>, then - go to <a href=\"%s\">License</a> tab anc click on \"Re-activate\" button to re-activate your PRO version."
720
+ msgstr ""
721
+
722
+ #: doc/popup-by-supsystic-pro/license/mod.php:38
723
+ #, php-format
724
+ msgid "Your license for PRO version of %s plugin has expired. You can <a href=\"%s\" target=\"_blank\">click here</a> to extend your license, then - go to <a href=\"%s\">License</a> tab and click on \"Re-activate\" button to re-activate your PRO version."
725
+ msgstr ""
726
+
727
+ #: doc/popup-by-supsystic-pro/license/mod.php:51
728
+ msgid "License"
729
+ msgstr ""
730
+
731
+ #: doc/popup-by-supsystic-pro/license/mod.php:74
732
+ msgid "Activate License"
733
+ msgstr ""
734
+
735
+ #: doc/popup-by-supsystic-pro/license/mod.php:76
736
+ msgid "Renew License"
737
+ msgstr ""
738
+
739
+ #: doc/popup-by-supsystic-pro/license/models/license.php:54
740
+ msgid "Please enter your License Key"
741
+ msgstr ""
742
+
743
+ #: doc/popup-by-supsystic-pro/license/models/license.php:56
744
+ msgid "Please enter your Email address"
745
+ msgstr ""
746
+
747
+ #: doc/popup-by-supsystic-pro/license/models/license.php:131
748
+ msgid "There was a problem with sending request to our authentication server. Please try later."
749
+ msgstr ""
750
+
751
+ #: doc/popup-by-supsystic-pro/license/models/license.php:154
752
+ #, php-format
753
+ msgid "License for plugin %s will expire today."
754
+ msgstr ""
755
+
756
+ #: doc/popup-by-supsystic-pro/license/models/license.php:156
757
+ #, php-format
758
+ msgid "License for plugin %s will expire tomorrow."
759
+ msgstr ""
760
+
761
+ #: doc/popup-by-supsystic-pro/license/models/license.php:158
762
+ #, php-format
763
+ msgid "License for plugin %s will expire in %d days."
764
+ msgstr ""
765
+
766
+ #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:4
767
+ #, php-format
768
+ msgid "Congratulations! PRO version of %s plugin has been activated and is working fine!"
769
+ msgstr ""
770
+
771
+ #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:6
772
+ #, php-format
773
+ msgid "Your license for PRO version of %s plugin has expired. You can <a href=\"%s\" target=\"_blank\">click here</a> to extend your license, then - click on \"Re-activate\" button to re-activate your PRO version."
774
+ msgstr ""
775
+
776
+ #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:8
777
+ #, php-format
778
+ msgid "Congratulations! You have successfully installed PRO version of %s plugin. Final step to finish Your PRO version setup - is to enter your Email and License Key on this page. This will activate Your copy of software on this site."
779
+ msgstr ""
780
+
781
+ #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:20
782
+ msgid "Email"
783
+ msgstr ""
784
+
785
+ #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:23
786
+ #, php-format
787
+ msgid "Your email address, used on checkout procedure on <a href=\"%s\" target=\"_blank\">%s</a>"
788
+ msgstr ""
789
+
790
+ #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:31
791
+ msgid "License Key"
792
+ msgstr ""
793
+
794
+ #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:34
795
+ #, php-format
796
+ msgid "Your License Key from your account on <a href=\"%s\" target=\"_blank\">%s</a>"
797
+ msgstr ""
798
+
799
+ #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:47
800
+ msgid "Re-activate"
801
+ msgstr ""
802
+
803
+ #: doc/popup-by-supsystic-pro/license/views/tpl/licenseAdmin.php:49
804
+ msgid "Activate"
805
+ msgstr ""
806
+
807
+ #: doc/popup-by-supsystic-pro/login/controller.php:19
808
+ msgid "Login Success!"
809
+ msgstr ""
810
+
811
+ #: doc/popup-by-supsystic-pro/login/controller.php:39
812
+ msgid "Thank you for registration!"
813
+ msgstr ""
814
+
815
+ #: doc/popup-by-supsystic-pro/login/controller.php:43
816
+ msgid "Confirmation link was sent to your email address. Check your email!"
817
+ msgstr ""
818
+
819
+ #: doc/popup-by-supsystic-pro/login/mod.php:13
820
+ msgid "Login/Registration"
821
+ msgstr ""
822
+
823
+ #: doc/popup-by-supsystic-pro/login/mod.php:30
824
+ msgid "E-Mail"
825
+ msgstr ""
826
+
827
+ #: doc/popup-by-supsystic-pro/login/mod.php:32
828
+ msgid "Username"
829
+ msgstr ""
830
+
831
+ #: doc/popup-by-supsystic-pro/login/mod.php:34
832
+ msgid "Password"
833
+ msgstr ""
834
+
835
+ #: doc/popup-by-supsystic-pro/login/models/login.php:80
836
+ msgid "Empty or invalid username"
837
+ msgstr ""
838
+
839
+ #: doc/popup-by-supsystic-pro/login/models/login.php:85
840
+ msgid "Empty or invalid password"
841
+ msgstr ""
842
+
843
+ #: doc/popup-by-supsystic-pro/login/views/login.php:9
844
+ msgid "Text"
845
+ msgstr ""
846
+
847
+ #: doc/popup-by-supsystic-pro/login/views/login.php:10
848
+ msgid "Text area"
849
+ msgstr ""
850
+
851
+ #: doc/popup-by-supsystic-pro/login/views/login.php:11
852
+ msgid "Select box"
853
+ msgstr ""
854
+
855
+ #: doc/popup-by-supsystic-pro/login/views/login.php:12
856
+ msgid "Hidden Field"
857
+ msgstr ""
858
+
859
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:1
860
+ msgid "This option will replace Subscribe form with Login / Registration forms"
861
+ msgstr ""
862
+
863
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:8
864
+ msgid "Enable Login"
865
+ msgstr ""
866
+
867
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:15
868
+ msgid "Login by"
869
+ msgstr ""
870
+
871
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:16
872
+ msgid "Choose what info needs to be entered for login. Password will be included by default."
873
+ msgstr ""
874
+
875
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:35
876
+ msgid "Redirect after login URL"
877
+ msgstr ""
878
+
879
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:36
880
+ msgid "You can enable redirection after login, just enter here URL that you want to redirect to after login - and user will be redirected there. If you don't need this feature - just leave this field empty: browser window will be just reloaded after successful login."
881
+ msgstr ""
882
+
883
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:46
884
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:85
885
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:234
886
+ msgid "Open in a new window (tab)"
887
+ msgstr ""
888
+
889
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:52
890
+ msgid "Login button name"
891
+ msgstr ""
892
+
893
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:56
894
+ msgid "Login"
895
+ msgstr ""
896
+
897
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:67
898
+ msgid "Enable Registration"
899
+ msgstr ""
900
+
901
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:74
902
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:223
903
+ msgid "Redirect after registration URL"
904
+ msgstr ""
905
+
906
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:75
907
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:224
908
+ msgid "You can enable redirection after registration, just enter here URL that you want to redirect to after registration - and user will be redirected there. If you don't need this feature - just leave this field empty."
909
+ msgstr ""
910
+
911
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:91
912
+ msgid "Create user with the chosen role after registration"
913
+ msgstr ""
914
+
915
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:92
916
+ msgid "Use this only if you really need it. Remember! After you change this option - your new users will have more privileges than usual subscribers, so be careful with this option!"
917
+ msgstr ""
918
+
919
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:102
920
+ msgid "Create User without confirmation"
921
+ msgstr ""
922
+
923
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:103
924
+ msgid "Usually, after user registration, we send an email with the confirmation link - to confirm the email address, and only after user clicks on the link from this email - we will create a new user. This option allows you to create user - right after registration, without the email confirmation process."
925
+ msgstr ""
926
+
927
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:112
928
+ msgid "Export Users"
929
+ msgstr ""
930
+
931
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:113
932
+ msgid "Export all users, who registered using your PopUp, as CSV file."
933
+ msgstr ""
934
+
935
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:116
936
+ msgid "Get CSV List"
937
+ msgstr ""
938
+
939
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:121
940
+ msgid "Registration button name"
941
+ msgstr ""
942
+
943
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:125
944
+ msgid "Register"
945
+ msgstr ""
946
+
947
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:132
948
+ msgid "Registration fields"
949
+ msgstr ""
950
+
951
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:133
952
+ msgid "To change field position - just drag-&-drop it to required place between other fields. To add new field to Registration form - click on \"+ Add\" button."
953
+ msgstr ""
954
+
955
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:182
956
+ msgid "Add"
957
+ msgstr ""
958
+
959
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:190
960
+ msgid "\"Confirmation sent\" message"
961
+ msgstr ""
962
+
963
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:191
964
+ msgid "This is the message that the user will see after registration, when letter with confirmation link was sent."
965
+ msgstr ""
966
+
967
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:201
968
+ msgid "Registration success message"
969
+ msgstr ""
970
+
971
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:202
972
+ msgid "Right after new user will be created and confirmed - this message will be shown."
973
+ msgstr ""
974
+
975
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:212
976
+ msgid "Email error message"
977
+ msgstr ""
978
+
979
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:213
980
+ msgid "If email that was entered by user is invalid, user will see this message"
981
+ msgstr ""
982
+
983
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:217
984
+ msgid "Empty or invalid email"
985
+ msgstr ""
986
+
987
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:240
988
+ msgid "Confirmation email subject"
989
+ msgstr ""
990
+
991
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:241
992
+ msgid "Email with confirmation link subject"
993
+ msgstr ""
994
+
995
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:247
996
+ msgid "Confirm registration on [sitename]"
997
+ msgstr ""
998
+
999
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:253
1000
+ msgid "Confirmation email From field"
1001
+ msgstr ""
1002
+
1003
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:254
1004
+ msgid "Email with confirmation link From field"
1005
+ msgstr ""
1006
+
1007
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:266
1008
+ msgid "Confirmation email text"
1009
+ msgstr ""
1010
+
1011
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:267
1012
+ msgid "Email with confirmation link content"
1013
+ msgstr ""
1014
+
1015
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:269
1016
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:310
1017
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:338
1018
+ #, php-format
1019
+ msgid "You can use next variables here: %s"
1020
+ msgstr ""
1021
+
1022
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:275
1023
+ msgid "You registered on site <a href=\"[siteurl]\">[sitename]</a>. Follow <a href=\"[confirm_link]\">this link</a> to complete your registration. If you did not register here - just ignore this message."
1024
+ msgstr ""
1025
+
1026
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:281
1027
+ msgid "New Member email subject"
1028
+ msgstr ""
1029
+
1030
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:282
1031
+ msgid "Email to New Member subject"
1032
+ msgstr ""
1033
+
1034
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:288
1035
+ msgid "[sitename] Your username and password"
1036
+ msgstr ""
1037
+
1038
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:294
1039
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:295
1040
+ msgid "New Member email From field"
1041
+ msgstr ""
1042
+
1043
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:307
1044
+ msgid "New Member email text"
1045
+ msgstr ""
1046
+
1047
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:308
1048
+ msgid "Email to New Member content"
1049
+ msgstr ""
1050
+
1051
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:316
1052
+ msgid "Username: [user_login]<br />Password: [password]<br />[login_url]"
1053
+ msgstr ""
1054
+
1055
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:322
1056
+ msgid "New Member Notification"
1057
+ msgstr ""
1058
+
1059
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:323
1060
+ msgid "Enter the email addresses that should receive notifications (separate by comma). Leave it blank - and you will not get any notifications."
1061
+ msgstr ""
1062
+
1063
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:335
1064
+ msgid "New Member Notification email text"
1065
+ msgstr ""
1066
+
1067
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:336
1068
+ msgid "Message that you will receive about new members on your site."
1069
+ msgstr ""
1070
+
1071
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:345
1072
+ msgid "You have new member on your site <a href=\"[siteurl]\">[sitename]</a>, here us member information:<br />[subscriber_data]"
1073
+ msgstr ""
1074
+
1075
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:352
1076
+ msgid "Registration Field Settings"
1077
+ msgstr ""
1078
+
1079
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:356
1080
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:405
1081
+ msgid "Name"
1082
+ msgstr ""
1083
+
1084
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:357
1085
+ #, php-format
1086
+ msgid "Name (key) for your field. This parameter is for system - to be able to determine the field. Use here only latin letters, numbers and symbols -_+. For more info about this parameter - your can check <a href=\"%s\" target=\"_blank\">this page</a>."
1087
+ msgstr ""
1088
+
1089
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:366
1090
+ msgid "Label that will be visible for your members."
1091
+ msgstr ""
1092
+
1093
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:374
1094
+ msgid "Value"
1095
+ msgstr ""
1096
+
1097
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:375
1098
+ msgid "Default value for your field"
1099
+ msgstr ""
1100
+
1101
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:383
1102
+ msgid "Html Type"
1103
+ msgstr ""
1104
+
1105
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:384
1106
+ msgid "This parameter will show - how we must render this field."
1107
+ msgstr ""
1108
+
1109
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:394
1110
+ msgid "Select Options"
1111
+ msgstr ""
1112
+
1113
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:412
1114
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:436
1115
+ msgid "Remove"
1116
+ msgstr ""
1117
+
1118
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:421
1119
+ msgid "Mandatory"
1120
+ msgstr ""
1121
+
1122
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:422
1123
+ msgid "Is this field mandatory to fill-in. If yes - then users will not be able to continue without filling-in this field."
1124
+ msgstr ""
1125
+
1126
+ #: doc/popup-by-supsystic-pro/login/views/tpl/loginAdmin.php:433
1127
+ msgid "Settings"
1128
+ msgstr ""
1129
+
1130
+ #: doc/popup-by-supsystic-pro/mailrelay/mod.php:9
1131
+ msgid "Mailrelay"
1132
+ msgstr ""
1133
+
1134
+ #: doc/popup-by-supsystic-pro/mailrelay/models/mailrelay.php:15
1135
+ msgid "You have no lists. Login to your Mailrelay account and create your first list before start using this functionality."
1136
+ msgstr ""
1137
+
1138
+ #: doc/popup-by-supsystic-pro/mailrelay/models/mailrelay.php:159
1139
+ msgid "Failed to create subscriber."
1140
+ msgstr ""
1141
+
1142
+ #: doc/popup-by-supsystic-pro/mailrelay/models/mailrelay.php:165
1143
+ msgid "Can not detect Host and API key. Contact site owner to resolve this issue."
1144
+ msgstr ""
1145
+
1146
+ #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:4
1147
+ msgid "Mailrelay not supported"
1148
+ msgstr ""
1149
+
1150
+ #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:8
1151
+ msgid "Mailrelay is not supported on your server"
1152
+ msgstr ""
1153
+
1154
+ #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:14
1155
+ msgid "Mailrelay Host"
1156
+ msgstr ""
1157
+
1158
+ #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:15
1159
+ msgid "Please enter the host that you have in your Mairelay welcome email. Please enter it without the initial http:// (for example demo.ip-zone.com)"
1160
+ msgstr ""
1161
+
1162
+ #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:34
1163
+ msgid "Mailrelay API Key"
1164
+ msgstr ""
1165
+
1166
+ #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:35
1167
+ msgid "Please enter your API key. You can generate your API key on your Mailrelay panel, Configuration -> API access -> Generate API key"
1168
+ msgstr ""
1169
+
1170
+ #: doc/popup-by-supsystic-pro/mailrelay/views/tpl/mrAdminFields.php:47
1171
+ msgid "To create new groups in Mailrelay, you must login into the control panel and click into the Mail Relay > Subscribers groups. Once there you can add a new group for your Wordpress users, or edit an existing one"
1172
+ msgstr ""
1173
+
1174
+ #: doc/popup-by-supsystic-pro/on_exit/views/tpl/onExitAdminOption.php:1
1175
+ #, php-format
1176
+ msgid "Show when user tries to exit from your site. <a target=\"_blank\" href=\"%s\">Check example.</a>"
1177
+ msgstr ""
1178
+
1179
+ #: doc/popup-by-supsystic-pro/on_exit/views/tpl/onExitAdminOption.php:5
1180
+ msgid "On Exit from Site"
1181
+ msgstr ""
1182
+
1183
+ #: doc/popup-by-supsystic-pro/salesforce/mod.php:11
1184
+ msgid "SalesForce - Web-to-Lead"
1185
+ msgstr ""
1186
+
1187
+ #: doc/popup-by-supsystic-pro/salesforce/views/tpl/sfAdminFields.php:14
1188
+ msgid "Form ID"
1189
+ msgstr ""
1190
+
1191
+ #: doc/popup-by-supsystic-pro/salesforce/views/tpl/sfAdminFields.php:15
1192
+ #, php-format
1193
+ msgid "Generate your lead form in your Salesforce account (more about generating form you can read <a target=\"_blank\" href=\"%s\">here</a>), then copy \"oid\" value from it (<a target=\"_blank\" href=\"%s\">like this</a>) and insert it into this paramter"
1194
+ msgstr ""
1195
+
1196
+ #: doc/popup-by-supsystic-pro/sendgrid/mod.php:9
1197
+ msgid "SendGrid"
1198
+ msgstr ""
1199
+
1200
+ #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:4
1201
+ msgid "SendGrid not supported"
1202
+ msgstr ""
1203
+
1204
+ #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:8
1205
+ msgid "SendGrid is not supported on your server"
1206
+ msgstr ""
1207
+
1208
+ #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:14
1209
+ msgid "SendGrid Username"
1210
+ msgstr ""
1211
+
1212
+ #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:15
1213
+ msgid "Your SendGrid name"
1214
+ msgstr ""
1215
+
1216
+ #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:25
1217
+ msgid "SendGrid Password"
1218
+ msgstr ""
1219
+
1220
+ #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:26
1221
+ msgid "Your SendGrid password"
1222
+ msgstr ""
1223
+
1224
+ #: doc/popup-by-supsystic-pro/sendgrid/views/tpl/sgAdminFields.php:37
1225
+ msgid "Select lists for subscribe. They are taken from your SendGrid account."
1226
+ msgstr ""
1227
+
1228
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/mod.php:8
1229
+ msgid "SG Autorepondeur"
1230
+ msgstr ""
1231
+
1232
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:86
1233
+ msgid "Required fields are missing"
1234
+ msgstr ""
1235
+
1236
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:87
1237
+ msgid "The email is already in the list"
1238
+ msgstr ""
1239
+
1240
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:88
1241
+ msgid "Registration was refused-blacklisted"
1242
+ msgstr ""
1243
+
1244
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:89
1245
+ msgid "The country has been blocked"
1246
+ msgstr ""
1247
+
1248
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:90
1249
+ msgid "Too many entries with the same IP address"
1250
+ msgstr ""
1251
+
1252
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:91
1253
+ msgid "Ok Register following a behavioral segmentation"
1254
+ msgstr ""
1255
+
1256
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:94
1257
+ msgid "The email is not the right format"
1258
+ msgstr ""
1259
+
1260
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/models/sgautorepondeur.php:95
1261
+ msgid "Error on one of the variables - User ID or List ID or Activation Code"
1262
+ msgstr ""
1263
+
1264
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:4
1265
+ msgid "SG Autorepondeur not supported"
1266
+ msgstr ""
1267
+
1268
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:8
1269
+ msgid "SG Autorepondeur is not supported on your server"
1270
+ msgstr ""
1271
+
1272
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:14
1273
+ msgid "SG Autorepondeur User ID"
1274
+ msgstr ""
1275
+
1276
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:15
1277
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:26
1278
+ msgid "This info available on your home page in SG Autorepondeur"
1279
+ msgstr ""
1280
+
1281
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:25
1282
+ msgid "SG Autorepondeur List ID"
1283
+ msgstr ""
1284
+
1285
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:36
1286
+ msgid "SG Client Activation Code"
1287
+ msgstr ""
1288
+
1289
+ #: doc/popup-by-supsystic-pro/sgautorepondeur/views/tpl/sgaAdminFields.php:37
1290
+ msgid "This info available on the member's area in the top menu \"my account\" (at the bottom of the page)"
1291
+ msgstr ""
1292
+
1293
+ #: doc/popup-by-supsystic-pro/sub_fields/views/sub_fields.php:7
1294
+ msgid "Selectbox"
1295
+ msgstr ""
1296
+
1297
+ #: doc/popup-by-supsystic-pro/sub_fields/views/sub_fields.php:8
1298
+ msgid "Checkbox"
1299
+ msgstr ""
1300
+
1301
+ #: doc/popup-by-supsystic-pro/sub_fields/views/tpl/sfAdminControls.php:2
1302
+ msgid "Subscribe Field Settings"
1303
+ msgstr ""
1304
+
1305
+ #: doc/popup-by-supsystic-pro/sub_fields/views/tpl/sfAdminControls.php:16
1306
+ msgid "Label that will be visible for your subscribers."
1307
+ msgstr ""
1308
+
1309
+ #: doc/popup-by-supsystic-pro/sub_social/controller.php:9
1310
+ msgid "PopUp ID is not specified."
1311
+ msgstr ""
1312
+
1313
+ #: doc/popup-by-supsystic-pro/sub_social/controller.php:13
1314
+ msgid "Authorization code is not specified."
1315
+ msgstr ""
1316
+
1317
+ #: doc/popup-by-supsystic-pro/sub_social/controller.php:36
1318
+ msgid "Subscribing"
1319
+ msgstr ""
1320
+
1321
+ #: doc/popup-by-supsystic-pro/sub_social/controller.php:45
1322
+ msgid "Cannot get your email address"
1323
+ msgstr ""
1324
+
1325
+ #: doc/popup-by-supsystic-pro/sub_social/mod.php:75
1326
+ msgid "Sign in with"
1327
+ msgstr ""
1328
+
1329
+ #: doc/popup-by-supsystic-pro/sub_social/mod.php:76
1330
+ msgid "Facebook"
1331
+ msgstr ""
1332
+
1333
+ #: doc/popup-by-supsystic-pro/verticalresponse/mod.php:16
1334
+ msgid "Vertical Response"
1335
+ msgstr ""
1336
+
1337
+ #: doc/popup-by-supsystic-pro/verticalresponse/models/verticalresponse.php:104
1338
+ msgid "Can not access to Vertical Responce server"
1339
+ msgstr ""
1340
+
1341
+ #: doc/popup-by-supsystic-pro/verticalresponse/models/verticalresponse.php:106
1342
+ msgid "Empty code returned"
1343
+ msgstr ""
1344
+
1345
+ #: doc/popup-by-supsystic-pro/verticalresponse/views/tpl/vrAdminFields.php:4
1346
+ msgid "Vertical Response Setup"
1347
+ msgstr ""
1348
+
1349
+ #: doc/popup-by-supsystic-pro/verticalresponse/views/tpl/vrAdminFields.php:5
1350
+ msgid "You must authorize to use Vertical Response features"
1351
+ msgstr ""
1352
+
1353
+ #: doc/popup-by-supsystic-pro/verticalresponse/views/tpl/vrAdminFields.php:8
1354
+ msgid "Authorize in Vertical Response"
1355
+ msgstr ""
1356
+
1357
+ #: doc/popup-by-supsystic-pro/verticalresponse/views/tpl/vrAdminFields.php:15
1358
+ msgid "Select lists for subscribe. They are taken from your Vertical Response account."
1359
+ msgstr ""
1360
+
1361
+ #: doc/promo-popup-by-supsystic-pro/get_response/views/tpl/grAdminFields.php:15
1362
+ #, php-format
1363
+ msgid "You can find it under your GetResponse Account -> GetResponse API, here is <a href=\"%s\" class=\"ppsGrHelpApiKeyLink\">help screenshot</a>"
1364
+ msgstr ""
1365
+
1366
+ #: doc/promo-popup-by-supsystic-pro/infusionsoft/views/tpl/isAdminFields.php:8
1367
+ msgid "This module require to have cUrl library for PHP on server installed and PHP version to be at least 5.3. Please contact your hosting provider and ask them to enable cUrl for you, this is Free library, and check your PHP version."
1368
+ msgstr ""
1369
+
1370
+ #: doc/promo-popup-by-supsystic-pro/layered_popup/mod.php:10
1371
+ msgid "Layered Style"
1372
+ msgstr ""
1373
+
1374
+ #: modules/adminmenu/mod.php:13
1375
+ #, php-format
1376
+ msgid "Cool WordPress plugins from supsystic.com developers. I tried %s - and this was what I need! #supsystic.com"
1377
+ msgstr ""
1378
+
1379
+ #: modules/adminmenu/mod.php:15
1380
+ msgid "More plugins for your WordPress site here!"
1381
+ msgstr ""
1382
+
1383
+ #: modules/adminmenu/mod.php:16
1384
+ #: modules/adminmenu/mod.php:17
1385
+ #: modules/adminmenu/mod.php:18
1386
+ msgid "Spread the word!"
1387
+ msgstr ""
1388
+
1389
+ #: modules/mail/controller.php:7
1390
+ msgid "Now check your email inbox / spam folders for test mail."
1391
+ msgstr ""
1392
+
1393
+ #: modules/mail/mod.php:41
1394
+ msgid "Cannot send email - problem with send server"
1395
+ msgstr ""
1396
+
1397
+ #: modules/mail/mod.php:54
1398
+ msgid "Mail"
1399
+ msgstr ""
1400
+
1401
+ #: modules/mail/mod.php:56
1402
+ msgid "Mail function tested and work"
1403
+ msgstr ""
1404
+
1405
+ #: modules/mail/mod.php:57
1406
+ msgid "Notify Email"
1407
+ msgstr ""
1408
+
1409
+ #: modules/mail/mod.php:57
1410
+ msgid "Email address used for all email notifications from plugin"
1411
+ msgstr ""
1412
+
1413
+ #: modules/mail/models/mail.php:7
1414
+ msgid "Test email functionality"
1415
+ msgstr ""
1416
+
1417
+ #: modules/mail/models/mail.php:8
1418
+ #, php-format
1419
+ msgid "This is a test email for testing email functionality on your site, %s."
1420
+ msgstr ""
1421
+
1422
+ #: modules/mail/models/mail.php:15
1423
+ msgid "Empty email address"
1424
+ msgstr ""
1425
+
1426
+ #: modules/mail/views/tpl/mailAdmin.php:3
1427
+ msgid "Send test email to"
1428
+ msgstr ""
1429
+
1430
+ #: modules/mail/views/tpl/mailAdmin.php:10
1431
+ msgid "Send test"
1432
+ msgstr ""
1433
+
1434
+ #: modules/mail/views/tpl/mailAdmin.php:12
1435
+ msgid "This option allows you to check your server mail functionality"
1436
+ msgstr ""
1437
+
1438
+ #: modules/mail/views/tpl/mailAdmin.php:15
1439
+ msgid "Did you receive test email?"
1440
+ msgstr ""
1441
+
1442
+ #: modules/mail/views/tpl/mailAdmin.php:18
1443
+ msgid "Yes! It works!"
1444
+ msgstr ""
1445
+
1446
+ #: modules/mail/views/tpl/mailAdmin.php:22
1447
+ msgid "No, I need to contact my hosting provider with mail function issue."
1448
+ msgstr ""
1449
+
1450
+ #: modules/mail/views/tpl/mailAdmin.php:26
1451
+ msgid "Great! Mail function was tested and is working fine."
1452
+ msgstr ""
1453
+
1454
+ #: modules/mail/views/tpl/mailAdmin.php:29
1455
+ msgid "Bad, please contact your hosting provider and ask them to setup mail functionality on your server."
1456
+ msgstr ""
1457
+
1458
+ #: modules/mail/views/tpl/mailAdmin.php:47
1459
+ #: modules/options/views/tpl/optionsSettingsTabContent.php:44
1460
+ #, php-format
1461
+ msgid "Turned On %s"
1462
+ msgstr ""
1463
+
1464
+ #: modules/mail/views/tpl/mailAdmin.php:48
1465
+ #: modules/options/views/tpl/optionsSettingsTabContent.php:45
1466
+ #, php-format
1467
+ msgid "Turned Off %s"
1468
+ msgstr ""
1469
+
1470
+ #: modules/mail/views/tpl/mailAdmin.php:69
1471
+ #: modules/options/views/tpl/optionsSettingsTabContent.php:6
1472
+ msgid "Save"
1473
+ msgstr ""
1474
+
1475
+ #: modules/options/mod.php:114
1476
+ msgid "General"
1477
+ msgstr ""
1478
+
1479
+ #: modules/options/mod.php:116
1480
+ msgid "Send usage statistics"
1481
+ msgstr ""
1482
+
1483
+ #: modules/options/mod.php:116
1484
+ msgid "Send information about what plugin options you prefer to use, this will help us make our solution better for You."
1485
+ msgstr ""
1486
+
1487
+ #: modules/options/mod.php:117
1488
+ msgid "Disable blocking Subscription from same IP"
1489
+ msgstr ""
1490
+
1491
+ #: modules/options/mod.php:117
1492
+ msgid "By default our plugin have feature to block subscriptions from same IP more then one time per hour - to avoid spam subscribers. But you can disable this feature here."
1493
+ msgstr ""
1494
+
1495
+ #: modules/options/mod.php:118
1496
+ msgid "Disable autosave on PopUp Edit"
1497
+ msgstr ""
1498
+
1499
+ #: modules/options/mod.php:118
1500
+ msgid "By default our plugin will make autosave all your changes that you do in PopUp edit screen, but you can disable this feature here. Just don't forget to save your PopUp each time you make any changes in it."
1501
+ msgstr ""
1502
+
1503
+ #: modules/options/mod.php:119
1504
+ msgid "Enable promo link"
1505
+ msgstr ""
1506
+
1507
+ #: modules/options/mod.php:119
1508
+ msgid "We are trying to make our plugin better for you, and you can help us with this. Just check this option - and small promotion link will be added in the bottom of your PopUp. This is easy for you - but very helpful for us!"
1509
+ msgstr ""
1510
+
1511
+ #: modules/options/mod.php:120
1512
+ msgid "User role can use plugin"
1513
+ msgstr ""
1514
+
1515
+ #: modules/options/mod.php:120
1516
+ msgid "User with next roles will have access to whole plugin from admin area."
1517
+ msgstr ""
1518
+
1519
+ #: modules/options/mod.php:121
1520
+ msgid "Load Assets in Footer"
1521
+ msgstr ""
1522
+
1523
+ #: modules/options/mod.php:121
1524
+ msgid "Force load all plugin CSS and JavaScript files in footer - to increase page load speed. Please make sure that you have correct footer.php file in your WordPress theme with wp_footer() function call in it."
1525
+ msgstr ""
1526
+
1527
+ #: modules/options/models/modules.php:35
1528
+ msgid "Module Updated"
1529
+ msgstr ""
1530
+
1531
+ #: modules/options/models/modules.php:50
1532
+ msgid "Module Update Failed"
1533
+ msgstr ""
1534
+
1535
+ #: modules/options/models/modules.php:53
1536
+ msgid "Error module ID"
1537
+ msgstr ""
1538
+
1539
+ #: modules/options/models/options.php:64
1540
+ msgid "Empty data to save option"
1541
+ msgstr ""
1542
+
1543
+ #: modules/options/views/tpl/optionsAdminMain.php:18
1544
+ msgid "Main page Go here!!!!"
1545
+ msgstr ""
1546
+
1547
+ #: modules/options/views/tpl/optionsAdminPage.php:35
1548
+ msgid "Improve Free version"
1549
+ msgstr ""
1550
+
1551
+ #: modules/options/views/tpl/optionsAdminPage.php:37
1552
+ #, php-format
1553
+ msgid "Please be advised that this template with all other options and PRO templates is available only in <a target=\"_blank\" href=\"%s\">PRO version</a>. You can <a target=\"_blank\" href=\"%s\" class=\"button\">Get PRO</a> today and get this and other PRO templates and features for your PopUps!"
1554
+ msgstr ""
1555
+
1556
+ #: modules/options/views/tpl/optionsAdminPage.php:40
1557
+ #, php-format
1558
+ msgid "Please be advised that this option is available only in <a target=\"_blank\" href=\"%s\">PRO version</a>. You can <a target=\"_blank\" href=\"%s\" class=\"button\">Get PRO</a> today and get this and other PRO option for your PopUps!"
1559
+ msgstr ""
1560
+
1561
+ #: modules/options/views/tpl/optionsSettingsTabContent.php:3
1562
+ msgid "Save all options"
1563
+ msgstr ""
1564
+
1565
+ #: modules/options/views/tpl/optionsSettingsTabContent.php:52
1566
+ msgid "PRO option"
1567
+ msgstr ""
1568
+
1569
+ #: modules/pages/views/tpl/deactivatePage.php:33
1570
+ msgid "Delete Plugin Data (options, setup data, database tables, etc.)"
1571
+ msgstr ""
1572
+
1573
+ #: modules/popup/controller.php:22
1574
+ msgid "Yes"
1575
+ msgstr ""
1576
+
1577
+ #: modules/popup/controller.php:22
1578
+ msgid "No"
1579
+ msgstr ""
1580
+
1581
+ #: modules/popup/controller.php:257
1582
+ msgid "Done, redirecting to new PopUp..."
1583
+ msgstr ""
1584
+
1585
+ #: modules/popup/mod.php:20
1586
+ msgid "Add New PopUp"
1587
+ msgstr ""
1588
+
1589
+ #: modules/popup/mod.php:23
1590
+ msgid "Edit"
1591
+ msgstr ""
1592
+
1593
+ #: modules/popup/mod.php:26
1594
+ msgid "Show All PopUps"
1595
+ msgstr ""
1596
+
1597
+ #: modules/popup/mod.php:371
1598
+ msgid "PopUp"
1599
+ msgstr ""
1600
+
1601
+ #: modules/popup/models/popup.php:98
1602
+ msgid "img/preview/"
1603
+ msgstr ""
1604
+
1605
+ #: modules/popup/models/popup.php:151
1606
+ msgid "Please select PopUp template from list below"
1607
+ msgstr ""
1608
+
1609
+ #: modules/popup/models/popup.php:153
1610
+ #: modules/popup/models/popup.php:534
1611
+ msgid "Please enter Name"
1612
+ msgstr ""
1613
+
1614
+ #: modules/popup/models/popup.php:186
1615
+ msgid "Enter your Facebook page URL"
1616
+ msgstr ""
1617
+
1618
+ #: modules/popup/models/popup.php:193
1619
+ msgid "Enter your video URL"
1620
+ msgstr ""
1621
+
1622
+ #: modules/popup/models/popup.php:344
1623
+ msgid "Common"
1624
+ msgstr ""
1625
+
1626
+ #: modules/popup/models/popup.php:345
1627
+ msgid "Facebook Like"
1628
+ msgstr ""
1629
+
1630
+ #: modules/popup/models/popup.php:346
1631
+ msgid "Video"
1632
+ msgstr ""
1633
+
1634
+ #: modules/popup/models/popup.php:347
1635
+ msgid "iFrame"
1636
+ msgstr ""
1637
+
1638
+ #: modules/popup/models/popup.php:348
1639
+ msgid "Simple HTML"
1640
+ msgstr ""
1641
+
1642
+ #: modules/popup/models/popup.php:349
1643
+ msgid "PDF"
1644
+ msgstr ""
1645
+
1646
+ #: modules/popup/models/popup.php:350
1647
+ msgid "Age Verification"
1648
+ msgstr ""
1649
+
1650
+ #: modules/popup/models/popup.php:351
1651
+ msgid "Full Screen"
1652
+ msgstr ""
1653
+
1654
+ #: modules/popup/models/popup.php:352
1655
+ msgid "Login / Registration"
1656
+ msgstr ""
1657
+
1658
+ #: modules/popup/models/popup.php:353
1659
+ msgid "Notification Bar"
1660
+ msgstr ""
1661
+
1662
+ #: modules/popup/models/popup.php:395
1663
+ msgid "Provided data was corrupted"
1664
+ msgstr ""
1665
+
1666
+ #: modules/popup/models/popup.php:560
1667
+ msgid "Name can not be empty"
1668
+ msgstr ""
1669
+
1670
+ #: modules/popup/models/popup.php:575
1671
+ #: modules/popup/models/popup.php:589
1672
+ #: modules/popup/models/popup.php:668
1673
+ #: modules/popup/models/popup.php:671
1674
+ #: modules/popup/models/popup.php:700
1675
+ msgid "Left side background"
1676
+ msgstr ""
1677
+
1678
+ #: modules/popup/models/popup.php:576
1679
+ #: modules/popup/models/popup.php:586
1680
+ #: modules/popup/models/popup.php:590
1681
+ #: modules/popup/models/popup.php:632
1682
+ #: modules/popup/models/popup.php:672
1683
+ #: modules/popup/models/popup.php:701
1684
+ msgid "Right side background"
1685
+ msgstr ""
1686
+
1687
+ #: modules/popup/models/popup.php:577
1688
+ msgid "Subscribe button background"
1689
+ msgstr ""
1690
+
1691
+ #: modules/popup/models/popup.php:580
1692
+ #: modules/popup/models/popup.php:584
1693
+ #: modules/popup/models/popup.php:594
1694
+ #: modules/popup/models/popup.php:603
1695
+ #: modules/popup/models/popup.php:607
1696
+ #: modules/popup/models/popup.php:616
1697
+ #: modules/popup/models/popup.php:620
1698
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:158
1699
+ msgid "Background"
1700
+ msgstr ""
1701
+
1702
+ #: modules/popup/models/popup.php:581
1703
+ msgid "Sign up button background"
1704
+ msgstr ""
1705
+
1706
+ #: modules/popup/models/popup.php:585
1707
+ #: modules/popup/models/popup.php:591
1708
+ #: modules/popup/models/popup.php:595
1709
+ #: modules/popup/models/popup.php:600
1710
+ #: modules/popup/models/popup.php:604
1711
+ #: modules/popup/models/popup.php:608
1712
+ #: modules/popup/models/popup.php:613
1713
+ #: modules/popup/models/popup.php:617
1714
+ #: modules/popup/models/popup.php:633
1715
+ #: modules/popup/models/popup.php:639
1716
+ #: modules/popup/models/popup.php:644
1717
+ #: modules/popup/models/popup.php:649
1718
+ #: modules/popup/models/popup.php:655
1719
+ #: modules/popup/models/popup.php:667
1720
+ #: modules/popup/models/popup.php:673
1721
+ #: modules/popup/models/popup.php:696
1722
+ #: modules/popup/models/popup.php:702
1723
+ #: modules/popup/models/popup.php:712
1724
+ #: modules/popup/models/popup.php:719
1725
+ #: modules/popup/models/popup.php:723
1726
+ #: modules/popup/models/popup.php:736
1727
+ #: modules/popup/models/popup.php:747
1728
+ #: modules/popup/models/popup.php:752
1729
+ #: modules/popup/models/popup.php:757
1730
+ #: modules/popup/models/popup.php:765
1731
+ #: modules/popup/models/popup.php:770
1732
+ msgid "Button background"
1733
+ msgstr ""
1734
+
1735
+ #: modules/popup/models/popup.php:598
1736
+ msgid "Main Background"
1737
+ msgstr ""
1738
+
1739
+ #: modules/popup/models/popup.php:599
1740
+ msgid "Down background"
1741
+ msgstr ""
1742
+
1743
+ #: modules/popup/models/popup.php:611
1744
+ msgid "Left Side Background"
1745
+ msgstr ""
1746
+
1747
+ #: modules/popup/models/popup.php:612
1748
+ msgid "Right Side background"
1749
+ msgstr ""
1750
+
1751
+ #: modules/popup/models/popup.php:621
1752
+ msgid "Sign-up button background"
1753
+ msgstr ""
1754
+
1755
+ #: modules/popup/models/popup.php:622
1756
+ #: modules/popup/models/popup.php:684
1757
+ msgid "Close button background"
1758
+ msgstr ""
1759
+
1760
+ #: modules/popup/models/popup.php:625
1761
+ #: modules/popup/models/popup.php:630
1762
+ #: modules/popup/models/popup.php:636
1763
+ #: modules/popup/models/popup.php:643
1764
+ #: modules/popup/models/popup.php:648
1765
+ #: modules/popup/models/popup.php:653
1766
+ #: modules/popup/models/popup.php:658
1767
+ #: modules/popup/models/popup.php:666
1768
+ #: modules/popup/models/popup.php:677
1769
+ #: modules/popup/models/popup.php:683
1770
+ #: modules/popup/models/popup.php:689
1771
+ #: modules/popup/models/popup.php:695
1772
+ #: modules/popup/models/popup.php:705
1773
+ #: modules/popup/models/popup.php:711
1774
+ #: modules/popup/models/popup.php:715
1775
+ #: modules/popup/models/popup.php:722
1776
+ #: modules/popup/models/popup.php:726
1777
+ #: modules/popup/models/popup.php:730
1778
+ #: modules/popup/models/popup.php:735
1779
+ #: modules/popup/models/popup.php:740
1780
+ #: modules/popup/models/popup.php:745
1781
+ #: modules/popup/models/popup.php:750
1782
+ #: modules/popup/models/popup.php:755
1783
+ #: modules/popup/models/popup.php:760
1784
+ #: modules/popup/models/popup.php:764
1785
+ #: modules/popup/models/popup.php:768
1786
+ msgid "Main background"
1787
+ msgstr ""
1788
+
1789
+ #: modules/popup/models/popup.php:626
1790
+ #: modules/popup/models/popup.php:650
1791
+ #: modules/popup/models/popup.php:685
1792
+ msgid "Middle side background"
1793
+ msgstr ""
1794
+
1795
+ #: modules/popup/models/popup.php:627
1796
+ msgid "Down side background"
1797
+ msgstr ""
1798
+
1799
+ #: modules/popup/models/popup.php:631
1800
+ msgid "Fields background"
1801
+ msgstr ""
1802
+
1803
+ #: modules/popup/models/popup.php:637
1804
+ msgid "Left picture background"
1805
+ msgstr ""
1806
+
1807
+ #: modules/popup/models/popup.php:638
1808
+ msgid "Background image"
1809
+ msgstr ""
1810
+
1811
+ #: modules/popup/models/popup.php:640
1812
+ #: modules/popup/models/popup.php:654
1813
+ #: modules/popup/models/popup.php:662
1814
+ #: modules/popup/models/popup.php:734
1815
+ msgid "Additional background"
1816
+ msgstr ""
1817
+
1818
+ #: modules/popup/models/popup.php:645
1819
+ #: modules/popup/models/popup.php:727
1820
+ #: modules/popup/models/popup.php:731
1821
+ #: modules/popup/models/popup.php:761
1822
+ msgid "Frame background"
1823
+ msgstr ""
1824
+
1825
+ #: modules/popup/models/popup.php:659
1826
+ msgid "Exit button background"
1827
+ msgstr ""
1828
+
1829
+ #: modules/popup/models/popup.php:660
1830
+ #: modules/popup/models/popup.php:707
1831
+ #: modules/popup/models/popup.php:771
1832
+ msgid "Left image background"
1833
+ msgstr ""
1834
+
1835
+ #: modules/popup/models/popup.php:661
1836
+ #: modules/popup/models/popup.php:686
1837
+ #: modules/popup/models/popup.php:690
1838
+ msgid "Submit button background"
1839
+ msgstr ""
1840
+
1841
+ #: modules/popup/models/popup.php:663
1842
+ #: modules/popup/models/popup.php:717
1843
+ msgid "Right image background"
1844
+ msgstr ""
1845
+
1846
+ #: modules/popup/models/popup.php:674
1847
+ #: modules/popup/models/popup.php:679
1848
+ #: modules/popup/models/popup.php:697
1849
+ #: modules/popup/models/popup.php:746
1850
+ #: modules/popup/models/popup.php:751
1851
+ #: modules/popup/models/popup.php:756
1852
+ msgid "Image background"
1853
+ msgstr ""
1854
+
1855
+ #: modules/popup/models/popup.php:678
1856
+ #: modules/popup/models/popup.php:706
1857
+ #: modules/popup/models/popup.php:769
1858
+ msgid "Field background"
1859
+ msgstr ""
1860
+
1861
+ #: modules/popup/models/popup.php:680
1862
+ msgid "Go button background"
1863
+ msgstr ""
1864
+
1865
+ #: modules/popup/models/popup.php:691
1866
+ msgid "Right Image background"
1867
+ msgstr ""
1868
+
1869
+ #: modules/popup/models/popup.php:692
1870
+ msgid "Right background"
1871
+ msgstr ""
1872
+
1873
+ #: modules/popup/models/popup.php:708
1874
+ msgid "Get it now button background"
1875
+ msgstr ""
1876
+
1877
+ #: modules/popup/models/popup.php:716
1878
+ #: modules/popup/models/popup.php:739
1879
+ msgid "Upper background"
1880
+ msgstr ""
1881
+
1882
+ #: modules/popup/models/popup.php:718
1883
+ msgid "Bottom background"
1884
+ msgstr ""
1885
+
1886
+ #: modules/popup/models/popup.php:741
1887
+ msgid "Yes button background"
1888
+ msgstr ""
1889
+
1890
+ #: modules/popup/models/popup.php:742
1891
+ msgid "No button background"
1892
+ msgstr ""
1893
+
1894
+ #: modules/popup/views/popup.php:42
1895
+ msgid "Modify PopUp Template"
1896
+ msgstr ""
1897
+
1898
+ #: modules/popup/views/popup.php:52
1899
+ msgid "Cannot find required PopUp"
1900
+ msgstr ""
1901
+
1902
+ #: modules/popup/views/popup.php:89
1903
+ msgid "Available in PRO version"
1904
+ msgstr ""
1905
+
1906
+ #: modules/popup/views/popup.php:92
1907
+ #: modules/popup/views/popup.php:393
1908
+ #: modules/popup/views/popup.php:743
1909
+ msgid "None"
1910
+ msgstr ""
1911
+
1912
+ #: modules/popup/views/popup.php:93
1913
+ msgid "Image"
1914
+ msgstr ""
1915
+
1916
+ #: modules/popup/views/popup.php:94
1917
+ msgid "Color"
1918
+ msgstr ""
1919
+
1920
+ #: modules/popup/views/popup.php:98
1921
+ msgid "Mobile"
1922
+ msgstr ""
1923
+
1924
+ #: modules/popup/views/popup.php:99
1925
+ msgid "Tablet"
1926
+ msgstr ""
1927
+
1928
+ #: modules/popup/views/popup.php:100
1929
+ msgid "Desktop PC"
1930
+ msgstr ""
1931
+
1932
+ #: modules/popup/views/popup.php:118
1933
+ msgid "Main Home page"
1934
+ msgstr ""
1935
+
1936
+ #: modules/popup/views/popup.php:207
1937
+ msgid "Appearance"
1938
+ msgstr ""
1939
+
1940
+ #: modules/popup/views/popup.php:212
1941
+ msgid "Popup Opening Animation"
1942
+ msgstr ""
1943
+
1944
+ #: modules/popup/views/popup.php:219
1945
+ msgid "Texts"
1946
+ msgstr ""
1947
+
1948
+ #: modules/popup/views/popup.php:226
1949
+ msgid "Social"
1950
+ msgstr ""
1951
+
1952
+ #: modules/popup/views/popup.php:237
1953
+ msgid "Main"
1954
+ msgstr ""
1955
+
1956
+ #: modules/popup/views/popup.php:242
1957
+ msgid "Design"
1958
+ msgstr ""
1959
+
1960
+ #: modules/popup/views/popup.php:247
1961
+ msgid "CSS / HTML Code"
1962
+ msgstr ""
1963
+
1964
+ #: modules/popup/views/popup.php:254
1965
+ msgid "Subscribe"
1966
+ msgstr ""
1967
+
1968
+ #: modules/popup/views/popup.php:278
1969
+ msgid "Facebook page URL"
1970
+ msgstr ""
1971
+
1972
+ #: modules/popup/views/popup.php:280
1973
+ msgid "The absolute URL of the Facebook Page that will be liked. This is a required setting."
1974
+ msgstr ""
1975
+
1976
+ #: modules/popup/views/popup.php:282
1977
+ msgid "Color scheme"
1978
+ msgstr ""
1979
+
1980
+ #: modules/popup/views/popup.php:284
1981
+ msgid "Light"
1982
+ msgstr ""
1983
+
1984
+ #: modules/popup/views/popup.php:284
1985
+ msgid "Dark"
1986
+ msgstr ""
1987
+
1988
+ #: modules/popup/views/popup.php:285
1989
+ msgid "The color scheme used by the plugin. Can be \"light\" or \"dark\"."
1990
+ msgstr ""
1991
+
1992
+ #: modules/popup/views/popup.php:287
1993
+ msgid "Force wall"
1994
+ msgstr ""
1995
+
1996
+ #: modules/popup/views/popup.php:289
1997
+ msgid "For \"place\" Pages (Pages that have a physical location that can be used with check-ins), this specifies whether the stream contains posts by the Page or just check-ins from friends."
1998
+ msgstr ""
1999
+
2000
+ #: modules/popup/views/popup.php:291
2001
+ msgid "Header"
2002
+ msgstr ""
2003
+
2004
+ #: modules/popup/views/popup.php:293
2005
+ msgid "Specifies whether to display the Facebook header at the top of the plugin."
2006
+ msgstr ""
2007
+
2008
+ #: modules/popup/views/popup.php:295
2009
+ msgid "Show border"
2010
+ msgstr ""
2011
+
2012
+ #: modules/popup/views/popup.php:297
2013
+ msgid "Specifies whether or not to show a border around the plugin."
2014
+ msgstr ""
2015
+
2016
+ #: modules/popup/views/popup.php:299
2017
+ msgid "Show faces"
2018
+ msgstr ""
2019
+
2020
+ #: modules/popup/views/popup.php:301
2021
+ msgid "Specifies whether to display profile photos of people who like the page."
2022
+ msgstr ""
2023
+
2024
+ #: modules/popup/views/popup.php:303
2025
+ msgid "Stream"
2026
+ msgstr ""
2027
+
2028
+ #: modules/popup/views/popup.php:305
2029
+ msgid "Specifies whether to display a stream of the latest posts by the Page."
2030
+ msgstr ""
2031
+
2032
+ #: modules/popup/views/popup.php:357
2033
+ msgid "None - use Standard PopUp Social Buttons"
2034
+ msgstr ""
2035
+
2036
+ #: modules/popup/views/popup.php:394
2037
+ msgid "Puff"
2038
+ msgstr ""
2039
+
2040
+ #: modules/popup/views/popup.php:395
2041
+ msgid "Vanish"
2042
+ msgstr ""
2043
+
2044
+ #: modules/popup/views/popup.php:397
2045
+ msgid "Open down left"
2046
+ msgstr ""
2047
+
2048
+ #: modules/popup/views/popup.php:398
2049
+ msgid "Open down right"
2050
+ msgstr ""
2051
+
2052
+ #: modules/popup/views/popup.php:400
2053
+ msgid "Perspective down"
2054
+ msgstr ""
2055
+
2056
+ #: modules/popup/views/popup.php:401
2057
+ msgid "Perspective up"
2058
+ msgstr ""
2059
+
2060
+ #: modules/popup/views/popup.php:403
2061
+ msgid "Slide down"
2062
+ msgstr ""
2063
+
2064
+ #: modules/popup/views/popup.php:404
2065
+ msgid "Slide up"
2066
+ msgstr ""
2067
+
2068
+ #: modules/popup/views/popup.php:406
2069
+ msgid "Swash"
2070
+ msgstr ""
2071
+
2072
+ #: modules/popup/views/popup.php:407
2073
+ msgid "Foolis"
2074
+ msgstr ""
2075
+
2076
+ #: modules/popup/views/popup.php:409
2077
+ msgid "Tin right"
2078
+ msgstr ""
2079
+
2080
+ #: modules/popup/views/popup.php:410
2081
+ msgid "Tin left"
2082
+ msgstr ""
2083
+
2084
+ #: modules/popup/views/popup.php:411
2085
+ msgid "Tin up"
2086
+ msgstr ""
2087
+
2088
+ #: modules/popup/views/popup.php:412
2089
+ msgid "Tin down"
2090
+ msgstr ""
2091
+
2092
+ #: modules/popup/views/popup.php:414
2093
+ msgid "Boing"
2094
+ msgstr ""
2095
+
2096
+ #: modules/popup/views/popup.php:416
2097
+ msgid "Space right"
2098
+ msgstr ""
2099
+
2100
+ #: modules/popup/views/popup.php:417
2101
+ msgid "Space left"
2102
+ msgstr ""
2103
+
2104
+ #: modules/popup/views/popup.php:418
2105
+ msgid "Space up"
2106
+ msgstr ""
2107
+
2108
+ #: modules/popup/views/popup.php:419
2109
+ msgid "Space down"
2110
+ msgstr ""
2111
+
2112
+ #: modules/popup/views/popup.php:426
2113
+ msgid "Bounce"
2114
+ msgstr ""
2115
+
2116
+ #: modules/popup/views/popup.php:427
2117
+ msgid "Bounce Up"
2118
+ msgstr ""
2119
+
2120
+ #: modules/popup/views/popup.php:428
2121
+ msgid "Bounce Down"
2122
+ msgstr ""
2123
+
2124
+ #: modules/popup/views/popup.php:429
2125
+ msgid "Bounce Left"
2126
+ msgstr ""
2127
+
2128
+ #: modules/popup/views/popup.php:430
2129
+ msgid "Bounce Right"
2130
+ msgstr ""
2131
+
2132
+ #: modules/popup/views/popup.php:432
2133
+ msgid "Fade"
2134
+ msgstr ""
2135
+
2136
+ #: modules/popup/views/popup.php:433
2137
+ msgid "Fade Up"
2138
+ msgstr ""
2139
+
2140
+ #: modules/popup/views/popup.php:434
2141
+ msgid "Fade Down"
2142
+ msgstr ""
2143
+
2144
+ #: modules/popup/views/popup.php:435
2145
+ msgid "Fade Left"
2146
+ msgstr ""
2147
+
2148
+ #: modules/popup/views/popup.php:436
2149
+ msgid "Fade Right"
2150
+ msgstr ""
2151
+
2152
+ #: modules/popup/views/popup.php:438
2153
+ msgid "Flip X"
2154
+ msgstr ""
2155
+
2156
+ #: modules/popup/views/popup.php:439
2157
+ msgid "Flip Y"
2158
+ msgstr ""
2159
+
2160
+ #: modules/popup/views/popup.php:441
2161
+ msgid "Rotate"
2162
+ msgstr ""
2163
+
2164
+ #: modules/popup/views/popup.php:442
2165
+ msgid "Rotate Up Left"
2166
+ msgstr ""
2167
+
2168
+ #: modules/popup/views/popup.php:443
2169
+ msgid "Rotate Up Right"
2170
+ msgstr ""
2171
+
2172
+ #: modules/popup/views/popup.php:444
2173
+ msgid "Rotate Down Left"
2174
+ msgstr ""
2175
+
2176
+ #: modules/popup/views/popup.php:445
2177
+ msgid "Rotate Down Right"
2178
+ msgstr ""
2179
+
2180
+ #: modules/popup/views/popup.php:447
2181
+ msgid "Slide Up"
2182
+ msgstr ""
2183
+
2184
+ #: modules/popup/views/popup.php:448
2185
+ msgid "Slide Down"
2186
+ msgstr ""
2187
+
2188
+ #: modules/popup/views/popup.php:449
2189
+ msgid "Slide Left"
2190
+ msgstr ""
2191
+
2192
+ #: modules/popup/views/popup.php:450
2193
+ msgid "Slide Right"
2194
+ msgstr ""
2195
+
2196
+ #: modules/popup/views/popup.php:452
2197
+ msgid "Zoom"
2198
+ msgstr ""
2199
+
2200
+ #: modules/popup/views/popup.php:453
2201
+ msgid "Zoom Up"
2202
+ msgstr ""
2203
+
2204
+ #: modules/popup/views/popup.php:454
2205
+ msgid "Zoom Down"
2206
+ msgstr ""
2207
+
2208
+ #: modules/popup/views/popup.php:455
2209
+ msgid "Zoom Left"
2210
+ msgstr ""
2211
+
2212
+ #: modules/popup/views/popup.php:456
2213
+ msgid "Zoom Right"
2214
+ msgstr ""
2215
+
2216
+ #: modules/popup/views/popup.php:458
2217
+ msgid "Light Speed"
2218
+ msgstr ""
2219
+
2220
+ #: modules/popup/views/popup.php:459
2221
+ msgid "Rolling!"
2222
+ msgstr ""
2223
+
2224
+ #: modules/popup/views/popup.php:767
2225
+ msgid "None (standard)"
2226
+ msgstr ""
2227
+
2228
+ #: modules/popup/views/tpl/popupAddNewAdmin.php:20
2229
+ #, php-format
2230
+ msgid "Change Template to any other from the list below or <a class=\"button\" href=\"%s\">return to Pop-Up edit</a>"
2231
+ msgstr ""
2232
+
2233
+ #: modules/popup/views/tpl/popupAddNewAdmin.php:22
2234
+ msgid "Choose Pop-Up Template. You can change it later."
2235
+ msgstr ""
2236
+
2237
+ #: modules/popup/views/tpl/popupAddNewAdmin.php:31
2238
+ msgid "PopUp Name"
2239
+ msgstr ""
2240
+
2241
+ #: modules/popup/views/tpl/popupAddNewAdmin.php:44
2242
+ #: modules/popup/views/tpl/popupAddNewAdmin.php:54
2243
+ msgid "All"
2244
+ msgstr ""
2245
+
2246
+ #: modules/popup/views/tpl/popupAddNewAdmin.php:69
2247
+ msgid "type"
2248
+ msgstr ""
2249
+
2250
+ #: modules/popup/views/tpl/popupAddNewAdmin.php:72
2251
+ msgid "Get in PRO"
2252
+ msgstr ""
2253
+
2254
+ #: modules/popup/views/tpl/popupAddNewAdmin.php:83
2255
+ msgid "Change Template"
2256
+ msgstr ""
2257
+
2258
+ #: modules/popup/views/tpl/popupAddNewAdmin.php:85
2259
+ msgid "Are you sure you want to change your current template - to "
2260
+ msgstr ""
2261
+
2262
+ #: modules/popup/views/tpl/popupAdmin.php:11
2263
+ #: modules/popup/views/tpl/popupAdmin.php:12
2264
+ msgid "Search"
2265
+ msgstr ""
2266
+
2267
+ #: modules/popup/views/tpl/popupAdmin.php:21
2268
+ #, php-format
2269
+ msgid "You have no PopUps for now. <a href=\"%s\" style=\"font-style: italic;\">Create</a> your PopUp!"
2270
+ msgstr ""
2271
+
2272
+ #: modules/popup/views/tpl/popupEditAdmin.php:108
2273
+ msgid "Loading preview..."
2274
+ msgstr ""
2275
+
2276
+ #: modules/popup/views/tpl/popupEditAdmin.php:113
2277
+ msgid "Back to top"
2278
+ msgstr ""
2279
+
2280
+ #: modules/popup/views/tpl/popupEditAdminAnimationOpts.php:2
2281
+ msgid "Choose PopUp animation style"
2282
+ msgstr ""
2283
+
2284
+ #: modules/popup/views/tpl/popupEditAdminAnimationOpts.php:3
2285
+ msgid "current style"
2286
+ msgstr ""
2287
+
2288
+ #: modules/popup/views/tpl/popupEditAdminAnimationOpts.php:30
2289
+ msgid "Animation Duration"
2290
+ msgstr ""
2291
+
2292
+ #: modules/popup/views/tpl/popupEditAdminAnimationOpts.php:32
2293
+ msgid "miliseconds"
2294
+ msgstr ""
2295
+
2296
+ #: modules/popup/views/tpl/popupEditAdminCodeOpts.php:2
2297
+ #, php-format
2298
+ msgid "Edit this ONLY if you know basics of HTML, CSS and have been acquainted with the rules of template editing described <a target=\"_blank\" href=\"%s\">here</a>"
2299
+ msgstr ""
2300
+
2301
+ #: modules/popup/views/tpl/popupEditAdminCodeOpts.php:5
2302
+ msgid "CSS code"
2303
+ msgstr ""
2304
+
2305
+ #: modules/popup/views/tpl/popupEditAdminCodeOpts.php:9
2306
+ msgid "HTML code"
2307
+ msgstr ""
2308
+
2309
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:5
2310
+ msgid "Video URL"
2311
+ msgstr ""
2312
+
2313
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:6
2314
+ msgid "Copy and paste here URL of your video source"
2315
+ msgstr ""
2316
+
2317
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:16
2318
+ msgid "iFrame URL"
2319
+ msgstr ""
2320
+
2321
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:17
2322
+ #, php-format
2323
+ msgid "Copy and paste here URL of site, that you need to display in PopUp as iFrame. Please note that some sites can block such possibility, you can read more about this <a target=\"_blank\" href=\"%s\">for example here</a>"
2324
+ msgstr ""
2325
+
2326
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:27
2327
+ msgid "PDF URL"
2328
+ msgstr ""
2329
+
2330
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:28
2331
+ msgid "Copy and paste here URL to your PDF file. You can simply upload it on your server (using FTP for example), then insert URL in this field - and you will see how it work. Enjoy!"
2332
+ msgstr ""
2333
+
2334
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:37
2335
+ msgid "Width"
2336
+ msgstr ""
2337
+
2338
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:44
2339
+ msgid "Max width for percentage - is 100"
2340
+ msgstr ""
2341
+
2342
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:46
2343
+ msgid "Percents"
2344
+ msgstr ""
2345
+
2346
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:50
2347
+ msgid "Pixels"
2348
+ msgstr ""
2349
+
2350
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:60
2351
+ msgid "Height"
2352
+ msgstr ""
2353
+
2354
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:72
2355
+ msgid "Video Autoplay"
2356
+ msgstr ""
2357
+
2358
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:73
2359
+ msgid "Play video - right after PopUp show"
2360
+ msgstr ""
2361
+
2362
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:83
2363
+ msgid "Hide controls"
2364
+ msgstr ""
2365
+
2366
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:94
2367
+ msgid "Ignore related videos"
2368
+ msgstr ""
2369
+
2370
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:135
2371
+ msgid "Background overlay opacity"
2372
+ msgstr ""
2373
+
2374
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:144
2375
+ msgid "Disable window scroll"
2376
+ msgstr ""
2377
+
2378
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:145
2379
+ msgid "Disable browser window scrolling while PopUp is opened. Good way to disallow viewing your site content before PopUp will be closed."
2380
+ msgstr ""
2381
+
2382
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:158
2383
+ #, php-format
2384
+ msgid "Background %d"
2385
+ msgstr ""
2386
+
2387
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:183
2388
+ msgid "Label Font style"
2389
+ msgstr ""
2390
+
2391
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:192
2392
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:215
2393
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:239
2394
+ msgid "Default"
2395
+ msgstr ""
2396
+
2397
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:206
2398
+ msgid "Text Font style"
2399
+ msgstr ""
2400
+
2401
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:206
2402
+ #, php-format
2403
+ msgid "Text Font style %d"
2404
+ msgstr ""
2405
+
2406
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:230
2407
+ msgid "Footer Font style"
2408
+ msgstr ""
2409
+
2410
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:253
2411
+ msgid "Responsive mode"
2412
+ msgstr ""
2413
+
2414
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:254
2415
+ msgid "You can choose PopUp behavior for responsive mode from one of the following. If you don't know - what to select - you can just try both and leave most suitable for you."
2416
+ msgstr ""
2417
+
2418
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:257
2419
+ msgid "PopUp will be fully zoomed for smaller screens"
2420
+ msgstr ""
2421
+
2422
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:262
2423
+ msgid "Full resize"
2424
+ msgstr ""
2425
+
2426
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:264
2427
+ msgid "PopUp will not be zoomed like with prev. mode, it will adapt only Width for users screen size"
2428
+ msgstr ""
2429
+
2430
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:269
2431
+ msgid "Width only"
2432
+ msgstr ""
2433
+
2434
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:276
2435
+ msgid "Close button"
2436
+ msgstr ""
2437
+
2438
+ #: modules/popup/views/tpl/popupEditAdminDesignOpts.php:296
2439
+ msgid "Bullets"
2440
+ msgstr ""
2441
+
2442
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:13
2443
+ #, php-format
2444
+ msgid "You are using Google Maps in this PopUp, but don't have Google Maps Easy plugin installed. You can get it for Free from WordPress site <a target=\"_blank\" href=\"%s\">here</a>, install and start using this PopUp with map."
2445
+ msgstr ""
2446
+
2447
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:19
2448
+ msgid "Please be advised that you are editing AB Test PopUp. This means that independently of options you select in Main settings - there will be always only one PopUp: Base or one from AB Test."
2449
+ msgstr ""
2450
+
2451
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:26
2452
+ msgid "When to show PopUp"
2453
+ msgstr ""
2454
+
2455
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:32
2456
+ msgid "When page loads"
2457
+ msgstr ""
2458
+
2459
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:37
2460
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:73
2461
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:90
2462
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:206
2463
+ msgid "Delay for"
2464
+ msgstr ""
2465
+
2466
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:41
2467
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:78
2468
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:146
2469
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:211
2470
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:271
2471
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:290
2472
+ msgid "Seconds"
2473
+ msgstr ""
2474
+
2475
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:41
2476
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:78
2477
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:146
2478
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:211
2479
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:271
2480
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:290
2481
+ msgid "sec"
2482
+ msgstr ""
2483
+
2484
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:48
2485
+ msgid "User click on the page"
2486
+ msgstr ""
2487
+
2488
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:54
2489
+ msgid "Click on certain link / button / other element"
2490
+ msgstr ""
2491
+
2492
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:57
2493
+ msgid "Copy & paste next code - into required link to open PopUp on Click"
2494
+ msgstr ""
2495
+
2496
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:60
2497
+ #, php-format
2498
+ msgid "Check screenshot with details - <a onclick=\"ppsShowTipScreenPopUp(this); return false;\" href=\"%s\">here</a>."
2499
+ msgstr ""
2500
+
2501
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:62
2502
+ msgid "Or, if you know HTML basics, - you can insert \"onclick\" attribute to any of your element from code below"
2503
+ msgstr ""
2504
+
2505
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:66
2506
+ msgid "Or you can even use it for your Menu item, just add code"
2507
+ msgstr ""
2508
+
2509
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:70
2510
+ msgid "to your menu item \"URL\" or into \"Title Attribute\" field. Don't worry - users will not see this code as menu item title on your site."
2511
+ msgstr ""
2512
+
2513
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:85
2514
+ msgid "Scroll window"
2515
+ msgstr ""
2516
+
2517
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:94
2518
+ msgid "seconds after first scroll"
2519
+ msgstr ""
2520
+
2521
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:98
2522
+ msgid "Scrolled to"
2523
+ msgstr ""
2524
+
2525
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:102
2526
+ msgid "percents of total scroll"
2527
+ msgstr ""
2528
+
2529
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:122
2530
+ msgid "When user is at the bottom of the page: scrolls it down to the bottom, or if there is no vertical scroll on his device - just show it right after page loads."
2531
+ msgstr ""
2532
+
2533
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:123
2534
+ msgid "Bottom of the page"
2535
+ msgstr ""
2536
+
2537
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:134
2538
+ msgid "After user was inactive on your page for some time."
2539
+ msgstr ""
2540
+
2541
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:135
2542
+ msgid "After Inactivity"
2543
+ msgstr ""
2544
+
2545
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:143
2546
+ msgid "After user was inactive for"
2547
+ msgstr ""
2548
+
2549
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:153
2550
+ msgid "When user adds a comment on your site he will see this PopUp after comment was placed. This will help you to get active users interested in your site."
2551
+ msgstr ""
2552
+
2553
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:154
2554
+ msgid "After User Comment"
2555
+ msgstr ""
2556
+
2557
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:165
2558
+ msgid "Show PopUp after successful checkout process in your online store."
2559
+ msgstr ""
2560
+
2561
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:166
2562
+ msgid "After Purchasing (Checkout)"
2563
+ msgstr ""
2564
+
2565
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:174
2566
+ msgid "Copy & Paste next code on your Success checkout page content editor"
2567
+ msgstr ""
2568
+
2569
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:178
2570
+ msgid "Or, if you are using your own html/php for this page - insert there next code"
2571
+ msgstr ""
2572
+
2573
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:192
2574
+ #, php-format
2575
+ msgid "Show when user opens your site exactly with link, where in the end will be #ppsShowPopUp_%d. For example <a href=\"%s\" target=\"_blank\">%s</a> (will work only with PRO version)."
2576
+ msgstr ""
2577
+
2578
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:193
2579
+ msgid "On Link Follow"
2580
+ msgstr ""
2581
+
2582
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:200
2583
+ msgid "Copy & paste next code - into end of required link on your site"
2584
+ msgstr ""
2585
+
2586
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:222
2587
+ msgid "PopUp will be build-in page content - as part of your page."
2588
+ msgstr ""
2589
+
2590
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:223
2591
+ msgid "Build-In Page"
2592
+ msgstr ""
2593
+
2594
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:230
2595
+ msgid "Copy & paste next code - into required place in your page"
2596
+ msgstr ""
2597
+
2598
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:237
2599
+ msgid "When to close PopUp"
2600
+ msgstr ""
2601
+
2602
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:243
2603
+ msgid "After user close it"
2604
+ msgstr ""
2605
+
2606
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:249
2607
+ msgid "Close PopUp when user clicks outside of the actually PopUp window."
2608
+ msgstr ""
2609
+
2610
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:250
2611
+ msgid "Click outside PopUp"
2612
+ msgstr ""
2613
+
2614
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:258
2615
+ msgid "Will not allow user to close your PopUp - until finish at least one action: Subscribe, Share or Like."
2616
+ msgstr ""
2617
+
2618
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:259
2619
+ msgid "Only after action (Subscribe / Share / Like)"
2620
+ msgstr ""
2621
+
2622
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:268
2623
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:287
2624
+ msgid "Close after"
2625
+ msgstr ""
2626
+
2627
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:274
2628
+ msgid "Close PopUp after it will be visible during specified time."
2629
+ msgstr ""
2630
+
2631
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:279
2632
+ msgid "After time passed"
2633
+ msgstr ""
2634
+
2635
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:294
2636
+ msgid "Show on next pages"
2637
+ msgstr ""
2638
+
2639
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:300
2640
+ msgid "All pages"
2641
+ msgstr ""
2642
+
2643
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:306
2644
+ msgid "Show on next pages / posts"
2645
+ msgstr ""
2646
+
2647
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:309
2648
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:318
2649
+ msgid "Choose Pages"
2650
+ msgstr ""
2651
+
2652
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:315
2653
+ msgid "Don't show on next pages / posts"
2654
+ msgstr ""
2655
+
2656
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:321
2657
+ msgid "Time display settings"
2658
+ msgstr ""
2659
+
2660
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:327
2661
+ msgid "Set display time"
2662
+ msgstr ""
2663
+
2664
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:330
2665
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:353
2666
+ msgid "From"
2667
+ msgstr ""
2668
+
2669
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:336
2670
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:357
2671
+ msgid "to"
2672
+ msgstr ""
2673
+
2674
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:344
2675
+ msgid "Date display settings"
2676
+ msgstr ""
2677
+
2678
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:350
2679
+ msgid "Set display date"
2680
+ msgstr ""
2681
+
2682
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:364
2683
+ msgid "Whom to show"
2684
+ msgstr ""
2685
+
2686
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:370
2687
+ msgid "Everyone"
2688
+ msgstr ""
2689
+
2690
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:376
2691
+ msgid "For first-time visitors"
2692
+ msgstr ""
2693
+
2694
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:379
2695
+ msgid "Will remember user visit for entered number of days and show PopUp to same user again - after this period. To remember only for one browser session - use 0 here, to remember forever - try to set big number - 99999 for example."
2696
+ msgstr ""
2697
+
2698
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:380
2699
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:396
2700
+ msgid "Remember for"
2701
+ msgstr ""
2702
+
2703
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:385
2704
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:401
2705
+ msgid "days"
2706
+ msgstr ""
2707
+
2708
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:388
2709
+ msgid "Subscribe, share, like, etc."
2710
+ msgstr ""
2711
+
2712
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:392
2713
+ msgid "Until user makes an action"
2714
+ msgstr ""
2715
+
2716
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:395
2717
+ msgid "Will remember user action for entered number of days and show PopUp to same user again - after this period. To remember only for one browser session - use 0 here, to remember forever - try to set big number - 99999 for example."
2718
+ msgstr ""
2719
+
2720
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:405
2721
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:420
2722
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:435
2723
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:451
2724
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:466
2725
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:485
2726
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:503
2727
+ msgid "Click to revert feature function: from Hide - to Show, and vice versa."
2728
+ msgstr ""
2729
+
2730
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:406
2731
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:421
2732
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:436
2733
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:452
2734
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:467
2735
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:486
2736
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:504
2737
+ msgid "Hide"
2738
+ msgstr ""
2739
+
2740
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:406
2741
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:421
2742
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:436
2743
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:452
2744
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:467
2745
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:486
2746
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:504
2747
+ msgid "Show Only"
2748
+ msgstr ""
2749
+
2750
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:411
2751
+ msgid "for Devices"
2752
+ msgstr ""
2753
+
2754
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:412
2755
+ msgid "You can make PopUp visible or hidden only when users will view your site from selected devices."
2756
+ msgstr ""
2757
+
2758
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:417
2759
+ msgid "Choose devices"
2760
+ msgstr ""
2761
+
2762
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:426
2763
+ msgid "for Post Types"
2764
+ msgstr ""
2765
+
2766
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:427
2767
+ msgid "You can make PopUp visible or hidden only for specified Post Types, for example - hide it on all Pages."
2768
+ msgstr ""
2769
+
2770
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:432
2771
+ msgid "Choose post types"
2772
+ msgstr ""
2773
+
2774
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:441
2775
+ msgid "for IP"
2776
+ msgstr ""
2777
+
2778
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:442
2779
+ #, php-format
2780
+ msgid "For those IPs PopUp will not be displayed (or vice versa - depending on Hide/Show Only option). Please be advised that your IP - %s"
2781
+ msgstr ""
2782
+
2783
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:444
2784
+ msgid "Show IPs List"
2785
+ msgstr ""
2786
+
2787
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:457
2788
+ msgid "for Countries"
2789
+ msgstr ""
2790
+
2791
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:458
2792
+ #, php-format
2793
+ msgid "For those Countries PopUp will not be displayed (or vice versa - depending on Hide/Show Only option). Please be advised that your Country code is %s"
2794
+ msgstr ""
2795
+
2796
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:463
2797
+ msgid "Choose countries"
2798
+ msgstr ""
2799
+
2800
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:472
2801
+ msgid "for Languages"
2802
+ msgstr ""
2803
+
2804
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:473
2805
+ #, php-format
2806
+ msgid "For those Languages PopUp will not be displayed. Language is defined by visitor browser language. Please be advised that your browser language is %s"
2807
+ msgstr ""
2808
+
2809
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:479
2810
+ msgid "Choose languages"
2811
+ msgstr ""
2812
+
2813
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:481
2814
+ msgid "This feature is supported only in WordPress version 4.0.0 or higher"
2815
+ msgstr ""
2816
+
2817
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:491
2818
+ msgid "for Search Engines or Social Media"
2819
+ msgstr ""
2820
+
2821
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:492
2822
+ msgid "If user coming from those Search Engines - PopUp will not be displayed. This is helpfull when you want to hide or show your PopUp only for users, who come to your site from particular search engine."
2823
+ msgstr ""
2824
+
2825
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:497
2826
+ msgid "Choose Search Engines"
2827
+ msgstr ""
2828
+
2829
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:509
2830
+ msgid "for URL match"
2831
+ msgstr ""
2832
+
2833
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:510
2834
+ #, php-format
2835
+ msgid "You can enter here URL pattern - and users with URL matched this pattern will not see (or vice versa) your PopUp. Use <a _target=\"_blank\" href=\"%s\">official documentation</a> about regular expression to make this work correctly."
2836
+ msgstr ""
2837
+
2838
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:519
2839
+ msgid "Hide PopUp for Logged-in users and show it only for not Logged-in site visitors."
2840
+ msgstr ""
2841
+
2842
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:522
2843
+ msgid "Hide for Logged-in"
2844
+ msgstr ""
2845
+
2846
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:525
2847
+ msgid "IPs List"
2848
+ msgstr ""
2849
+
2850
+ #: modules/popup/views/tpl/popupEditAdminMainOpts.php:527
2851
+ msgid "Type here IPs that will not see PopUp, each IP - from new line"
2852
+ msgstr ""
2853
+
2854
+ #: modules/popup/views/tpl/popupEditAdminSmOpts.php:7
2855
+ msgid "Enable Social Buttons"
2856
+ msgstr ""
2857
+
2858
+ #: modules/popup/views/tpl/popupEditAdminSmOpts.php:21
2859
+ msgid "Social links design"
2860
+ msgstr ""
2861
+
2862
+ #: modules/popup/views/tpl/popupEditAdminSmOpts.php:31
2863
+ msgid "OR"
2864
+ msgstr ""
2865
+
2866
+ #: modules/popup/views/tpl/popupEditAdminSmOpts.php:34
2867
+ msgid "Connect <b>around 20 social networks</b> to your PopUp, with various lists of design settings, using our plugin <b>Social Share Buttons by Supsystic</b>"
2868
+ msgstr ""
2869
+
2870
+ #: modules/popup/views/tpl/popupEditAdminSmOpts.php:38
2871
+ msgid "Select Social Button Project"
2872
+ msgstr ""
2873
+
2874
+ #: modules/popup/views/tpl/popupEditAdminSmOpts.php:49
2875
+ #, php-format
2876
+ msgid "You have no Social Sharing projects for now. <a href=\"%s\" target=\"_blank\" class=\"button button-primary\">Create your first project</a> - then just reload page with your PopUp settings, and you will see list with available Social Projects for your PopUp."
2877
+ msgstr ""
2878
+
2879
+ #: modules/popup/views/tpl/popupEditAdminSmOpts.php:55
2880
+ #, php-format
2881
+ msgid "You need to install Social Share Buttons by Supsystic to use this feature. <a href=\"%s\" target=\"_blank\" class=\"button\">Install plugin</a> from your admin area, or visit it's official page on Wordpress.org <a href=\"%s\" target=\"_blank\">here.</a>"
2882
+ msgstr ""
2883
+
2884
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:7
2885
+ msgid "Enable Subscription"
2886
+ msgstr ""
2887
+
2888
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:14
2889
+ msgid "Subscribe to"
2890
+ msgstr ""
2891
+
2892
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:15
2893
+ msgid "Destination for your Subscribers."
2894
+ msgstr ""
2895
+
2896
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:25
2897
+ msgid "Create user with the chosen role after subscribing"
2898
+ msgstr ""
2899
+
2900
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:26
2901
+ msgid "Use this only if you really need it. Remember! After you change this option - your new subscriber will have more privileges than usual subscribers, so be careful with this option!"
2902
+ msgstr ""
2903
+
2904
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:36
2905
+ msgid "Create Subscriber without confirmation"
2906
+ msgstr ""
2907
+
2908
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:37
2909
+ msgid "Usually, after user subscribes, we send an email with the confirmation link - to confirm the email address, and only after user clicks on the link from this email - we will create a new subscriber. This option allows you to create a subscriber - right after subscription, without the email confirmation process."
2910
+ msgstr ""
2911
+
2912
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:46
2913
+ msgid "Export Subscribers"
2914
+ msgstr ""
2915
+
2916
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:47
2917
+ msgid "Export all subscribers, who subscribed using WordPress \"Subscribe to\" method, as CSV file."
2918
+ msgstr ""
2919
+
2920
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:55
2921
+ msgid "Aweber Unique List ID"
2922
+ msgstr ""
2923
+
2924
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:56
2925
+ #, php-format
2926
+ msgid "Check <a href=\"%s\" target=\"_blank\">this page</a> for more details"
2927
+ msgstr ""
2928
+
2929
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:65
2930
+ msgid "Aweber AD Tracking"
2931
+ msgstr ""
2932
+
2933
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:66
2934
+ #, php-format
2935
+ msgid "You can easy track your subscribers from PopUp using this feature. For more info - check <a href=\"%s\" target=\"_blank\">this page</a>."
2936
+ msgstr ""
2937
+
2938
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:75
2939
+ msgid "MailChimp API key"
2940
+ msgstr ""
2941
+
2942
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:76
2943
+ #, php-format
2944
+ msgid "To find your MailChimp API Key login to your mailchimp account at <a href=\"%s\" target=\"_blank\">%s</a> then from the left main menu, click on your Username, then select \"Account\" in the flyout menu. From the account page select \"Extras\", \"API Keys\". Your API Key will be listed in the table labeled \"Your API Keys\". Copy / Paste your API key into \"MailChimp API key\" field here. For more detailed instruction - check article <a href=\"%s\" target=\"_blank\">here</a>."
2945
+ msgstr ""
2946
+
2947
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:87
2948
+ msgid "Select lists for subscribe. They are taken from your MailChimp account - so make sure that you entered correct API key before."
2949
+ msgstr ""
2950
+
2951
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:96
2952
+ msgid "Enter API key - and your list will appear here"
2953
+ msgstr ""
2954
+
2955
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:102
2956
+ msgid "Disable double opt-in"
2957
+ msgstr ""
2958
+
2959
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:103
2960
+ msgid "Disable double opt-in confirmation message sending - will create subscriber directly after he will sign-up to your form."
2961
+ msgstr ""
2962
+
2963
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:112
2964
+ msgid "Group for subscribe"
2965
+ msgstr ""
2966
+
2967
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:113
2968
+ msgid "In MailChimp there are possibility to select groups for your subscribers. This is not mandatory, but some times is really helpful. So, we added this possibility for you in our plugin too - hope you will like it!"
2969
+ msgstr ""
2970
+
2971
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:119
2972
+ msgid "Choose Groups"
2973
+ msgstr ""
2974
+
2975
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:122
2976
+ msgid "Enter API key, select List - and your groups will appear here"
2977
+ msgstr ""
2978
+
2979
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:129
2980
+ msgid "MailPoet Subscribe Lists"
2981
+ msgstr ""
2982
+
2983
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:138
2984
+ #, php-format
2985
+ msgid "You have no subscribe lists, <a target=\"_blank\" href=\"%s\">create lists</a> at first, then - select them here."
2986
+ msgstr ""
2987
+
2988
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:143
2989
+ #, php-format
2990
+ msgid "To use this subscribe engine - you must have <a target=\"_blank\" href=\"%s\">MailPoet plugin</a> installed on your site"
2991
+ msgstr ""
2992
+
2993
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:170
2994
+ #, php-format
2995
+ msgid "To use this subscribe engine - you must have <a target=\"_blank\" href=\"%s\">Jetpack plugin</a> installed on your site"
2996
+ msgstr ""
2997
+
2998
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:183
2999
+ msgid "Infusion Soft"
3000
+ msgstr ""
3001
+
3002
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:200
3003
+ msgid "Activate License or update PRO version plugin"
3004
+ msgstr ""
3005
+
3006
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:201
3007
+ msgid "Apparently - you have installed PRO version, but did not activate it license - then please activate it. Or you have old version of plugin - then you need go to Plugins page and Update PRO version plugin, after this go to License tab and re-activate license (just click one more time on \"Activate\" button)."
3008
+ msgstr ""
3009
+
3010
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:210
3011
+ #, php-format
3012
+ msgid "Enable %s with PRO"
3013
+ msgstr ""
3014
+
3015
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:211
3016
+ #, php-format
3017
+ msgid "This is PRO feature, and it will be available once you will install <a href=\"%s\" target=\"_blank\">PRO version</a> of our plugin"
3018
+ msgstr ""
3019
+
3020
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:215
3021
+ msgid "Get PRO"
3022
+ msgstr ""
3023
+
3024
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:222
3025
+ msgid "Subscribe with Facebook"
3026
+ msgstr ""
3027
+
3028
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:223
3029
+ #, php-format
3030
+ msgid "Add button to your PopUp with possibility to subscribe just in one click - without filling fields in your subscribe form, <img src=\"%s\" />"
3031
+ msgstr ""
3032
+
3033
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:236
3034
+ msgid "Create WP user"
3035
+ msgstr ""
3036
+
3037
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:237
3038
+ msgid "Once user will subscribe to selected Subscription service - it will create WordPress Subscriber too. PLease be carefull using this option: WordPressusers will be created right after you submit your Subscribe form without confirmation."
3039
+ msgstr ""
3040
+
3041
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:246
3042
+ msgid "Test Email Function"
3043
+ msgstr ""
3044
+
3045
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:247
3046
+ msgid "Email delivery depends from your server configuration. For some cases - you and your subscribers can not receive emails just because email on your server is not working correctly. You can easy test it here - by sending test email. If you receive it - then it means that email functionality on your server works well. If not - this means that it is not working correctly and you should contact your hosting provider with this issue and ask them to setup email functionality for you on your server."
3047
+ msgstr ""
3048
+
3049
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:255
3050
+ msgid "Send Test Email"
3051
+ msgstr ""
3052
+
3053
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:258
3054
+ msgid "Email was sent. Now check your email inbox / spam folders for test mail. If you don’t find it - it means that your server can't send emails - and you need to contact your hosting provider with this issue."
3055
+ msgstr ""
3056
+
3057
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:266
3058
+ msgid "Subscription fields"
3059
+ msgstr ""
3060
+
3061
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:267
3062
+ msgid "To change field position - just drag-&-drop it to required place between other fields. To add new field to Subscribe form - click on \"+ Add\" button."
3063
+ msgstr ""
3064
+
3065
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:330
3066
+ msgid "This is the message that the user will see after subscription, when letter with confirmation link was sent."
3067
+ msgstr ""
3068
+
3069
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:340
3070
+ msgid "Subscribe success message"
3071
+ msgstr ""
3072
+
3073
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:341
3074
+ msgid "Right after subscriber will be created and confirmed - this message will be shown."
3075
+ msgstr ""
3076
+
3077
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:345
3078
+ #: modules/subscribe/controller.php:40
3079
+ msgid "Thank you for subscribing!"
3080
+ msgstr ""
3081
+
3082
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:362
3083
+ msgid "Email exists error message"
3084
+ msgstr ""
3085
+
3086
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:363
3087
+ msgid "If email that was entered by user already exists - user will see this message. But be careful: this can be used by hackers - to detect existing email in your database, so it's better for you to leave this message same as error message about invalid email above."
3088
+ msgstr ""
3089
+
3090
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:373
3091
+ msgid "Redirect after subscription URL"
3092
+ msgstr ""
3093
+
3094
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:374
3095
+ msgid "You can enable redirection after subscription, just enter here URL that you want to redirect to after subscribe - and user will be redirected there. If you don't need this feature - just leave this field empty."
3096
+ msgstr ""
3097
+
3098
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:397
3099
+ #: modules/subscribe/models/subscribe.php:386
3100
+ msgid "Confirm subscription on [sitename]"
3101
+ msgstr ""
3102
+
3103
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:425
3104
+ #: modules/subscribe/models/subscribe.php:389
3105
+ msgid "You subscribed on site <a href=\"[siteurl]\">[sitename]</a>. Follow <a href=\"[confirm_link]\">this link</a> to complete your subscription. If you did not subscribe here - just ignore this message."
3106
+ msgstr ""
3107
+
3108
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:428
3109
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:472
3110
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:525
3111
+ msgid "Add Attach"
3112
+ msgstr ""
3113
+
3114
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:434
3115
+ msgid "New Subscriber email subject"
3116
+ msgstr ""
3117
+
3118
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:435
3119
+ msgid "Email to New Subscriber subject"
3120
+ msgstr ""
3121
+
3122
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:447
3123
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:448
3124
+ msgid "New Subscriber email From field"
3125
+ msgstr ""
3126
+
3127
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:460
3128
+ msgid "New Subscriber email text"
3129
+ msgstr ""
3130
+
3131
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:461
3132
+ msgid "Email to New Subscriber content"
3133
+ msgstr ""
3134
+
3135
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:478
3136
+ msgid "Redirect if email already exists"
3137
+ msgstr ""
3138
+
3139
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:479
3140
+ msgid "Link to redirect to if user subscribes - but this email already exists"
3141
+ msgstr ""
3142
+
3143
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:492
3144
+ msgid "Submit button name"
3145
+ msgstr ""
3146
+
3147
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:500
3148
+ msgid "New Subscriber Notification"
3149
+ msgstr ""
3150
+
3151
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:513
3152
+ msgid "New Subscriber Notification email text"
3153
+ msgstr ""
3154
+
3155
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:514
3156
+ msgid "Message that you will receive about new subscribers on your site."
3157
+ msgstr ""
3158
+
3159
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:522
3160
+ #: modules/subscribe/models/subscribe.php:81
3161
+ msgid "You have new subscriber on your site <a href=\"[siteurl]\">[sitename]</a>, here is subscriber information:<br />[subscriber_data]"
3162
+ msgstr ""
3163
+
3164
+ #: modules/popup/views/tpl/popupEditAdminSubOpts.php:570
3165
+ msgid "Select File"
3166
+ msgstr ""
3167
+
3168
+ #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:19
3169
+ msgid "Text block"
3170
+ msgstr ""
3171
+
3172
+ #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:19
3173
+ #, php-format
3174
+ msgid "Text block %d"
3175
+ msgstr ""
3176
+
3177
+ #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:39
3178
+ msgid "Button block"
3179
+ msgstr ""
3180
+
3181
+ #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:39
3182
+ #, php-format
3183
+ msgid "Button block %d"
3184
+ msgstr ""
3185
+
3186
+ #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:44
3187
+ msgid "Button Name"
3188
+ msgstr ""
3189
+
3190
+ #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:50
3191
+ msgid "Button URL"
3192
+ msgstr ""
3193
+
3194
+ #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:56
3195
+ msgid "or close PopUp on click"
3196
+ msgstr ""
3197
+
3198
+ #: modules/popup/views/tpl/popupEditAdminTextsOpts.php:73
3199
+ msgid "Foot note"
3200
+ msgstr ""
3201
+
3202
+ #: modules/popup/views/tpl/popupEditAdminTplOpts.php:3
3203
+ msgid "Change PopUp Template"
3204
+ msgstr ""
3205
+
3206
+ #: modules/popup/views/tpl/popupEditFormControls.php:1
3207
+ msgid "Click to Edit"
3208
+ msgstr ""
3209
+
3210
+ #: modules/popup/views/tpl/popupEditFormControls.php:9
3211
+ msgid "Save all changes"
3212
+ msgstr ""
3213
+
3214
+ #: modules/popup/views/tpl/popupEditFormControls.php:13
3215
+ msgid "Clone to New PopUp"
3216
+ msgstr ""
3217
+
3218
+ #: modules/popup/views/tpl/popupEditFormControls.php:15
3219
+ msgid "Clone"
3220
+ msgstr ""
3221
+
3222
+ #: modules/popup/views/tpl/popupEditFormControls.php:19
3223
+ msgid "Preview"
3224
+ msgstr ""
3225
+
3226
+ #: modules/popup/views/tpl/popupEditFormControls.php:21
3227
+ msgid "Turn Off"
3228
+ msgstr ""
3229
+
3230
+ #: modules/popup/views/tpl/popupEditFormControls.php:21
3231
+ msgid "Turn On"
3232
+ msgstr ""
3233
+
3234
+ #: modules/popup/views/tpl/popupEditFormControls.php:27
3235
+ msgid "Delete"
3236
+ msgstr ""
3237
+
3238
+ #: modules/popup/views/tpl/popupEditFormControls.php:34
3239
+ msgid "New Name"
3240
+ msgstr ""
3241
+
3242
+ #: modules/popup/views/tpl/popupEditFormControls.php:35
3243
+ msgid "Copy"
3244
+ msgstr ""
3245
+
3246
+ #: modules/sm/mod.php:31
3247
+ msgid "Google+"
3248
+ msgstr ""
3249
+
3250
+ #: modules/sm/mod.php:32
3251
+ msgid "Twitter"
3252
+ msgstr ""
3253
+
3254
+ #: modules/sm/mod.php:56
3255
+ msgid "Simple"
3256
+ msgstr ""
3257
+
3258
+ #: modules/sm/mod.php:57
3259
+ msgid "Boxy"
3260
+ msgstr ""
3261
+
3262
+ #: modules/statistics/controller.php:40
3263
+ #, php-format
3264
+ msgid "Statistics for %s"
3265
+ msgstr ""
3266
+
3267
+ #: modules/statistics/controller.php:42
3268
+ msgid "Date"
3269
+ msgstr ""
3270
+
3271
+ #: modules/statistics/controller.php:43
3272
+ msgid "Views"
3273
+ msgstr ""
3274
+
3275
+ #: modules/statistics/controller.php:44
3276
+ msgid "Unique Views"
3277
+ msgstr ""
3278
+
3279
+ #: modules/statistics/controller.php:45
3280
+ msgid "Actions"
3281
+ msgstr ""
3282
+
3283
+ #: modules/statistics/controller.php:46
3284
+ msgid "Conversion"
3285
+ msgstr ""
3286
+
3287
+ #: modules/statistics/mod.php:11
3288
+ msgid "Displayed"
3289
+ msgstr ""
3290
+
3291
+ #: modules/statistics/mod.php:12
3292
+ msgid "Subscribed"
3293
+ msgstr ""
3294
+
3295
+ #: modules/statistics/mod.php:13
3296
+ msgid "Shared"
3297
+ msgstr ""
3298
+
3299
+ #: modules/statistics/mod.php:14
3300
+ msgid "Facebook Liked"
3301
+ msgstr ""
3302
+
3303
+ #: modules/statistics/mod.php:16
3304
+ msgid "Registration"
3305
+ msgstr ""
3306
+
3307
+ #: modules/statistics/mod.php:27
3308
+ msgid "Statistics"
3309
+ msgstr ""
3310
+
3311
+ #: modules/statistics/models/statistics.php:35
3312
+ #: modules/subscribe/models/subscribe.php:452
3313
+ msgid "Send me some info, pls"
3314
+ msgstr ""
3315
+
3316
+ #: modules/statistics/models/statistics.php:165
3317
+ msgid "No data found"
3318
+ msgstr ""
3319
+
3320
+ #: modules/statistics/views/tpl/statPopupEditTab.php:4
3321
+ #, php-format
3322
+ msgid "Want to increase conversion, subscribers and social share? <a target=\"_blank\" href=\"%s\" class=\"button\">Get know - how!</a>"
3323
+ msgstr ""
3324
+
3325
+ #: modules/statistics/views/tpl/statPopupEditTab.php:8
3326
+ msgid "Main PopUp Usage Statistics"
3327
+ msgstr ""
3328
+
3329
+ #: modules/statistics/views/tpl/statPopupEditTab.php:10
3330
+ msgid "Clear selection"
3331
+ msgstr ""
3332
+
3333
+ #: modules/statistics/views/tpl/statPopupEditTab.php:12
3334
+ msgid "To"
3335
+ msgstr ""
3336
+
3337
+ #: modules/statistics/views/tpl/statPopupEditTab.php:26
3338
+ msgid "Reset Zoom"
3339
+ msgstr ""
3340
+
3341
+ #: modules/statistics/views/tpl/statPopupEditTab.php:31
3342
+ msgid "Group by"
3343
+ msgstr ""
3344
+
3345
+ #: modules/statistics/views/tpl/statPopupEditTab.php:32
3346
+ msgid "Hour"
3347
+ msgstr ""
3348
+
3349
+ #: modules/statistics/views/tpl/statPopupEditTab.php:33
3350
+ msgid "Day"
3351
+ msgstr ""
3352
+
3353
+ #: modules/statistics/views/tpl/statPopupEditTab.php:34
3354
+ msgid "Week"
3355
+ msgstr ""
3356
+
3357
+ #: modules/statistics/views/tpl/statPopupEditTab.php:35
3358
+ msgid "Month"
3359
+ msgstr ""
3360
+
3361
+ #: modules/statistics/views/tpl/statPopupEditTab.php:37
3362
+ msgid "Export to CSV"
3363
+ msgstr ""
3364
+
3365
+ #: modules/statistics/views/tpl/statPopupEditTab.php:42
3366
+ msgid "Clear data"
3367
+ msgstr ""
3368
+
3369
+ #: modules/statistics/views/tpl/statPopupEditTab.php:48
3370
+ msgid "You can Zoom In by allocating mouse on Graph area."
3371
+ msgstr ""
3372
+
3373
+ #: modules/statistics/views/tpl/statPopupEditTab.php:51
3374
+ msgid "Ratio of All Actions"
3375
+ msgstr ""
3376
+
3377
+ #: modules/statistics/views/tpl/statPopupEditTab.php:56
3378
+ msgid "Once you will have enough different statistics - like shares, subscribes, likes - you will be able to see here which action is used more or less frequently."
3379
+ msgstr ""
3380
+
3381
+ #: modules/statistics/views/tpl/statPopupEditTab.php:60
3382
+ msgid "Ratio of All Social Share"
3383
+ msgstr ""
3384
+
3385
+ #: modules/statistics/views/tpl/statPopupEditTab.php:65
3386
+ msgid "Once you will have enough different statistics about share from PopUp on social media, you will be able to see here which social media is used more or less frequently."
3387
+ msgstr ""
3388
+
3389
+ #: modules/statistics/views/tpl/statPopupEditTab.php:72
3390
+ #, php-format
3391
+ msgid "You have no statistics for \"%s\" PopUp for now. Setup its options and wait until users will view it on your site."
3392
+ msgstr ""
3393
+
3394
+ #: modules/subscribe/controller.php:113
3395
+ #, php-format
3396
+ msgid "Registered from %s"
3397
+ msgstr ""
3398
+
3399
+ #: modules/subscribe/controller.php:114
3400
+ #, php-format
3401
+ msgid "Subscribed to %s"
3402
+ msgstr ""
3403
+
3404
+ #: modules/subscribe/controller.php:128
3405
+ msgid "Activated"
3406
+ msgstr ""
3407
+
3408
+ #: modules/subscribe/controller.php:129
3409
+ msgid "PopUp ID"
3410
+ msgstr ""
3411
+
3412
+ #: modules/subscribe/controller.php:130
3413
+ msgid "Date Created"
3414
+ msgstr ""
3415
+
3416
+ #: modules/subscribe/controller.php:165
3417
+ msgid "There are no members for now"
3418
+ msgstr ""
3419
+
3420
+ #: modules/subscribe/controller.php:166
3421
+ msgid "There are no subscribers for now"
3422
+ msgstr ""
3423
+
3424
+ #: modules/subscribe/mod.php:7
3425
+ msgid "WordPress"
3426
+ msgstr ""
3427
+
3428
+ #: modules/subscribe/mod.php:8
3429
+ msgid "Aweber"
3430
+ msgstr ""
3431
+
3432
+ #: modules/subscribe/mod.php:9
3433
+ msgid "MailChimp"
3434
+ msgstr ""
3435
+
3436
+ #: modules/subscribe/mod.php:10
3437
+ msgid "MailPoet"
3438
+ msgstr ""
3439
+
3440
+ #: modules/subscribe/mod.php:12
3441
+ msgid "Jetpack"
3442
+ msgstr ""
3443
+
3444
+ #: modules/subscribe/models/subscribe.php:50
3445
+ msgid "Something goes wrong"
3446
+ msgstr ""
3447
+
3448
+ #: modules/subscribe/models/subscribe.php:77
3449
+ msgid "New Subscriber notification"
3450
+ msgstr ""
3451
+
3452
+ #: modules/subscribe/models/subscribe.php:78
3453
+ #, php-format
3454
+ msgid "New Subscriber on %s"
3455
+ msgstr ""
3456
+
3457
+ #: modules/subscribe/models/subscribe.php:136
3458
+ #, php-format
3459
+ msgid "Please check %s"
3460
+ msgstr ""
3461
+
3462
+ #: modules/subscribe/models/subscribe.php:173
3463
+ msgid "Can't detect your IP, please don't spam"
3464
+ msgstr ""
3465
+
3466
+ #: modules/subscribe/models/subscribe.php:205
3467
+ msgid "You just subscribed from this IP"
3468
+ msgstr ""
3469
+
3470
+ #: modules/subscribe/models/subscribe.php:321
3471
+ msgid "Can't registrate for now. Please try again later."
3472
+ msgstr ""
3473
+
3474
+ #: modules/subscribe/models/subscribe.php:321
3475
+ msgid "Can't subscribe for now. Please try again later."
3476
+ msgstr ""
3477
+
3478
+ #: modules/subscribe/models/subscribe.php:489
3479
+ msgid "MailChimp requires CURL to be setup on your server. Please contact your hosting provider and ask them to setup CURL library for you."
3480
+ msgstr ""
3481
+
3482
+ #: modules/subscribe/models/subscribe.php:513
3483
+ #: modules/subscribe/models/subscribe.php:547
3484
+ msgid "There was some problem while trying to get your lists. Make sure that your API key is correct."
3485
+ msgstr ""
3486
+
3487
+ #: modules/subscribe/models/subscribe.php:517
3488
+ #: modules/subscribe/models/subscribe.php:555
3489
+ msgid "Empty API key"
3490
+ msgstr ""
3491
+
3492
+ #: modules/subscribe/models/subscribe.php:553
3493
+ msgid "Select some Lists before"
3494
+ msgstr ""
3495
+
3496
+ #: modules/subscribe/models/subscribe.php:627
3497
+ msgid "Something going wrong while trying to send data to MailChimp. Please contact site owner."
3498
+ msgstr ""
3499
+
3500
+ #: modules/subscribe/models/subscribe.php:646
3501
+ msgid "No API key entered in admin area - contact site owner to resolve this issue."
3502
+ msgstr ""
3503
+
3504
+ #: modules/subscribe/models/subscribe.php:738
3505
+ msgid "Some error occured during subscription process"
3506
+ msgstr ""
3507
+
3508
+ #: modules/subscribe/models/subscribe.php:741
3509
+ msgid "Can't find MailPoet on this server"
3510
+ msgstr ""
3511
+
3512
+ #: modules/subscribe/models/subscribe.php:789
3513
+ msgid "Not a valid email address"
3514
+ msgstr ""
3515
+
3516
+ #: modules/subscribe/models/subscribe.php:790
3517
+ msgid "Not a valid post ID"
3518
+ msgstr ""
3519
+
3520
+ #: modules/subscribe/models/subscribe.php:791
3521
+ msgid "Unknown post"
3522
+ msgstr ""
3523
+
3524
+ #: modules/subscribe/models/subscribe.php:792
3525
+ msgid "Strange error. Jetpack servers at WordPress.com could subscribe the email."
3526
+ msgstr ""
3527
+
3528
+ #: modules/subscribe/models/subscribe.php:793
3529
+ msgid "Site owner has disabled subscriptions."
3530
+ msgstr ""
3531
+
3532
+ #: modules/subscribe/models/subscribe.php:794
3533
+ msgid "Already subscribed."
3534
+ msgstr ""
3535
+
3536
+ #: modules/subscribe/models/subscribe.php:795
3537
+ msgid "Strange error. Jetpack servers at WordPress.com returned something malformed."
3538
+ msgstr ""
3539
+
3540
+ #: modules/subscribe/models/subscribe.php:796
3541
+ msgid "Strange error. Jetpack servers at WordPress.com returned something I didn't understand."
3542
+ msgstr ""
3543
+
3544
+ #: modules/subscribe/models/subscribe.php:799
3545
+ msgid "SOmething is going wrong"
3546
+ msgstr ""
3547
+
3548
+ #: modules/subscribe/models/subscribe.php:805
3549
+ msgid "Empty response from Jetpack"
3550
+ msgstr ""
3551
+
3552
+ #: modules/subscribe/models/subscribe.php:807
3553
+ msgid "Subscriptions module is not activated in Jetpack plugin settings. Activate it before start using this subscribe method."
3554
+ msgstr ""
3555
+
3556
+ #: modules/subscribe/models/subscribe.php:809
3557
+ msgid "Can't find Jetpack plugin on this server"
3558
+ msgstr ""
3559
+
3560
+ #: modules/subscribe/views/tpl/subSuccessPage.php:10
3561
+ msgid "Registration Confirmation"
3562
+ msgstr ""
3563
+
3564
+ #: modules/subscribe/views/tpl/subSuccessPage.php:11
3565
+ msgid "Subscribe Confirmation"
3566
+ msgstr ""
3567
+
3568
+ #: modules/subscribe/views/tpl/subSuccessPage.php:53
3569
+ msgid "Some errors occured while trying to registrate"
3570
+ msgstr ""
3571
+
3572
+ #: modules/subscribe/views/tpl/subSuccessPage.php:54
3573
+ msgid "Some errors occured while trying to subscribe"
3574
+ msgstr ""
3575
+
3576
+ #: modules/subscribe/views/tpl/subSuccessPage.php:75
3577
+ msgid "Registration confirmed"
3578
+ msgstr ""
3579
+
3580
+ #: modules/subscribe/views/tpl/subSuccessPage.php:76
3581
+ msgid "Subscription confirmed"
3582
+ msgstr ""
3583
+
3584
+ #: modules/subscribe/views/tpl/subSuccessPage.php:81
3585
+ #, php-format
3586
+ msgid "<a href=\"%s\">Back to site</a> in <i id=\"ppsConfirmBackCounter\">%d</i> seconds"
3587
+ msgstr ""
3588
+
3589
+ #: modules/supsystic_promo/controller.php:7
3590
+ #: modules/supsystic_promo/controller.php:100
3591
+ #: modules/supsystic_promo/controller.php:108
3592
+ #: modules/supsystic_promo/controller.php:116
3593
+ msgid "Information was saved. Thank you!"
3594
+ msgstr ""
3595
+
3596
+ #: modules/supsystic_promo/controller.php:23
3597
+ msgid "Please don't send contact requests so often - wait for response for your previous requests."
3598
+ msgstr ""
3599
+
3600
+ #: modules/supsystic_promo/controller.php:45
3601
+ msgid "Please enter valid email address"
3602
+ msgstr ""
3603
+
3604
+ #: modules/supsystic_promo/mod.php:36
3605
+ #, php-format
3606
+ msgid "<h3>Hey, I noticed you just use %s over a week – that’s awesome!</h3><p>Could you please do me a BIG favor and give it a 5-star rating on WordPress? Just to help us spread the word and boost our motivation.</p>"
3607
+ msgstr ""
3608
+
3609
+ #: modules/supsystic_promo/mod.php:37
3610
+ #: modules/supsystic_promo/mod.php:43
3611
+ msgid "Ok, you deserve it"
3612
+ msgstr ""
3613
+
3614
+ #: modules/supsystic_promo/mod.php:38
3615
+ #: modules/supsystic_promo/mod.php:44
3616
+ msgid "Nope, maybe later"
3617
+ msgstr ""
3618
+
3619
+ #: modules/supsystic_promo/mod.php:39
3620
+ msgid "I already did"
3621
+ msgstr ""
3622
+
3623
+ #: modules/supsystic_promo/mod.php:40
3624
+ #, php-format
3625
+ msgid "<h3>More then eleven days with our %s plugin - Congratulations!</h3>"
3626
+ msgstr ""
3627
+
3628
+ #: modules/supsystic_promo/mod.php:41
3629
+ msgid "<p>On behalf of the entire <a href=\"https://supsystic.com/\" target=\"_blank\">supsystic.com</a> company I would like to thank you for been with us, and I really hope that our software helped you.</p>"
3630
+ msgstr ""
3631
+
3632
+ #: modules/supsystic_promo/mod.php:42
3633
+ msgid "<p>And today, if you want, - you can help us. This is really simple - you can just add small promo link to our site under your PopUps. This is small step for you, but a big help for us! Sure, if you don't want - just skip this and continue enjoy our software!</p>"
3634
+ msgstr ""
3635
+
3636
+ #: modules/supsystic_promo/mod.php:45
3637
+ msgid "Skip"
3638
+ msgstr ""
3639
+
3640
+ #: modules/supsystic_promo/mod.php:92
3641
+ msgid "Overview"
3642
+ msgstr ""
3643
+
3644
+ #: modules/supsystic_promo/mod.php:99
3645
+ msgid "Constant Contact - PRO"
3646
+ msgstr ""
3647
+
3648
+ #: modules/supsystic_promo/mod.php:100
3649
+ msgid "Campaign Monitor - PRO"
3650
+ msgstr ""
3651
+
3652
+ #: modules/supsystic_promo/mod.php:101
3653
+ msgid "Vertical Response - PRO"
3654
+ msgstr ""
3655
+
3656
+ #: modules/supsystic_promo/mod.php:102
3657
+ msgid "SendGrid - PRO"
3658
+ msgstr ""
3659
+
3660
+ #: modules/supsystic_promo/mod.php:103
3661
+ msgid "GetResponse - PRO"
3662
+ msgstr ""
3663
+
3664
+ #: modules/supsystic_promo/mod.php:105
3665
+ msgid "Active Campaign - PRO"
3666
+ msgstr ""
3667
+
3668
+ #: modules/supsystic_promo/mod.php:106
3669
+ msgid "Mailrelay - PRO"
3670
+ msgstr ""
3671
+
3672
+ #: modules/supsystic_promo/mod.php:107
3673
+ msgid "arpReach - PRO"
3674
+ msgstr ""
3675
+
3676
+ #: modules/supsystic_promo/mod.php:108
3677
+ msgid "SG Autorepondeur - PRO"
3678
+ msgstr ""
3679
+
3680
+ #: modules/supsystic_promo/mod.php:109
3681
+ msgid "Benchmark - PRO"
3682
+ msgstr ""
3683
+
3684
+ #: modules/supsystic_promo/mod.php:110
3685
+ msgid "InfusionSoft - PRO"
3686
+ msgstr ""
3687
+
3688
+ #: modules/supsystic_promo/mod.php:111
3689
+ msgid "SalesForce - Web-to-Lead - PRO"
3690
+ msgstr ""
3691
+
3692
+ #: modules/supsystic_promo/mod.php:218
3693
+ msgid "Website"
3694
+ msgstr ""
3695
+
3696
+ #: modules/supsystic_promo/mod.php:219
3697
+ msgid "Subject"
3698
+ msgstr ""
3699
+
3700
+ #: modules/supsystic_promo/mod.php:220
3701
+ msgid "Topic"
3702
+ msgstr ""
3703
+
3704
+ #: modules/supsystic_promo/mod.php:221
3705
+ msgid "Plugin options"
3706
+ msgstr ""
3707
+
3708
+ #: modules/supsystic_promo/mod.php:222
3709
+ msgid "Report a bug"
3710
+ msgstr ""
3711
+
3712
+ #: modules/supsystic_promo/mod.php:223
3713
+ msgid "Require a new functionality"
3714
+ msgstr ""
3715
+
3716
+ #: modules/supsystic_promo/mod.php:224
3717
+ msgid "Other"
3718
+ msgstr ""
3719
+
3720
+ #: modules/supsystic_promo/mod.php:226
3721
+ msgid "Message"
3722
+ msgstr ""
3723
+
3724
+ #: modules/supsystic_promo/mod.php:226
3725
+ msgid "Hello Supsystic Team!"
3726
+ msgstr ""
3727
+
3728
+ #: modules/supsystic_promo/views/supsystic_promo.php:25
3729
+ msgid "Why Popup by Supsystic is \"must have\" for your website?"
3730
+ msgstr ""
3731
+
3732
+ #: modules/supsystic_promo/views/supsystic_promo.php:26
3733
+ #, php-format
3734
+ msgid "Increase your sales by 500%% using Popup by Supsystic! More subscribers = more sales! It's that simple!<br />More info you can find here <a target=\"_blank\" href=\"%s\">Popup by Supsystic is \"must have\" for your website</a>"
3735
+ msgstr ""
3736
+
3737
+ #: modules/supsystic_promo/views/supsystic_promo.php:27
3738
+ msgid "What is A/B testing?"
3739
+ msgstr ""
3740
+
3741
+ #: modules/supsystic_promo/views/supsystic_promo.php:28
3742
+ #, php-format
3743
+ msgid "A/B testing is one of the easiest ways to increase conversion rates and learn more about your audience!<br />A/B test in Popup plugin involves testing two or more versions of a popup window - an A version (original) and a B versions (the variation) - with live traffic and measuring the effect each version has on your conversion rate.<br />To know more detail – click <a target=\"_blank\" href=\"%s\">here</a>"
3744
+ msgstr ""
3745
+
3746
+ #: modules/supsystic_promo/views/supsystic_promo.php:29
3747
+ msgid "How to enable subscription to Aweber?"
3748
+ msgstr ""
3749
+
3750
+ #: modules/supsystic_promo/views/supsystic_promo.php:30
3751
+ #, php-format
3752
+ msgid "In order to subscribe to Aweber you need to know unique list id of your aweber account - check this <a target=\"_blank\" href=\"%s\">page</a> for more details."
3753
+ msgstr ""
3754
+
3755
+ #: modules/supsystic_promo/views/supsystic_promo.php:31
3756
+ msgid "How to subscribe to MailChimp?"
3757
+ msgstr ""
3758
+
3759
+ #: modules/supsystic_promo/views/supsystic_promo.php:32
3760
+ msgid ""
3761
+ "To subscribe to MailChimp you need enter your MailChimp API key and name of list for subscription. To find your MailChimp API key - follow the instructions below:<br />\n"
3762
+ "\t\t\t\t1. Login to your mailchimp account at http://mailchimp.com<br />\n"
3763
+ "\t\t\t\t2. From the left main menu, click on your Username, then select \"Account\" in the flyout menu.<br />\n"
3764
+ "\t\t\t\t3. From the account page select \"Extras\" -> \"API Keys\".<br />\n"
3765
+ "\t\t\t\t4. Your API Key will be listed in the table labeled \"Your API Keys\".<br />\n"
3766
+ "\t\t\t\t5. Copy / Paste your API key into \"MailChimp API key\" field in PopUp edit screen -> Subscribe section."
3767
+ msgstr ""
3768
+
3769
+ #: modules/supsystic_promo/views/supsystic_promo.php:38
3770
+ msgid "Where to find css code for the pop-up window?"
3771
+ msgstr ""
3772
+
3773
+ #: modules/supsystic_promo/views/supsystic_promo.php:39
3774
+ msgid ""
3775
+ "With Popup by Supsystic you can edit CSS style directly from the plugin. <br />\n"
3776
+ "\t\t\t\tIn WordPress admin area - \n"
3777
+ "go to Popup by Supsystic -> choose a popup, what you need -> click Code tab. <br />\n"
3778
+ "Here you can edit css style of the pop-up window."
3779
+ msgstr ""
3780
+
3781
+ #: modules/supsystic_promo/views/supsystic_promo.php:43
3782
+ msgid "How to get PRO version of plugin for FREE?"
3783
+ msgstr ""
3784
+
3785
+ #: modules/supsystic_promo/views/supsystic_promo.php:44
3786
+ #, php-format
3787
+ msgid ""
3788
+ "You have an incredible opportunity to get PRO version for free. Make Translation of the plugin! It will be amazing if you take advantage of this offer!<br />\n"
3789
+ "\t\t\t\t\tMore info you can find here <a target=\"_blank\" href=\"%s\">“Get PRO version of any plugin for FREE”</a>"
3790
+ msgstr ""
3791
+
3792
+ #: modules/supsystic_promo/views/supsystic_promo.php:46
3793
+ msgid "Translation"
3794
+ msgstr ""
3795
+
3796
+ #: modules/supsystic_promo/views/supsystic_promo.php:47
3797
+ #, php-format
3798
+ msgid ""
3799
+ "All available languages are provided with the Supsystic Popup plugin. If your language isn’t available, your plugin will be in English by default.<br />\n"
3800
+ "\t\t\t\t\tAvailable Translations: English, French, German, Spanish, Russian<br />\n"
3801
+ "\t\t\t\t\tTranslate or update a translation Popup WordPress plugin in your language and get a Premium license for FREE. <a target=\"_blank\" href=\"%s\">Contact us.</a>"
3802
+ msgstr ""
3803
+
3804
+ #: modules/supsystic_promo/views/supsystic_promo.php:54
3805
+ msgid "Where's my subscribers?"
3806
+ msgstr ""
3807
+
3808
+ #: modules/supsystic_promo/views/supsystic_promo.php:55
3809
+ #, php-format
3810
+ msgid ""
3811
+ "By default all subscribers add to the WordPress. \n"
3812
+ "\t\t\t\t\tTo find your subscribers go to Users tab on the left navigation menu of WordPress admin area. \n"
3813
+ "\t\t\t\t\tAlso available subscription to the Aweber, MailChimp, MailPoet <a href='%s' target='_blank'>and other</a>. \n"
3814
+ "\t\t\t\t\tIf you want to add another subscription service - just <a href='%s' target='_blank'>contact us</a> and provide URL of the subscription service."
3815
+ msgstr ""
3816
+
3817
+ #: modules/supsystic_promo/views/supsystic_promo.php:59
3818
+ msgid "PopUp doesn't appear on the website"
3819
+ msgstr ""
3820
+
3821
+ #: modules/supsystic_promo/views/supsystic_promo.php:60
3822
+ #, php-format
3823
+ msgid "If you setup you're PopUp properly, and it still doesn't show on the page - there are can be conflict with your WordPress theme or other plugins. <a href='%s' target='_blank'>Contact us</a> with the URL of the webpage you add popup and screenshots / text of the error messages, if you have one - and we will help you resolve your issue."
3824
+ msgstr ""
3825
+
3826
+ #: modules/supsystic_promo/views/supsystic_promo.php:76
3827
+ #, php-format
3828
+ msgid "There were some problems while trying to retrieve our news, but you can always check all list <a target=\"_blank\" href=\"%s\">here</a>."
3829
+ msgstr ""
3830
+
3831
+ #: modules/supsystic_promo/views/supsystic_promo.php:85
3832
+ msgid "Undefined"
3833
+ msgstr ""
3834
+
3835
+ #: modules/supsystic_promo/views/tpl/additionalmainAdminShowOnOptions.php:9
3836
+ #: modules/supsystic_promo/views/tpl/layeredStylePromo.php:10
3837
+ msgid "Available in PRO"
3838
+ msgstr ""
3839
+
3840
+ #: modules/supsystic_promo/views/tpl/adminFooter.php:4
3841
+ msgid "Version"
3842
+ msgstr ""
3843
+
3844
+ #: modules/supsystic_promo/views/tpl/adminFooter.php:10
3845
+ msgid "Go"
3846
+ msgstr ""
3847
+
3848
+ #: modules/supsystic_promo/views/tpl/adminFooter.php:10
3849
+ msgid "PRO"
3850
+ msgstr ""
3851
+
3852
+ #: modules/supsystic_promo/views/tpl/adminFooter.php:15
3853
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:28
3854
+ msgid "Support"
3855
+ msgstr ""
3856
+
3857
+ #: modules/supsystic_promo/views/tpl/adminTour.php:4
3858
+ #, php-format
3859
+ msgid "Welcome to %s plugin!"
3860
+ msgstr ""
3861
+
3862
+ #: modules/supsystic_promo/views/tpl/adminTour.php:5
3863
+ #, php-format
3864
+ msgid "Thank you for choosing our %s plugin. Just click here to start using it - and we will show you it's possibilities and powerfull features."
3865
+ msgstr ""
3866
+
3867
+ #: modules/supsystic_promo/views/tpl/adminTour.php:8
3868
+ #: modules/supsystic_promo/views/tpl/adminTour.php:18
3869
+ #: modules/supsystic_promo/views/tpl/adminTour.php:28
3870
+ #: modules/supsystic_promo/views/tpl/adminTour.php:38
3871
+ #: modules/supsystic_promo/views/tpl/adminTour.php:48
3872
+ #: modules/supsystic_promo/views/tpl/adminTour.php:58
3873
+ #: modules/supsystic_promo/views/tpl/adminTour.php:68
3874
+ #: modules/supsystic_promo/views/tpl/adminTour.php:78
3875
+ #: modules/supsystic_promo/views/tpl/adminTour.php:88
3876
+ #: modules/supsystic_promo/views/tpl/adminTour.php:98
3877
+ msgid "Close"
3878
+ msgstr ""
3879
+
3880
+ #: modules/supsystic_promo/views/tpl/adminTour.php:9
3881
+ #: modules/supsystic_promo/views/tpl/adminTour.php:19
3882
+ #: modules/supsystic_promo/views/tpl/adminTour.php:29
3883
+ #: modules/supsystic_promo/views/tpl/adminTour.php:39
3884
+ #: modules/supsystic_promo/views/tpl/adminTour.php:49
3885
+ #: modules/supsystic_promo/views/tpl/adminTour.php:59
3886
+ #: modules/supsystic_promo/views/tpl/adminTour.php:69
3887
+ #: modules/supsystic_promo/views/tpl/adminTour.php:79
3888
+ #: modules/supsystic_promo/views/tpl/adminTour.php:89
3889
+ #: modules/supsystic_promo/views/tpl/adminTour.php:99
3890
+ msgid "Next"
3891
+ msgstr ""
3892
+
3893
+ #: modules/supsystic_promo/views/tpl/adminTour.php:14
3894
+ msgid "Create your firs PopUp"
3895
+ msgstr ""
3896
+
3897
+ #: modules/supsystic_promo/views/tpl/adminTour.php:15
3898
+ msgid "Click on \"Add New PopUp\" button to create your firs PopUp. Just try - this is really simple!"
3899
+ msgstr ""
3900
+
3901
+ #: modules/supsystic_promo/views/tpl/adminTour.php:24
3902
+ msgid "Enter name for your PopUp"
3903
+ msgstr ""
3904
+
3905
+ #: modules/supsystic_promo/views/tpl/adminTour.php:25
3906
+ msgid "This will be name of your PopUp. You can change it latter."
3907
+ msgstr ""
3908
+
3909
+ #: modules/supsystic_promo/views/tpl/adminTour.php:34
3910
+ msgid "Selecte template for your PopUp"
3911
+ msgstr ""
3912
+
3913
+ #: modules/supsystic_promo/views/tpl/adminTour.php:35
3914
+ msgid "Choose any templates from this list. You will be able to customize it after creation, and also - you will be able to change it latter if you will need this."
3915
+ msgstr ""
3916
+
3917
+ #: modules/supsystic_promo/views/tpl/adminTour.php:44
3918
+ msgid "Save first PopUp"
3919
+ msgstr ""
3920
+
3921
+ #: modules/supsystic_promo/views/tpl/adminTour.php:45
3922
+ msgid "After you entered name of your PopUp and selected it's template - just save it, and you will be redirected to PopUp edit screen - where you will be able to customize your PopUp."
3923
+ msgstr ""
3924
+
3925
+ #: modules/supsystic_promo/views/tpl/adminTour.php:54
3926
+ msgid "Main Settings"
3927
+ msgstr ""
3928
+
3929
+ #: modules/supsystic_promo/views/tpl/adminTour.php:55
3930
+ msgid "Here you can setup main display settings for your PopUp - when it should be visible for your user, when it need to be closed, if required - select specific pages/posts where you need to show your PopUp."
3931
+ msgstr ""
3932
+
3933
+ #: modules/supsystic_promo/views/tpl/adminTour.php:64
3934
+ msgid "Design Settings"
3935
+ msgstr ""
3936
+
3937
+ #: modules/supsystic_promo/views/tpl/adminTour.php:65
3938
+ msgid "One of our most powerfull features - possibility to <strong>customize</strong> design for each PopUp window for your needs. In this section you can select your PopUp colors and images, enter required texts that will describe your neds for your visitors, setup social settings (if required), select PopUp location, and in the end - select Animation style for your PopUp from list of more then 20 different animation styles!"
3939
+ msgstr ""
3940
+
3941
+ #: modules/supsystic_promo/views/tpl/adminTour.php:74
3942
+ msgid "Subscribe Settings"
3943
+ msgstr ""
3944
+
3945
+ #: modules/supsystic_promo/views/tpl/adminTour.php:75
3946
+ msgid "Setup your Subscription settings here - select Subscribers destination in \"Subscribe to\" option - it allow to flow your subscribers not only to WordPress Users, but to other popular subscribe services. With other subscription options you will be able to easily customize your subscribe form in PopUp window."
3947
+ msgstr ""
3948
+
3949
+ #: modules/supsystic_promo/views/tpl/adminTour.php:84
3950
+ msgid "PopUp Statistics"
3951
+ msgstr ""
3952
+
3953
+ #: modules/supsystic_promo/views/tpl/adminTour.php:85
3954
+ msgid "After you will setup your PopUp - it will start displaying to your site visitors. And now - you need to check it's displaying statistics. Here, in Statistics tab, you will be able to see how many times PopUp was shown to your visitors, how many times visitors subscribed to it (if subscription is enabled), how many times visitors shared your site using Social Share PopUp functionality and what social networks for share is most popular (if it was enabled). If you will use AB Testing feature to increase your site popularity - you will see here all your main and tested PopUps statistics - in one graph or diagramm, - and this will provide you with all required information about your POpUp popularity!"
3955
+ msgstr ""
3956
+
3957
+ #: modules/supsystic_promo/views/tpl/adminTour.php:94
3958
+ msgid "PopUp CSS / HTML Code"
3959
+ msgstr ""
3960
+
3961
+ #: modules/supsystic_promo/views/tpl/adminTour.php:95
3962
+ #, php-format
3963
+ msgid "In case you will need modify source CSS / HTML code of your PopUp - you can easily do this here. Just make sure that you know what you are doing - don't break PopUp. You can also find additional information about editing source code <a href=\"%s\" target=\"_blank\">here</a>."
3964
+ msgstr ""
3965
+
3966
+ #: modules/supsystic_promo/views/tpl/adminTour.php:104
3967
+ msgid "Well Done!"
3968
+ msgstr ""
3969
+
3970
+ #: modules/supsystic_promo/views/tpl/adminTour.php:105
3971
+ #, php-format
3972
+ msgid "That's it! Now you know how to use our %s. Just save your PopUp after you will setup it - and you will see results. You can also check our site - <a href=\"%s\" target=\"_blank\">supsystic.com</a> to find out more about our %s plugin. If you will have any questions - you can always contact us on <a href=\"%s\" target=\"_blank\">WordPress plugin forum</a> or in <a href=\"%s\" target=\"_blank\">our support system</a>. We really hope that our solution will be helpful for you. Good luck!"
3973
+ msgstr ""
3974
+
3975
+ #: modules/supsystic_promo/views/tpl/adminTour.php:108
3976
+ msgid "Finish"
3977
+ msgstr ""
3978
+
3979
+ #: modules/supsystic_promo/views/tpl/layeredStylePromo.php:77
3980
+ #, php-format
3981
+ msgid "This functionality and more - is available in PRO version. <a class=\"button button-primary\" target=\"_blank\" href=\"%s\">Get it</a> today for 29$"
3982
+ msgstr ""
3983
+
3984
+ #: modules/supsystic_promo/views/tpl/overviewTabContent.php:5
3985
+ msgid "FAQ and Documentation"
3986
+ msgstr ""
3987
+
3988
+ #: modules/supsystic_promo/views/tpl/overviewTabContent.php:17
3989
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:51
3990
+ msgid "Check all FAQs"
3991
+ msgstr ""
3992
+
3993
+ #: modules/supsystic_promo/views/tpl/overviewTabContent.php:22
3994
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:36
3995
+ msgid "Video Tutorial"
3996
+ msgstr ""
3997
+
3998
+ #: modules/supsystic_promo/views/tpl/overviewTabContent.php:31
3999
+ msgid "Server Settings"
4000
+ msgstr ""
4001
+
4002
+ #: modules/supsystic_promo/views/tpl/overviewTabContent.php:44
4003
+ msgid "News"
4004
+ msgstr ""
4005
+
4006
+ #: modules/supsystic_promo/views/tpl/overviewTabContent.php:50
4007
+ msgid "All news and info"
4008
+ msgstr ""
4009
+
4010
+ #: modules/supsystic_promo/views/tpl/overviewTabContent.php:55
4011
+ msgid "Contact form"
4012
+ msgstr ""
4013
+
4014
+ #: modules/supsystic_promo/views/tpl/overviewTabContent.php:87
4015
+ msgid "Send email"
4016
+ msgstr ""
4017
+
4018
+ #: modules/supsystic_promo/views/tpl/overviewTabContent.php:96
4019
+ msgid "Your email was sent, we will try to respond to your as soon as possible. Thank you for support!"
4020
+ msgstr ""
4021
+
4022
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:7
4023
+ #, php-format
4024
+ msgid "Welcome to the %s v %s"
4025
+ msgstr ""
4026
+
4027
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:8
4028
+ msgid "Skip tutorial"
4029
+ msgstr ""
4030
+
4031
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:11
4032
+ msgid "The best way to collect subscribers and show notifications.<br />We are trying to make our plugin work in most comfortable way for you. Here is some base information about it."
4033
+ msgstr ""
4034
+
4035
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:19
4036
+ msgid "Step-by-step tutorial"
4037
+ msgstr ""
4038
+
4039
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:21
4040
+ msgid "There're really many options of popup customization. So as soon as you close that page, I'll show you step-by-step tutorial of how to use plugin. Hope it will be usefull for you :)"
4041
+ msgstr ""
4042
+
4043
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:24
4044
+ msgid "As an option we can install and setup plugin for you."
4045
+ msgstr ""
4046
+
4047
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:30
4048
+ #, php-format
4049
+ msgid "We love our plugin and do the best to improve all features for You. But sometimes issues happened, or you can't find required feature that you need. Don't worry, just <a href='%s' target='_blank'>contact us</a> and we will help you!"
4050
+ msgstr ""
4051
+
4052
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:48
4053
+ msgid "Frequently Asked Questions"
4054
+ msgstr ""
4055
+
4056
+ #: modules/supsystic_promo/views/tpl/welcomePage.php:59
4057
+ msgid "Let's Start!"
4058
+ msgstr ""
4059
+
modules/mail/engines/PHPMailerAutoload.php CHANGED
@@ -1,49 +1,49 @@
1
- <?php
2
- /**
3
- * PHPMailer SPL autoloader.
4
- * PHP Version 5
5
- * @package PHPMailer
6
- * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
7
- * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
- * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
- * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
- * @author Brent R. Matzelle (original founder)
11
- * @copyright 2012 - 2014 Marcus Bointon
12
- * @copyright 2010 - 2012 Jim Jagielski
13
- * @copyright 2004 - 2009 Andy Prevost
14
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
- * @note This program is distributed in the hope that it will be useful - WITHOUT
16
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
- * FITNESS FOR A PARTICULAR PURPOSE.
18
- */
19
-
20
- /**
21
- * PHPMailer SPL autoloader.
22
- * @param string $classname The name of the class to load
23
- */
24
- function PHPMailerAutoload($classname)
25
- {
26
- //Can't use __DIR__ as it's only in PHP 5.3+
27
- $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
28
- if (is_readable($filename)) {
29
- require $filename;
30
- }
31
- }
32
-
33
- if (version_compare(PHP_VERSION, '5.1.2', '>=')) {
34
- //SPL autoloading was introduced in PHP 5.1.2
35
- if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
36
- spl_autoload_register('PHPMailerAutoload', true, true);
37
- } else {
38
- spl_autoload_register('PHPMailerAutoload');
39
- }
40
- } else {
41
- /**
42
- * Fall back to traditional autoload for old PHP versions
43
- * @param string $classname The name of the class to load
44
- */
45
- function __autoload($classname)
46
- {
47
- PHPMailerAutoload($classname);
48
- }
49
- }
1
+ <?php
2
+ /**
3
+ * PHPMailer SPL autoloader.
4
+ * PHP Version 5
5
+ * @package PHPMailer
6
+ * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
7
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
+ * @author Brent R. Matzelle (original founder)
11
+ * @copyright 2012 - 2014 Marcus Bointon
12
+ * @copyright 2010 - 2012 Jim Jagielski
13
+ * @copyright 2004 - 2009 Andy Prevost
14
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
16
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
+ * FITNESS FOR A PARTICULAR PURPOSE.
18
+ */
19
+
20
+ /**
21
+ * PHPMailer SPL autoloader.
22
+ * @param string $classname The name of the class to load
23
+ */
24
+ function PHPMailerAutoload($classname)
25
+ {
26
+ //Can't use __DIR__ as it's only in PHP 5.3+
27
+ $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
28
+ if (is_readable($filename)) {
29
+ require $filename;
30
+ }
31
+ }
32
+
33
+ if (version_compare(PHP_VERSION, '5.1.2', '>=')) {
34
+ //SPL autoloading was introduced in PHP 5.1.2
35
+ if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
36
+ spl_autoload_register('PHPMailerAutoload', true, true);
37
+ } else {
38
+ spl_autoload_register('PHPMailerAutoload');
39
+ }
40
+ } else {
41
+ /**
42
+ * Fall back to traditional autoload for old PHP versions
43
+ * @param string $classname The name of the class to load
44
+ */
45
+ function __autoload($classname)
46
+ {
47
+ PHPMailerAutoload($classname);
48
+ }
49
+ }
modules/mail/engines/class.phpmailer.php CHANGED
@@ -1,4039 +1,4039 @@
1
- <?php
2
- /**
3
- * PHPMailer - PHP email creation and transport class.
4
- * PHP Version 5
5
- * @package PHPMailer
6
- * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
7
- * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
- * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
- * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
- * @author Brent R. Matzelle (original founder)
11
- * @copyright 2012 - 2014 Marcus Bointon
12
- * @copyright 2010 - 2012 Jim Jagielski
13
- * @copyright 2004 - 2009 Andy Prevost
14
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
- * @note This program is distributed in the hope that it will be useful - WITHOUT
16
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
- * FITNESS FOR A PARTICULAR PURPOSE.
18
- */
19
-
20
- /**
21
- * PHPMailer - PHP email creation and transport class.
22
- * @package PHPMailer
23
- * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
24
- * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
25
- * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
26
- * @author Brent R. Matzelle (original founder)
27
- */
28
- class PHPMailer
29
- {
30
- /**
31
- * The PHPMailer Version number.
32
- * @var string
33
- */
34
- public $Version = '5.2.22';
35
-
36
- /**
37
- * Email priority.
38
- * Options: null (default), 1 = High, 3 = Normal, 5 = low.
39
- * When null, the header is not set at all.
40
- * @var integer
41
- */
42
- public $Priority = null;
43
-
44
- /**
45
- * The character set of the message.
46
- * @var string
47
- */
48
- public $CharSet = 'iso-8859-1';
49
-
50
- /**
51
- * The MIME Content-type of the message.
52
- * @var string
53
- */
54
- public $ContentType = 'text/plain';
55
-
56
- /**
57
- * The message encoding.
58
- * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
59
- * @var string
60
- */
61
- public $Encoding = '8bit';
62
-
63
- /**
64
- * Holds the most recent mailer error message.
65
- * @var string
66
- */
67
- public $ErrorInfo = '';
68
-
69
- /**
70
- * The From email address for the message.
71
- * @var string
72
- */
73
- public $From = 'root@localhost';
74
-
75
- /**
76
- * The From name of the message.
77
- * @var string
78
- */
79
- public $FromName = 'Root User';
80
-
81
- /**
82
- * The Sender email (Return-Path) of the message.
83
- * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
84
- * @var string
85
- */
86
- public $Sender = '';
87
-
88
- /**
89
- * The Return-Path of the message.
90
- * If empty, it will be set to either From or Sender.
91
- * @var string
92
- * @deprecated Email senders should never set a return-path header;
93
- * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
94
- * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
95
- */
96
- public $ReturnPath = '';
97
-
98
- /**
99
- * The Subject of the message.
100
- * @var string
101
- */
102
- public $Subject = '';
103
-
104
- /**
105
- * An HTML or plain text message body.
106
- * If HTML then call isHTML(true).
107
- * @var string
108
- */
109
- public $Body = '';
110
-
111
- /**
112
- * The plain-text message body.
113
- * This body can be read by mail clients that do not have HTML email
114
- * capability such as mutt & Eudora.
115
- * Clients that can read HTML will view the normal Body.
116
- * @var string
117
- */
118
- public $AltBody = '';
119
-
120
- /**
121
- * An iCal message part body.
122
- * Only supported in simple alt or alt_inline message types
123
- * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
124
- * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
125
- * @link http://kigkonsult.se/iCalcreator/
126
- * @var string
127
- */
128
- public $Ical = '';
129
-
130
- /**
131
- * The complete compiled MIME message body.
132
- * @access protected
133
- * @var string
134
- */
135
- protected $MIMEBody = '';
136
-
137
- /**
138
- * The complete compiled MIME message headers.
139
- * @var string
140
- * @access protected
141
- */
142
- protected $MIMEHeader = '';
143
-
144
- /**
145
- * Extra headers that createHeader() doesn't fold in.
146
- * @var string
147
- * @access protected
148
- */
149
- protected $mailHeader = '';
150
-
151
- /**
152
- * Word-wrap the message body to this number of chars.
153
- * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
154
- * @var integer
155
- */
156
- public $WordWrap = 0;
157
-
158
- /**
159
- * Which method to use to send mail.
160
- * Options: "mail", "sendmail", or "smtp".
161
- * @var string
162
- */
163
- public $Mailer = 'mail';
164
-
165
- /**
166
- * The path to the sendmail program.
167
- * @var string
168
- */
169
- public $Sendmail = '/usr/sbin/sendmail';
170
-
171
- /**
172
- * Whether mail() uses a fully sendmail-compatible MTA.
173
- * One which supports sendmail's "-oi -f" options.
174
- * @var boolean
175
- */
176
- public $UseSendmailOptions = true;
177
-
178
- /**
179
- * Path to PHPMailer plugins.
180
- * Useful if the SMTP class is not in the PHP include path.
181
- * @var string
182
- * @deprecated Should not be needed now there is an autoloader.
183
- */
184
- public $PluginDir = '';
185
-
186
- /**
187
- * The email address that a reading confirmation should be sent to, also known as read receipt.
188
- * @var string
189
- */
190
- public $ConfirmReadingTo = '';
191
-
192
- /**
193
- * The hostname to use in the Message-ID header and as default HELO string.
194
- * If empty, PHPMailer attempts to find one with, in order,
195
- * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
196
- * 'localhost.localdomain'.
197
- * @var string
198
- */
199
- public $Hostname = '';
200
-
201
- /**
202
- * An ID to be used in the Message-ID header.
203
- * If empty, a unique id will be generated.
204
- * You can set your own, but it must be in the format "<id@domain>",
205
- * as defined in RFC5322 section 3.6.4 or it will be ignored.
206
- * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
207
- * @var string
208
- */
209
- public $MessageID = '';
210
-
211
- /**
212
- * The message Date to be used in the Date header.
213
- * If empty, the current date will be added.
214
- * @var string
215
- */
216
- public $MessageDate = '';
217
-
218
- /**
219
- * SMTP hosts.
220
- * Either a single hostname or multiple semicolon-delimited hostnames.
221
- * You can also specify a different port
222
- * for each host by using this format: [hostname:port]
223
- * (e.g. "smtp1.example.com:25;smtp2.example.com").
224
- * You can also specify encryption type, for example:
225
- * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
226
- * Hosts will be tried in order.
227
- * @var string
228
- */
229
- public $Host = 'localhost';
230
-
231
- /**
232
- * The default SMTP server port.
233
- * @var integer
234
- * @TODO Why is this needed when the SMTP class takes care of it?
235
- */
236
- public $Port = 25;
237
-
238
- /**
239
- * The SMTP HELO of the message.
240
- * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
241
- * one with the same method described above for $Hostname.
242
- * @var string
243
- * @see PHPMailer::$Hostname
244
- */
245
- public $Helo = '';
246
-
247
- /**
248
- * What kind of encryption to use on the SMTP connection.
249
- * Options: '', 'ssl' or 'tls'
250
- * @var string
251
- */
252
- public $SMTPSecure = '';
253
-
254
- /**
255
- * Whether to enable TLS encryption automatically if a server supports it,
256
- * even if `SMTPSecure` is not set to 'tls'.
257
- * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
258
- * @var boolean
259
- */
260
- public $SMTPAutoTLS = true;
261
-
262
- /**
263
- * Whether to use SMTP authentication.
264
- * Uses the Username and Password properties.
265
- * @var boolean
266
- * @see PHPMailer::$Username
267
- * @see PHPMailer::$Password
268
- */
269
- public $SMTPAuth = false;
270
-
271
- /**
272
- * Options array passed to stream_context_create when connecting via SMTP.
273
- * @var array
274
- */
275
- public $SMTPOptions = array();
276
-
277
- /**
278
- * SMTP username.
279
- * @var string
280
- */
281
- public $Username = '';
282
-
283
- /**
284
- * SMTP password.
285
- * @var string
286
- */
287
- public $Password = '';
288
-
289
- /**
290
- * SMTP auth type.
291
- * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
292
- * @var string
293
- */
294
- public $AuthType = '';
295
-
296
- /**
297
- * SMTP realm.
298
- * Used for NTLM auth
299
- * @var string
300
- */
301
- public $Realm = '';
302
-
303
- /**
304
- * SMTP workstation.
305
- * Used for NTLM auth
306
- * @var string
307
- */
308
- public $Workstation = '';
309
-
310
- /**
311
- * The SMTP server timeout in seconds.
312
- * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
313
- * @var integer
314
- */
315
- public $Timeout = 300;
316
-
317
- /**
318
- * SMTP class debug output mode.
319
- * Debug output level.
320
- * Options:
321
- * * `0` No output
322
- * * `1` Commands
323
- * * `2` Data and commands
324
- * * `3` As 2 plus connection status
325
- * * `4` Low-level data output
326
- * @var integer
327
- * @see SMTP::$do_debug
328
- */
329
- public $SMTPDebug = 0;
330
-
331
- /**
332
- * How to handle debug output.
333
- * Options:
334
- * * `echo` Output plain-text as-is, appropriate for CLI
335
- * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
336
- * * `error_log` Output to error log as configured in php.ini
337
- *
338
- * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
339
- * <code>
340
- * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
341
- * </code>
342
- * @var string|callable
343
- * @see SMTP::$Debugoutput
344
- */
345
- public $Debugoutput = 'echo';
346
-
347
- /**
348
- * Whether to keep SMTP connection open after each message.
349
- * If this is set to true then to close the connection
350
- * requires an explicit call to smtpClose().
351
- * @var boolean
352
- */
353
- public $SMTPKeepAlive = false;
354
-
355
- /**
356
- * Whether to split multiple to addresses into multiple messages
357
- * or send them all in one message.
358
- * Only supported in `mail` and `sendmail` transports, not in SMTP.
359
- * @var boolean
360
- */
361
- public $SingleTo = false;
362
-
363
- /**
364
- * Storage for addresses when SingleTo is enabled.
365
- * @var array
366
- * @TODO This should really not be public
367
- */
368
- public $SingleToArray = array();
369
-
370
- /**
371
- * Whether to generate VERP addresses on send.
372
- * Only applicable when sending via SMTP.
373
- * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
374
- * @link http://www.postfix.org/VERP_README.html Postfix VERP info
375
- * @var boolean
376
- */
377
- public $do_verp = false;
378
-
379
- /**
380
- * Whether to allow sending messages with an empty body.
381
- * @var boolean
382
- */
383
- public $AllowEmpty = false;
384
-
385
- /**
386
- * The default line ending.
387
- * @note The default remains "\n". We force CRLF where we know
388
- * it must be used via self::CRLF.
389
- * @var string
390
- */
391
- public $LE = "\n";
392
-
393
- /**
394
- * DKIM selector.
395
- * @var string
396
- */
397
- public $DKIM_selector = '';
398
-
399
- /**
400
- * DKIM Identity.
401
- * Usually the email address used as the source of the email.
402
- * @var string
403
- */
404
- public $DKIM_identity = '';
405
-
406
- /**
407
- * DKIM passphrase.
408
- * Used if your key is encrypted.
409
- * @var string
410
- */
411
- public $DKIM_passphrase = '';
412
-
413
- /**
414
- * DKIM signing domain name.
415
- * @example 'example.com'
416
- * @var string
417
- */
418
- public $DKIM_domain = '';
419
-
420
- /**
421
- * DKIM private key file path.
422
- * @var string
423
- */
424
- public $DKIM_private = '';
425
-
426
- /**
427
- * DKIM private key string.
428
- * If set, takes precedence over `$DKIM_private`.
429
- * @var string
430
- */
431
- public $DKIM_private_string = '';
432
-
433
- /**
434
- * Callback Action function name.
435
- *
436
- * The function that handles the result of the send email action.
437
- * It is called out by send() for each email sent.
438
- *
439
- * Value can be any php callable: http://www.php.net/is_callable
440
- *
441
- * Parameters:
442
- * boolean $result result of the send action
443
- * string $to email address of the recipient
444
- * string $cc cc email addresses
445
- * string $bcc bcc email addresses
446
- * string $subject the subject
447
- * string $body the email body
448
- * string $from email address of sender
449
- * @var string
450
- */
451
- public $action_function = '';
452
-
453
- /**
454
- * What to put in the X-Mailer header.
455
- * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
456
- * @var string
457
- */
458
- public $XMailer = '';
459
-
460
- /**
461
- * Which validator to use by default when validating email addresses.
462
- * May be a callable to inject your own validator, but there are several built-in validators.
463
- * @see PHPMailer::validateAddress()
464
- * @var string|callable
465
- * @static
466
- */
467
- public static $validator = 'auto';
468
-
469
- /**
470
- * An instance of the SMTP sender class.
471
- * @var SMTP
472
- * @access protected
473
- */
474
- protected $smtp = null;
475
-
476
- /**
477
- * The array of 'to' names and addresses.
478
- * @var array
479
- * @access protected
480
- */
481
- protected $to = array();
482
-
483
- /**
484
- * The array of 'cc' names and addresses.
485
- * @var array
486
- * @access protected
487
- */
488
- protected $cc = array();
489
-
490
- /**
491
- * The array of 'bcc' names and addresses.
492
- * @var array
493
- * @access protected
494
- */
495
- protected $bcc = array();
496
-
497
- /**
498
- * The array of reply-to names and addresses.
499
- * @var array
500
- * @access protected
501
- */
502
- protected $ReplyTo = array();
503
-
504
- /**
505
- * An array of all kinds of addresses.
506
- * Includes all of $to, $cc, $bcc
507
- * @var array
508
- * @access protected
509
- * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
510
- */
511
- protected $all_recipients = array();
512
-
513
- /**
514
- * An array of names and addresses queued for validation.
515
- * In send(), valid and non duplicate entries are moved to $all_recipients
516
- * and one of $to, $cc, or $bcc.
517
- * This array is used only for addresses with IDN.
518
- * @var array
519
- * @access protected
520
- * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
521
- * @see PHPMailer::$all_recipients
522
- */
523
- protected $RecipientsQueue = array();
524
-
525
- /**
526
- * An array of reply-to names and addresses queued for validation.
527
- * In send(), valid and non duplicate entries are moved to $ReplyTo.
528
- * This array is used only for addresses with IDN.
529
- * @var array
530
- * @access protected
531
- * @see PHPMailer::$ReplyTo
532
- */
533
- protected $ReplyToQueue = array();
534
-
535
- /**
536
- * The array of attachments.
537
- * @var array
538
- * @access protected
539
- */
540
- protected $attachment = array();
541
-
542
- /**
543
- * The array of custom headers.
544
- * @var array
545
- * @access protected
546
- */
547
- protected $CustomHeader = array();
548
-
549
- /**
550
- * The most recent Message-ID (including angular brackets).
551
- * @var string
552
- * @access protected
553
- */
554
- protected $lastMessageID = '';
555
-
556
- /**
557
- * The message's MIME type.
558
- * @var string
559
- * @access protected
560
- */
561
- protected $message_type = '';
562
-
563
- /**
564
- * The array of MIME boundary strings.
565
- * @var array
566
- * @access protected
567
- */
568
- protected $boundary = array();
569
-
570
- /**
571
- * The array of available languages.
572
- * @var array
573
- * @access protected
574
- */
575
- protected $language = array();
576
-
577
- /**
578
- * The number of errors encountered.
579
- * @var integer
580
- * @access protected
581
- */
582
- protected $error_count = 0;
583
-
584
- /**
585
- * The S/MIME certificate file path.
586
- * @var string
587
- * @access protected
588
- */
589
- protected $sign_cert_file = '';
590
-
591
- /**
592
- * The S/MIME key file path.
593
- * @var string
594
- * @access protected
595
- */
596
- protected $sign_key_file = '';
597
-
598
- /**
599
- * The optional S/MIME extra certificates ("CA Chain") file path.
600
- * @var string
601
- * @access protected
602
- */
603
- protected $sign_extracerts_file = '';
604
-
605
- /**
606
- * The S/MIME password for the key.
607
- * Used only if the key is encrypted.
608
- * @var string
609
- * @access protected
610
- */
611
- protected $sign_key_pass = '';
612
-
613
- /**
614
- * Whether to throw exceptions for errors.
615
- * @var boolean
616
- * @access protected
617
- */
618
- protected $exceptions = false;
619
-
620
- /**
621
- * Unique ID used for message ID and boundaries.
622
- * @var string
623
- * @access protected
624
- */
625
- protected $uniqueid = '';
626
-
627
- /**
628
- * Error severity: message only, continue processing.
629
- */
630
- const STOP_MESSAGE = 0;
631
-
632
- /**
633
- * Error severity: message, likely ok to continue processing.
634
- */
635
- const STOP_CONTINUE = 1;
636
-
637
- /**
638
- * Error severity: message, plus full stop, critical error reached.
639
- */
640
- const STOP_CRITICAL = 2;
641
-
642
- /**
643
- * SMTP RFC standard line ending.
644
- */
645
- const CRLF = "\r\n";
646
-
647
- /**
648
- * The maximum line length allowed by RFC 2822 section 2.1.1
649
- * @var integer
650
- */
651
- const MAX_LINE_LENGTH = 998;
652
-
653
- /**
654
- * Constructor.
655
- * @param boolean $exceptions Should we throw external exceptions?
656
- */
657
- public function __construct($exceptions = null)
658
- {
659
- if ($exceptions !== null) {
660
- $this->exceptions = (boolean)$exceptions;
661
- }
662
- }
663
-
664
- /**
665
- * Destructor.
666
- */
667
- public function __destruct()
668
- {
669
- //Close any open SMTP connection nicely
670
- $this->smtpClose();
671
- }
672
-
673
- /**
674
- * Call mail() in a safe_mode-aware fashion.
675
- * Also, unless sendmail_path points to sendmail (or something that
676
- * claims to be sendmail), don't pass params (not a perfect fix,
677
- * but it will do)
678
- * @param string $to To
679
- * @param string $subject Subject
680
- * @param string $body Message Body
681
- * @param string $header Additional Header(s)
682
- * @param string $params Params
683
- * @access private
684
- * @return boolean
685
- */
686
- private function mailPassthru($to, $subject, $body, $header, $params)
687
- {
688
- //Check overloading of mail function to avoid double-encoding
689
- if (ini_get('mbstring.func_overload') & 1) {
690
- $subject = $this->secureHeader($subject);
691
- } else {
692
- $subject = $this->encodeHeader($this->secureHeader($subject));
693
- }
694
-
695
- //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
696
- //@link http://php.net/manual/en/function.mail.php
697
- if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
698
- $result = @mail($to, $subject, $body, $header);
699
- } else {
700
- $result = @mail($to, $subject, $body, $header, $params);
701
- }
702
- return $result;
703
- }
704
- /**
705
- * Output debugging info via user-defined method.
706
- * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
707
- * @see PHPMailer::$Debugoutput
708
- * @see PHPMailer::$SMTPDebug
709
- * @param string $str
710
- */
711
- protected function edebug($str)
712
- {
713
- if ($this->SMTPDebug <= 0) {
714
- return;
715
- }
716
- //Avoid clash with built-in function names
717
- if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
718
- call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
719
- return;
720
- }
721
- switch ($this->Debugoutput) {
722
- case 'error_log':
723
- //Don't output, just log
724
- error_log($str);
725
- break;
726
- case 'html':
727
- //Cleans up output a bit for a better looking, HTML-safe output
728
- echo htmlentities(
729
- preg_replace('/[\r\n]+/', '', $str),
730
- ENT_QUOTES,
731
- 'UTF-8'
732
- )
733
- . "<br>\n";
734
- break;
735
- case 'echo':
736
- default:
737
- //Normalize line breaks
738
- $str = preg_replace('/\r\n?/ms', "\n", $str);
739
- echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
740
- "\n",
741
- "\n \t ",
742
- trim($str)
743
- ) . "\n";
744
- }
745
- }
746
-
747
- /**
748
- * Sets message type to HTML or plain.
749
- * @param boolean $isHtml True for HTML mode.
750
- * @return void
751
- */
752
- public function isHTML($isHtml = true)
753
- {
754
- if ($isHtml) {
755
- $this->ContentType = 'text/html';
756
- } else {
757
- $this->ContentType = 'text/plain';
758
- }
759
- }
760
-
761
- /**
762
- * Send messages using SMTP.
763
- * @return void
764
- */
765
- public function isSMTP()
766
- {
767
- $this->Mailer = 'smtp';
768
- }
769
-
770
- /**
771
- * Send messages using PHP's mail() function.
772
- * @return void
773
- */
774
- public function isMail()
775
- {
776
- $this->Mailer = 'mail';
777
- }
778
-
779
- /**
780
- * Send messages using $Sendmail.
781
- * @return void
782
- */
783
- public function isSendmail()
784
- {
785
- $ini_sendmail_path = ini_get('sendmail_path');
786
-
787
- if (!stristr($ini_sendmail_path, 'sendmail')) {
788
- $this->Sendmail = '/usr/sbin/sendmail';
789
- } else {
790
- $this->Sendmail = $ini_sendmail_path;
791
- }
792
- $this->Mailer = 'sendmail';
793
- }
794
-
795
- /**
796
- * Send messages using qmail.
797
- * @return void
798
- */
799
- public function isQmail()
800
- {
801
- $ini_sendmail_path = ini_get('sendmail_path');
802
-
803
- if (!stristr($ini_sendmail_path, 'qmail')) {
804
- $this->Sendmail = '/var/qmail/bin/qmail-inject';
805
- } else {
806
- $this->Sendmail = $ini_sendmail_path;
807
- }
808
- $this->Mailer = 'qmail';
809
- }
810
-
811
- /**
812
- * Add a "To" address.
813
- * @param string $address The email address to send to
814
- * @param string $name
815
- * @return boolean true on success, false if address already used or invalid in some way
816
- */
817
- public function addAddress($address, $name = '')
818
- {
819
- return $this->addOrEnqueueAnAddress('to', $address, $name);
820
- }
821
-
822
- /**
823
- * Add a "CC" address.
824
- * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
825
- * @param string $address The email address to send to
826
- * @param string $name
827
- * @return boolean true on success, false if address already used or invalid in some way
828
- */
829
- public function addCC($address, $name = '')
830
- {
831
- return $this->addOrEnqueueAnAddress('cc', $address, $name);
832
- }
833
-
834
- /**
835
- * Add a "BCC" address.
836
- * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
837
- * @param string $address The email address to send to
838
- * @param string $name
839
- * @return boolean true on success, false if address already used or invalid in some way
840
- */
841
- public function addBCC($address, $name = '')
842
- {
843
- return $this->addOrEnqueueAnAddress('bcc', $address, $name);
844
- }
845
-
846
- /**
847
- * Add a "Reply-To" address.
848
- * @param string $address The email address to reply to
849
- * @param string $name
850
- * @return boolean true on success, false if address already used or invalid in some way
851
- */
852
- public function addReplyTo($address, $name = '')
853
- {
854
- return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
855
- }
856
-
857
- /**
858
- * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
859
- * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
860
- * be modified after calling this function), addition of such addresses is delayed until send().
861
- * Addresses that have been added already return false, but do not throw exceptions.
862
- * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
863
- * @param string $address The email address to send, resp. to reply to
864
- * @param string $name
865
- * @throws phpmailerException
866
- * @return boolean true on success, false if address already used or invalid in some way
867
- * @access protected
868
- */
869
- protected function addOrEnqueueAnAddress($kind, $address, $name)
870
- {
871
- $address = trim($address);
872
- $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
873
- if (($pos = strrpos($address, '@')) === false) {
874
- // At-sign is misssing.
875
- $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
876
- $this->setError($error_message);
877
- $this->edebug($error_message);
878
- if ($this->exceptions) {
879
- throw new phpmailerException($error_message);
880
- }
881
- return false;
882
- }
883
- $params = array($kind, $address, $name);
884
- // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
885
- if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
886
- if ($kind != 'Reply-To') {
887
- if (!array_key_exists($address, $this->RecipientsQueue)) {
888
- $this->RecipientsQueue[$address] = $params;
889
- return true;
890
- }
891
- } else {
892
- if (!array_key_exists($address, $this->ReplyToQueue)) {
893
- $this->ReplyToQueue[$address] = $params;
894
- return true;
895
- }
896
- }
897
- return false;
898
- }
899
- // Immediately add standard addresses without IDN.
900
- return call_user_func_array(array($this, 'addAnAddress'), $params);
901
- }
902
-
903
- /**
904
- * Add an address to one of the recipient arrays or to the ReplyTo array.
905
- * Addresses that have been added already return false, but do not throw exceptions.
906
- * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
907
- * @param string $address The email address to send, resp. to reply to
908
- * @param string $name
909
- * @throws phpmailerException
910
- * @return boolean true on success, false if address already used or invalid in some way
911
- * @access protected
912
- */
913
- protected function addAnAddress($kind, $address, $name = '')
914
- {
915
- if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
916
- $error_message = $this->lang('Invalid recipient kind: ') . $kind;
917
- $this->setError($error_message);
918
- $this->edebug($error_message);
919
- if ($this->exceptions) {
920
- throw new phpmailerException($error_message);
921
- }
922
- return false;
923
- }
924
- if (!$this->validateAddress($address)) {
925
- $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
926
- $this->setError($error_message);
927
- $this->edebug($error_message);
928
- if ($this->exceptions) {
929
- throw new phpmailerException($error_message);
930
- }
931
- return false;
932
- }
933
- if ($kind != 'Reply-To') {
934
- if (!array_key_exists(strtolower($address), $this->all_recipients)) {
935
- array_push($this->$kind, array($address, $name));
936
- $this->all_recipients[strtolower($address)] = true;
937
- return true;
938
- }
939
- } else {
940
- if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
941
- $this->ReplyTo[strtolower($address)] = array($address, $name);
942
- return true;
943
- }
944
- }
945
- return false;
946
- }
947
-
948
- /**
949
- * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
950
- * of the form "display name <address>" into an array of name/address pairs.
951
- * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
952
- * Note that quotes in the name part are removed.
953
- * @param string $addrstr The address list string
954
- * @param bool $useimap Whether to use the IMAP extension to parse the list
955
- * @return array
956
- * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
957
- */
958
- public function parseAddresses($addrstr, $useimap = true)
959
- {
960
- $addresses = array();
961
- if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
962
- //Use this built-in parser if it's available
963
- $list = imap_rfc822_parse_adrlist($addrstr, '');
964
- foreach ($list as $address) {
965
- if ($address->host != '.SYNTAX-ERROR.') {
966
- if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
967
- $addresses[] = array(
968
- 'name' => (property_exists($address, 'personal') ? $address->personal : ''),
969
- 'address' => $address->mailbox . '@' . $address->host
970
- );
971
- }
972
- }
973
- }
974
- } else {
975
- //Use this simpler parser
976
- $list = explode(',', $addrstr);
977
- foreach ($list as $address) {
978
- $address = trim($address);
979
- //Is there a separate name part?
980
- if (strpos($address, '<') === false) {
981
- //No separate name, just use the whole thing
982
- if ($this->validateAddress($address)) {
983
- $addresses[] = array(
984
- 'name' => '',
985
- 'address' => $address
986
- );
987
- }
988
- } else {
989
- list($name, $email) = explode('<', $address);
990
- $email = trim(str_replace('>', '', $email));
991
- if ($this->validateAddress($email)) {
992
- $addresses[] = array(
993
- 'name' => trim(str_replace(array('"', "'"), '', $name)),
994
- 'address' => $email
995
- );
996
- }
997
- }
998
- }
999
- }
1000
- return $addresses;
1001
- }
1002
-
1003
- /**
1004
- * Set the From and FromName properties.
1005
- * @param string $address
1006
- * @param string $name
1007
- * @param boolean $auto Whether to also set the Sender address, defaults to true
1008
- * @throws phpmailerException
1009
- * @return boolean
1010
- */
1011
- public function setFrom($address, $name = '', $auto = true)
1012
- {
1013
- $address = trim($address);
1014
- $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
1015
- // Don't validate now addresses with IDN. Will be done in send().
1016
- if (($pos = strrpos($address, '@')) === false or
1017
- (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
1018
- !$this->validateAddress($address)) {
1019
- $error_message = $this->lang('invalid_address') . " (setFrom) $address";
1020
- $this->setError($error_message);
1021
- $this->edebug($error_message);
1022
- if ($this->exceptions) {
1023
- throw new phpmailerException($error_message);
1024
- }
1025
- return false;
1026
- }
1027
- $this->From = $address;
1028
- $this->FromName = $name;
1029
- if ($auto) {
1030
- if (empty($this->Sender)) {
1031
- $this->Sender = $address;
1032
- }
1033
- }
1034
- return true;
1035
- }
1036
-
1037
- /**
1038
- * Return the Message-ID header of the last email.
1039
- * Technically this is the value from the last time the headers were created,
1040
- * but it's also the message ID of the last sent message except in
1041
- * pathological cases.
1042
- * @return string
1043
- */
1044
- public function getLastMessageID()
1045
- {
1046
- return $this->lastMessageID;
1047
- }
1048
-
1049
- /**
1050
- * Check that a string looks like an email address.
1051
- * @param string $address The email address to check
1052
- * @param string|callable $patternselect A selector for the validation pattern to use :
1053
- * * `auto` Pick best pattern automatically;
1054
- * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
1055
- * * `pcre` Use old PCRE implementation;
1056
- * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
1057
- * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
1058
- * * `noregex` Don't use a regex: super fast, really dumb.
1059
- * Alternatively you may pass in a callable to inject your own validator, for example:
1060
- * PHPMailer::validateAddress('user@example.com', function($address) {
1061
- * return (strpos($address, '@') !== false);
1062
- * });
1063
- * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
1064
- * @return boolean
1065
- * @static
1066
- * @access public
1067
- */
1068
- public static function validateAddress($address, $patternselect = null)
1069
- {
1070
- if (is_null($patternselect)) {
1071
- $patternselect = self::$validator;
1072
- }
1073
- if (is_callable($patternselect)) {
1074
- return call_user_func($patternselect, $address);
1075
- }
1076
- //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
1077
- if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
1078
- return false;
1079
- }
1080
- if (!$patternselect or $patternselect == 'auto') {
1081
- //Check this constant first so it works when extension_loaded() is disabled by safe mode
1082
- //Constant was added in PHP 5.2.4
1083
- if (defined('PCRE_VERSION')) {
1084
- //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
1085
- if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
1086
- $patternselect = 'pcre8';
1087
- } else {
1088
- $patternselect = 'pcre';
1089
- }
1090
- } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
1091
- //Fall back to older PCRE
1092
- $patternselect = 'pcre';
1093
- } else {
1094
- //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
1095
- if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
1096
- $patternselect = 'php';
1097
- } else {
1098
- $patternselect = 'noregex';
1099
- }
1100
- }
1101
- }
1102
- switch ($patternselect) {
1103
- case 'pcre8':
1104
- /**
1105
- * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
1106
- * @link http://squiloople.com/2009/12/20/email-address-validation/
1107
- * @copyright 2009-2010 Michael Rushton
1108
- * Feel free to use and redistribute this code. But please keep this copyright notice.
1109
- */
1110
- return (boolean)preg_match(
1111
- '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
1112
- '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
1113
- '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
1114
- '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
1115
- '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
1116
- '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
1117
- '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
1118
- '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
1119
- '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
1120
- $address
1121
- );
1122
- case 'pcre':
1123
- //An older regex that doesn't need a recent PCRE
1124
- return (boolean)preg_match(
1125
- '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
1126
- '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
1127
- '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
1128
- '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
1129
- '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
1130
- '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
1131
- '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
1132
- '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
1133
- '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
1134
- '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
1135
- $address
1136
- );
1137
- case 'html5':
1138
- /**
1139
- * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
1140
- * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
1141
- */
1142
- return (boolean)preg_match(
1143
- '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
1144
- '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
1145
- $address
1146
- );
1147
- case 'noregex':
1148
- //No PCRE! Do something _very_ approximate!
1149
- //Check the address is 3 chars or longer and contains an @ that's not the first or last char
1150
- return (strlen($address) >= 3
1151
- and strpos($address, '@') >= 1
1152
- and strpos($address, '@') != strlen($address) - 1);
1153
- case 'php':
1154
- default:
1155
- return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
1156
- }
1157
- }
1158
-
1159
- /**
1160
- * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
1161
- * "intl" and "mbstring" PHP extensions.
1162
- * @return bool "true" if required functions for IDN support are present
1163
- */
1164
- public function idnSupported()
1165
- {
1166
- // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
1167
- return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
1168
- }
1169
-
1170
- /**
1171
- * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
1172
- * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
1173
- * This function silently returns unmodified address if:
1174
- * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
1175
- * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
1176
- * or fails for any reason (e.g. domain has characters not allowed in an IDN)
1177
- * @see PHPMailer::$CharSet
1178
- * @param string $address The email address to convert
1179
- * @return string The encoded address in ASCII form
1180
- */
1181
- public function punyencodeAddress($address)
1182
- {
1183
- // Verify we have required functions, CharSet, and at-sign.
1184
- if ($this->idnSupported() and
1185
- !empty($this->CharSet) and
1186
- ($pos = strrpos($address, '@')) !== false) {
1187
- $domain = substr($address, ++$pos);
1188
- // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
1189
- if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
1190
- $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
1191
- if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
1192
- idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
1193
- idn_to_ascii($domain)) !== false) {
1194
- return substr($address, 0, $pos) . $punycode;
1195
- }
1196
- }
1197
- }
1198
- return $address;
1199
- }
1200
-
1201
- /**
1202
- * Create a message and send it.
1203
- * Uses the sending method specified by $Mailer.
1204
- * @throws phpmailerException
1205
- * @return boolean false on error - See the ErrorInfo property for details of the error.
1206
- */
1207
- public function send()
1208
- {
1209
- try {
1210
- if (!$this->preSend()) {
1211
- return false;
1212
- }
1213
- return $this->postSend();
1214
- } catch (phpmailerException $exc) {
1215
- $this->mailHeader = '';
1216
- $this->setError($exc->getMessage());
1217
- if ($this->exceptions) {
1218
- throw $exc;
1219
- }
1220
- return false;
1221
- }
1222
- }
1223
-
1224
- /**
1225
- * Prepare a message for sending.
1226
- * @throws phpmailerException
1227
- * @return boolean
1228
- */
1229
- public function preSend()
1230
- {
1231
- try {
1232
- $this->error_count = 0; // Reset errors
1233
- $this->mailHeader = '';
1234
-
1235
- // Dequeue recipient and Reply-To addresses with IDN
1236
- foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
1237
- $params[1] = $this->punyencodeAddress($params[1]);
1238
- call_user_func_array(array($this, 'addAnAddress'), $params);
1239
- }
1240
- if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
1241
- throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
1242
- }
1243
-
1244
- // Validate From, Sender, and ConfirmReadingTo addresses
1245
- foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
1246
- $this->$address_kind = trim($this->$address_kind);
1247
- if (empty($this->$address_kind)) {
1248
- continue;
1249
- }
1250
- $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
1251
- if (!$this->validateAddress($this->$address_kind)) {
1252
- $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
1253
- $this->setError($error_message);
1254
- $this->edebug($error_message);
1255
- if ($this->exceptions) {
1256
- throw new phpmailerException($error_message);
1257
- }
1258
- return false;
1259
- }
1260
- }
1261
-
1262
- // Set whether the message is multipart/alternative
1263
- if ($this->alternativeExists()) {
1264
- $this->ContentType = 'multipart/alternative';
1265
- }
1266
-
1267
- $this->setMessageType();
1268
- // Refuse to send an empty message unless we are specifically allowing it
1269
- if (!$this->AllowEmpty and empty($this->Body)) {
1270
- throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
1271
- }
1272
-
1273
- // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
1274
- $this->MIMEHeader = '';
1275
- $this->MIMEBody = $this->createBody();
1276
- // createBody may have added some headers, so retain them
1277
- $tempheaders = $this->MIMEHeader;
1278
- $this->MIMEHeader = $this->createHeader();
1279
- $this->MIMEHeader .= $tempheaders;
1280
-
1281
- // To capture the complete message when using mail(), create
1282
- // an extra header list which createHeader() doesn't fold in
1283
- if ($this->Mailer == 'mail') {
1284
- if (count($this->to) > 0) {
1285
- $this->mailHeader .= $this->addrAppend('To', $this->to);
1286
- } else {
1287
- $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
1288
- }
1289
- $this->mailHeader .= $this->headerLine(
1290
- 'Subject',
1291
- $this->encodeHeader($this->secureHeader(trim($this->Subject)))
1292
- );
1293
- }
1294
-
1295
- // Sign with DKIM if enabled
1296
- if (!empty($this->DKIM_domain)
1297
- && !empty($this->DKIM_selector)
1298
- && (!empty($this->DKIM_private_string)
1299
- || (!empty($this->DKIM_private) && file_exists($this->DKIM_private))
1300
- )
1301
- ) {
1302
- $header_dkim = $this->DKIM_Add(
1303
- $this->MIMEHeader . $this->mailHeader,
1304
- $this->encodeHeader($this->secureHeader($this->Subject)),
1305
- $this->MIMEBody
1306
- );
1307
- $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
1308
- str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
1309
- }
1310
- return true;
1311
- } catch (phpmailerException $exc) {
1312
- $this->setError($exc->getMessage());
1313
- if ($this->exceptions) {
1314
- throw $exc;
1315
- }
1316
- return false;
1317
- }
1318
- }
1319
-
1320
- /**
1321
- * Actually send a message.
1322
- * Send the email via the selected mechanism
1323
- * @throws phpmailerException
1324
- * @return boolean
1325
- */
1326
- public function postSend()
1327
- {
1328
- try {
1329
- // Choose the mailer and send through it
1330
- switch ($this->Mailer) {
1331
- case 'sendmail':
1332
- case 'qmail':
1333
- return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
1334
- case 'smtp':
1335
- return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
1336
- case 'mail':
1337
- return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
1338
- default:
1339
- $sendMethod = $this->Mailer.'Send';
1340
- if (method_exists($this, $sendMethod)) {
1341
- return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
1342
- }
1343
-
1344
- return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
1345
- }
1346
- } catch (phpmailerException $exc) {
1347
- $this->setError($exc->getMessage());
1348
- $this->edebug($exc->getMessage());
1349
- if ($this->exceptions) {
1350
- throw $exc;
1351
- }
1352
- }
1353
- return false;
1354
- }
1355
-
1356
- /**
1357
- * Send mail using the $Sendmail program.
1358
- * @param string $header The message headers
1359
- * @param string $body The message body
1360
- * @see PHPMailer::$Sendmail
1361
- * @throws phpmailerException
1362
- * @access protected
1363
- * @return boolean
1364
- */
1365
- protected function sendmailSend($header, $body)
1366
- {
1367
- // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
1368
- if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
1369
- if ($this->Mailer == 'qmail') {
1370
- $sendmailFmt = '%s -f%s';
1371
- } else {
1372
- $sendmailFmt = '%s -oi -f%s -t';
1373
- }
1374
- } else {
1375
- if ($this->Mailer == 'qmail') {
1376
- $sendmailFmt = '%s';
1377
- } else {
1378
- $sendmailFmt = '%s -oi -t';
1379
- }
1380
- }
1381
-
1382
- // TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.
1383
- $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);
1384
-
1385
- if ($this->SingleTo) {
1386
- foreach ($this->SingleToArray as $toAddr) {
1387
- if (!@$mail = popen($sendmail, 'w')) {
1388
- throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
1389
- }
1390
- fputs($mail, 'To: ' . $toAddr . "\n");
1391
- fputs($mail, $header);
1392
- fputs($mail, $body);
1393
- $result = pclose($mail);
1394
- $this->doCallback(
1395
- ($result == 0),
1396
- array($toAddr),
1397
- $this->cc,
1398
- $this->bcc,
1399
- $this->Subject,
1400
- $body,
1401
- $this->From
1402
- );
1403
- if ($result != 0) {
1404
- throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
1405
- }
1406
- }
1407
- } else {
1408
- if (!@$mail = popen($sendmail, 'w')) {
1409
- throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
1410
- }
1411
- fputs($mail, $header);
1412
- fputs($mail, $body);
1413
- $result = pclose($mail);
1414
- $this->doCallback(
1415
- ($result == 0),
1416
- $this->to,
1417
- $this->cc,
1418
- $this->bcc,
1419
- $this->Subject,
1420
- $body,
1421
- $this->From
1422
- );
1423
- if ($result != 0) {
1424
- throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
1425
- }
1426
- }
1427
- return true;
1428
- }
1429
-
1430
- /**
1431
- * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
1432
- *
1433
- * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
1434
- * @param string $string The string to be validated
1435
- * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
1436
- * @access protected
1437
- * @return boolean
1438
- */
1439
- protected static function isShellSafe($string)
1440
- {
1441
- // Future-proof
1442
- if (escapeshellcmd($string) !== $string
1443
- or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
1444
- ) {
1445
- return false;
1446
- }
1447
-
1448
- $length = strlen($string);
1449
-
1450
- for ($i = 0; $i < $length; $i++) {
1451
- $c = $string[$i];
1452
-
1453
- // All other characters have a special meaning in at least one common shell, including = and +.
1454
- // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
1455
- // Note that this does permit non-Latin alphanumeric characters based on the current locale.
1456
- if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
1457
- return false;
1458
- }
1459
- }
1460
-
1461
- return true;
1462
- }
1463
-
1464
- /**
1465
- * Send mail using the PHP mail() function.
1466
- * @param string $header The message headers
1467
- * @param string $body The message body
1468
- * @link http://www.php.net/manual/en/book.mail.php
1469
- * @throws phpmailerException
1470
- * @access protected
1471
- * @return boolean
1472
- */
1473
- protected function mailSend($header, $body)
1474
- {
1475
- $toArr = array();
1476
- foreach ($this->to as $toaddr) {
1477
- $toArr[] = $this->addrFormat($toaddr);
1478
- }
1479
- $to = implode(', ', $toArr);
1480
-
1481
- $params = null;
1482
- //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
1483
- if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
1484
- // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
1485
- if (self::isShellSafe($this->Sender)) {
1486
- $params = sprintf('-f%s', $this->Sender);
1487
- }
1488
- }
1489
- if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
1490
- $old_from = ini_get('sendmail_from');
1491
- ini_set('sendmail_from', $this->Sender);
1492
- }
1493
- $result = false;
1494
- if ($this->SingleTo and count($toArr) > 1) {
1495
- foreach ($toArr as $toAddr) {
1496
- $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
1497
- $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
1498
- }
1499
- } else {
1500
- $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
1501
- $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
1502
- }
1503
- if (isset($old_from)) {
1504
- ini_set('sendmail_from', $old_from);
1505
- }
1506
- if (!$result) {
1507
- throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
1508
- }
1509
- return true;
1510
- }
1511
-
1512
- /**
1513
- * Get an instance to use for SMTP operations.
1514
- * Override this function to load your own SMTP implementation
1515
- * @return SMTP
1516
- */
1517
- public function getSMTPInstance()
1518
- {
1519
- if (!is_object($this->smtp)) {
1520
- $this->smtp = new SMTP;
1521
- }
1522
- return $this->smtp;
1523
- }
1524
-
1525
- /**
1526
- * Send mail via SMTP.
1527
- * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
1528
- * Uses the PHPMailerSMTP class by default.
1529
- * @see PHPMailer::getSMTPInstance() to use a different class.
1530
- * @param string $header The message headers
1531
- * @param string $body The message body
1532
- * @throws phpmailerException
1533
- * @uses SMTP
1534
- * @access protected
1535
- * @return boolean
1536
- */
1537
- protected function smtpSend($header, $body)
1538
- {
1539
- $bad_rcpt = array();
1540
- if (!$this->smtpConnect($this->SMTPOptions)) {
1541
- throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
1542
- }
1543
- if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
1544
- $smtp_from = $this->Sender;
1545
- } else {
1546
- $smtp_from = $this->From;
1547
- }
1548
- if (!$this->smtp->mail($smtp_from)) {
1549
- $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
1550
- throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
1551
- }
1552
-
1553
- // Attempt to send to all recipients
1554
- foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
1555
- foreach ($togroup as $to) {
1556
- if (!$this->smtp->recipient($to[0])) {
1557
- $error = $this->smtp->getError();
1558
- $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
1559
- $isSent = false;
1560
- } else {
1561
- $isSent = true;
1562
- }
1563
- $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
1564
- }
1565
- }
1566
-
1567
- // Only send the DATA command if we have viable recipients
1568
- if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
1569
- throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
1570
- }
1571
- if ($this->SMTPKeepAlive) {
1572
- $this->smtp->reset();
1573
- } else {
1574
- $this->smtp->quit();
1575
- $this->smtp->close();
1576
- }
1577
- //Create error message for any bad addresses
1578
- if (count($bad_rcpt) > 0) {
1579
- $errstr = '';
1580
- foreach ($bad_rcpt as $bad) {
1581
- $errstr .= $bad['to'] . ': ' . $bad['error'];
1582
- }
1583
- throw new phpmailerException(
1584
- $this->lang('recipients_failed') . $errstr,
1585
- self::STOP_CONTINUE
1586
- );
1587
- }
1588
- return true;
1589
- }
1590
-
1591
- /**
1592
- * Initiate a connection to an SMTP server.
1593
- * Returns false if the operation failed.
1594
- * @param array $options An array of options compatible with stream_context_create()
1595
- * @uses SMTP
1596
- * @access public
1597
- * @throws phpmailerException
1598
- * @return boolean
1599
- */
1600
- public function smtpConnect($options = null)
1601
- {
1602
- if (is_null($this->smtp)) {
1603
- $this->smtp = $this->getSMTPInstance();
1604
- }
1605
-
1606
- //If no options are provided, use whatever is set in the instance
1607
- if (is_null($options)) {
1608
- $options = $this->SMTPOptions;
1609
- }
1610
-
1611
- // Already connected?
1612
- if ($this->smtp->connected()) {
1613
- return true;
1614
- }
1615
-
1616
- $this->smtp->setTimeout($this->Timeout);
1617
- $this->smtp->setDebugLevel($this->SMTPDebug);
1618
- $this->smtp->setDebugOutput($this->Debugoutput);
1619
- $this->smtp->setVerp($this->do_verp);
1620
- $hosts = explode(';', $this->Host);
1621
- $lastexception = null;
1622
-
1623
- foreach ($hosts as $hostentry) {
1624
- $hostinfo = array();
1625
- if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
1626
- // Not a valid host entry
1627
- continue;
1628
- }
1629
- // $hostinfo[2]: optional ssl or tls prefix
1630
- // $hostinfo[3]: the hostname
1631
- // $hostinfo[4]: optional port number
1632
- // The host string prefix can temporarily override the current setting for SMTPSecure
1633
- // If it's not specified, the default value is used
1634
- $prefix = '';
1635
- $secure = $this->SMTPSecure;
1636
- $tls = ($this->SMTPSecure == 'tls');
1637
- if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
1638
- $prefix = 'ssl://';
1639
- $tls = false; // Can't have SSL and TLS at the same time
1640
- $secure = 'ssl';
1641
- } elseif ($hostinfo[2] == 'tls') {
1642
- $tls = true;
1643
- // tls doesn't use a prefix
1644
- $secure = 'tls';
1645
- }
1646
- //Do we need the OpenSSL extension?
1647
- $sslext = defined('OPENSSL_ALGO_SHA1');
1648
- if ('tls' === $secure or 'ssl' === $secure) {
1649
- //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
1650
- if (!$sslext) {
1651
- throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
1652
- }
1653
- }
1654
- $host = $hostinfo[3];
1655
- $port = $this->Port;
1656
- $tport = (integer)$hostinfo[4];
1657
- if ($tport > 0 and $tport < 65536) {
1658
- $port = $tport;
1659
- }
1660
- if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
1661
- try {
1662
- if ($this->Helo) {
1663
- $hello = $this->Helo;
1664
- } else {
1665
- $hello = $this->serverHostname();
1666
- }
1667
- $this->smtp->hello($hello);
1668
- //Automatically enable TLS encryption if:
1669
- // * it's not disabled
1670
- // * we have openssl extension
1671
- // * we are not already using SSL
1672
- // * the server offers STARTTLS
1673
- if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
1674
- $tls = true;
1675
- }
1676
- if ($tls) {
1677
- if (!$this->smtp->startTLS()) {
1678
- throw new phpmailerException($this->lang('connect_host'));
1679
- }
1680
- // We must resend EHLO after TLS negotiation
1681
- $this->smtp->hello($hello);
1682
- }
1683
- if ($this->SMTPAuth) {
1684
- if (!$this->smtp->authenticate(
1685
- $this->Username,
1686
- $this->Password,
1687
- $this->AuthType,
1688
- $this->Realm,
1689
- $this->Workstation
1690
- )
1691
- ) {
1692
- throw new phpmailerException($this->lang('authenticate'));
1693
- }
1694
- }
1695
- return true;
1696
- } catch (phpmailerException $exc) {
1697
- $lastexception = $exc;
1698
- $this->edebug($exc->getMessage());
1699
- // We must have connected, but then failed TLS or Auth, so close connection nicely
1700
- $this->smtp->quit();
1701
- }
1702
- }
1703
- }
1704
- // If we get here, all connection attempts have failed, so close connection hard
1705
- $this->smtp->close();
1706
- // As we've caught all exceptions, just report whatever the last one was
1707
- if ($this->exceptions and !is_null($lastexception)) {
1708
- throw $lastexception;
1709
- }
1710
- return false;
1711
- }
1712
-
1713
- /**
1714
- * Close the active SMTP session if one exists.
1715
- * @return void
1716
- */
1717
- public function smtpClose()
1718
- {
1719
- if (is_a($this->smtp, 'SMTP')) {
1720
- if ($this->smtp->connected()) {
1721
- $this->smtp->quit();
1722
- $this->smtp->close();
1723
- }
1724
- }
1725
- }
1726
-
1727
- /**
1728
- * Set the language for error messages.
1729
- * Returns false if it cannot load the language file.
1730
- * The default language is English.
1731
- * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
1732
- * @param string $lang_path Path to the language file directory, with trailing separator (slash)
1733
- * @return boolean
1734
- * @access public
1735
- */
1736
- public function setLanguage($langcode = 'en', $lang_path = '')
1737
- {
1738
- // Backwards compatibility for renamed language codes
1739
- $renamed_langcodes = array(
1740
- 'br' => 'pt_br',
1741
- 'cz' => 'cs',
1742
- 'dk' => 'da',
1743
- 'no' => 'nb',
1744
- 'se' => 'sv',
1745
- );
1746
-
1747
- if (isset($renamed_langcodes[$langcode])) {
1748
- $langcode = $renamed_langcodes[$langcode];
1749
- }
1750
-
1751
- // Define full set of translatable strings in English
1752
- $PHPMAILER_LANG = array(
1753
- 'authenticate' => 'SMTP Error: Could not authenticate.',
1754
- 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
1755
- 'data_not_accepted' => 'SMTP Error: data not accepted.',
1756
- 'empty_message' => 'Message body empty',
1757
- 'encoding' => 'Unknown encoding: ',
1758
- 'execute' => 'Could not execute: ',
1759
- 'file_access' => 'Could not access file: ',
1760
- 'file_open' => 'File Error: Could not open file: ',
1761
- 'from_failed' => 'The following From address failed: ',
1762
- 'instantiate' => 'Could not instantiate mail function.',
1763
- 'invalid_address' => 'Invalid address: ',
1764
- 'mailer_not_supported' => ' mailer is not supported.',
1765
- 'provide_address' => 'You must provide at least one recipient email address.',
1766
- 'recipients_failed' => 'SMTP Error: The following recipients failed: ',
1767
- 'signing' => 'Signing Error: ',
1768
- 'smtp_connect_failed' => 'SMTP connect() failed.',
1769
- 'smtp_error' => 'SMTP server error: ',
1770
- 'variable_set' => 'Cannot set or reset variable: ',
1771
- 'extension_missing' => 'Extension missing: '
1772
- );
1773
- if (empty($lang_path)) {
1774
- // Calculate an absolute path so it can work if CWD is not here
1775
- $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
1776
- }
1777
- //Validate $langcode
1778
- if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
1779
- $langcode = 'en';
1780
- }
1781
- $foundlang = true;
1782
- $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
1783
- // There is no English translation file
1784
- if ($langcode != 'en') {
1785
- // Make sure language file path is readable
1786
- if (!is_readable($lang_file)) {
1787
- $foundlang = false;
1788
- } else {
1789
- // Overwrite language-specific strings.
1790
- // This way we'll never have missing translation keys.
1791
- $foundlang = include $lang_file;
1792
- }
1793
- }
1794
- $this->language = $PHPMAILER_LANG;
1795
- return (boolean)$foundlang; // Returns false if language not found
1796
- }
1797
-
1798
- /**
1799
- * Get the array of strings for the current language.
1800
- * @return array
1801
- */
1802
- public function getTranslations()
1803
- {
1804
- return $this->language;
1805
- }
1806
-
1807
- /**
1808
- * Create recipient headers.
1809
- * @access public
1810
- * @param string $type
1811
- * @param array $addr An array of recipient,
1812
- * where each recipient is a 2-element indexed array with element 0 containing an address
1813
- * and element 1 containing a name, like:
1814
- * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
1815
- * @return string
1816
- */
1817
- public function addrAppend($type, $addr)
1818
- {
1819
- $addresses = array();
1820
- foreach ($addr as $address) {
1821
- $addresses[] = $this->addrFormat($address);
1822
- }
1823
- return $type . ': ' . implode(', ', $addresses) . $this->LE;
1824
- }
1825
-
1826
- /**
1827
- * Format an address for use in a message header.
1828
- * @access public
1829
- * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
1830
- * like array('joe@example.com', 'Joe User')
1831
- * @return string
1832
- */
1833
- public function addrFormat($addr)
1834
- {
1835
- if (empty($addr[1])) { // No name provided
1836
- return $this->secureHeader($addr[0]);
1837
- } else {
1838
- return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
1839
- $addr[0]
1840
- ) . '>';
1841
- }
1842
- }
1843
-
1844
- /**
1845
- * Word-wrap message.
1846
- * For use with mailers that do not automatically perform wrapping
1847
- * and for quoted-printable encoded messages.
1848
- * Original written by philippe.
1849
- * @param string $message The message to wrap
1850
- * @param integer $length The line length to wrap to
1851
- * @param boolean $qp_mode Whether to run in Quoted-Printable mode
1852
- * @access public
1853
- * @return string
1854
- */
1855
- public function wrapText($message, $length, $qp_mode = false)
1856
- {
1857
- if ($qp_mode) {
1858
- $soft_break = sprintf(' =%s', $this->LE);
1859
- } else {
1860
- $soft_break = $this->LE;
1861
- }
1862
- // If utf-8 encoding is used, we will need to make sure we don't
1863
- // split multibyte characters when we wrap
1864
- $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
1865
- $lelen = strlen($this->LE);
1866
- $crlflen = strlen(self::CRLF);
1867
-
1868
- $message = $this->fixEOL($message);
1869
- //Remove a trailing line break
1870
- if (substr($message, -$lelen) == $this->LE) {
1871
- $message = substr($message, 0, -$lelen);
1872
- }
1873
-
1874
- //Split message into lines
1875
- $lines = explode($this->LE, $message);
1876
- //Message will be rebuilt in here
1877
- $message = '';
1878
- foreach ($lines as $line) {
1879
- $words = explode(' ', $line);
1880
- $buf = '';
1881
- $firstword = true;
1882
- foreach ($words as $word) {
1883
- if ($qp_mode and (strlen($word) > $length)) {
1884
- $space_left = $length - strlen($buf) - $crlflen;
1885
- if (!$firstword) {
1886
- if ($space_left > 20) {
1887
- $len = $space_left;
1888
- if ($is_utf8) {
1889
- $len = $this->utf8CharBoundary($word, $len);
1890
- } elseif (substr($word, $len - 1, 1) == '=') {
1891
- $len--;
1892
- } elseif (substr($word, $len - 2, 1) == '=') {
1893
- $len -= 2;
1894
- }
1895
- $part = substr($word, 0, $len);
1896
- $word = substr($word, $len);
1897
- $buf .= ' ' . $part;
1898
- $message .= $buf . sprintf('=%s', self::CRLF);
1899
- } else {
1900
- $message .= $buf . $soft_break;
1901
- }
1902
- $buf = '';
1903
- }
1904
- while (strlen($word) > 0) {
1905
- if ($length <= 0) {
1906
- break;
1907
- }
1908
- $len = $length;
1909
- if ($is_utf8) {
1910
- $len = $this->utf8CharBoundary($word, $len);
1911
- } elseif (substr($word, $len - 1, 1) == '=') {
1912
- $len--;
1913
- } elseif (substr($word, $len - 2, 1) == '=') {
1914
- $len -= 2;
1915
- }
1916
- $part = substr($word, 0, $len);
1917
- $word = substr($word, $len);
1918
-
1919
- if (strlen($word) > 0) {
1920
- $message .= $part . sprintf('=%s', self::CRLF);
1921
- } else {
1922
- $buf = $part;
1923
- }
1924
- }
1925
- } else {
1926
- $buf_o = $buf;
1927
- if (!$firstword) {
1928
- $buf .= ' ';
1929
- }
1930
- $buf .= $word;
1931
-
1932
- if (strlen($buf) > $length and $buf_o != '') {
1933
- $message .= $buf_o . $soft_break;
1934
- $buf = $word;
1935
- }
1936
- }
1937
- $firstword = false;
1938
- }
1939
- $message .= $buf . self::CRLF;
1940
- }
1941
-
1942
- return $message;
1943
- }
1944
-
1945
- /**
1946
- * Find the last character boundary prior to $maxLength in a utf-8
1947
- * quoted-printable encoded string.
1948
- * Original written by Colin Brown.
1949
- * @access public
1950
- * @param string $encodedText utf-8 QP text
1951
- * @param integer $maxLength Find the last character boundary prior to this length
1952
- * @return integer
1953
- */
1954
- public function utf8CharBoundary($encodedText, $maxLength)
1955
- {
1956
- $foundSplitPos = false;
1957
- $lookBack = 3;
1958
- while (!$foundSplitPos) {
1959
- $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
1960
- $encodedCharPos = strpos($lastChunk, '=');
1961
- if (false !== $encodedCharPos) {
1962
- // Found start of encoded character byte within $lookBack block.
1963
- // Check the encoded byte value (the 2 chars after the '=')
1964
- $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
1965
- $dec = hexdec($hex);
1966
- if ($dec < 128) {
1967
- // Single byte character.
1968
- // If the encoded char was found at pos 0, it will fit
1969
- // otherwise reduce maxLength to start of the encoded char
1970
- if ($encodedCharPos > 0) {
1971
- $maxLength = $maxLength - ($lookBack - $encodedCharPos);
1972
- }
1973
- $foundSplitPos = true;
1974
- } elseif ($dec >= 192) {
1975
- // First byte of a multi byte character
1976
- // Reduce maxLength to split at start of character
1977
- $maxLength = $maxLength - ($lookBack - $encodedCharPos);
1978
- $foundSplitPos = true;
1979
- } elseif ($dec < 192) {
1980
- // Middle byte of a multi byte character, look further back
1981
- $lookBack += 3;
1982
- }
1983
- } else {
1984
- // No encoded character found
1985
- $foundSplitPos = true;
1986
- }
1987
- }
1988
- return $maxLength;
1989
- }
1990
-
1991
- /**
1992
- * Apply word wrapping to the message body.
1993
- * Wraps the message body to the number of chars set in the WordWrap property.
1994
- * You should only do this to plain-text bodies as wrapping HTML tags may break them.
1995
- * This is called automatically by createBody(), so you don't need to call it yourself.
1996
- * @access public
1997
- * @return void
1998
- */
1999
- public function setWordWrap()
2000
- {
2001
- if ($this->WordWrap < 1) {
2002
- return;
2003
- }
2004
-
2005
- switch ($this->message_type) {
2006
- case 'alt':
2007
- case 'alt_inline':
2008
- case 'alt_attach':
2009
- case 'alt_inline_attach':
2010
- $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
2011
- break;
2012
- default:
2013
- $this->Body = $this->wrapText($this->Body, $this->WordWrap);
2014
- break;
2015
- }
2016
- }
2017
-
2018
- /**
2019
- * Assemble message headers.
2020
- * @access public
2021
- * @return string The assembled headers
2022
- */
2023
- public function createHeader()
2024
- {
2025
- $result = '';
2026
-
2027
- if ($this->MessageDate == '') {
2028
- $this->MessageDate = self::rfcDate();
2029
- }
2030
- $result .= $this->headerLine('Date', $this->MessageDate);
2031
-
2032
- // To be created automatically by mail()
2033
- if ($this->SingleTo) {
2034
- if ($this->Mailer != 'mail') {
2035
- foreach ($this->to as $toaddr) {
2036
- $this->SingleToArray[] = $this->addrFormat($toaddr);
2037
- }
2038
- }
2039
- } else {
2040
- if (count($this->to) > 0) {
2041
- if ($this->Mailer != 'mail') {
2042
- $result .= $this->addrAppend('To', $this->to);
2043
- }
2044
- } elseif (count($this->cc) == 0) {
2045
- $result .= $this->headerLine('To', 'undisclosed-recipients:;');
2046
- }
2047
- }
2048
-
2049
- $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));
2050
-
2051
- // sendmail and mail() extract Cc from the header before sending
2052
- if (count($this->cc) > 0) {
2053
- $result .= $this->addrAppend('Cc', $this->cc);
2054
- }
2055
-
2056
- // sendmail and mail() extract Bcc from the header before sending
2057
- if ((
2058
- $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
2059
- )
2060
- and count($this->bcc) > 0
2061
- ) {
2062
- $result .= $this->addrAppend('Bcc', $this->bcc);
2063
- }
2064
-
2065
- if (count($this->ReplyTo) > 0) {
2066
- $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
2067
- }
2068
-
2069
- // mail() sets the subject itself
2070
- if ($this->Mailer != 'mail') {
2071
- $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
2072
- }
2073
-
2074
- // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
2075
- // https://tools.ietf.org/html/rfc5322#section-3.6.4
2076
- if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
2077
- $this->lastMessageID = $this->MessageID;
2078
- } else {
2079
- $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
2080
- }
2081
- $result .= $this->headerLine('Message-ID', $this->lastMessageID);
2082
- if (!is_null($this->Priority)) {
2083
- $result .= $this->headerLine('X-Priority', $this->Priority);
2084
- }
2085
- if ($this->XMailer == '') {
2086
- $result .= $this->headerLine(
2087
- 'X-Mailer',
2088
- 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
2089
- );
2090
- } else {
2091
- $myXmailer = trim($this->XMailer);
2092
- if ($myXmailer) {
2093
- $result .= $this->headerLine('X-Mailer', $myXmailer);
2094
- }
2095
- }
2096
-
2097
- if ($this->ConfirmReadingTo != '') {
2098
- $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
2099
- }
2100
-
2101
- // Add custom headers
2102
- foreach ($this->CustomHeader as $header) {
2103
- $result .= $this->headerLine(
2104
- trim($header[0]),
2105
- $this->encodeHeader(trim($header[1]))
2106
- );
2107
- }
2108
- if (!$this->sign_key_file) {
2109
- $result .= $this->headerLine('MIME-Version', '1.0');
2110
- $result .= $this->getMailMIME();
2111
- }
2112
-
2113
- return $result;
2114
- }
2115
-
2116
- /**
2117
- * Get the message MIME type headers.
2118
- * @access public
2119
- * @return string
2120
- */
2121
- public function getMailMIME()
2122
- {
2123
- $result = '';
2124
- $ismultipart = true;
2125
- switch ($this->message_type) {
2126
- case 'inline':
2127
- $result .= $this->headerLine('Content-Type', 'multipart/related;');
2128
- $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
2129
- break;
2130
- case 'attach':
2131
- case 'inline_attach':
2132
- case 'alt_attach':
2133
- case 'alt_inline_attach':
2134
- $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
2135
- $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
2136
- break;
2137
- case 'alt':
2138
- case 'alt_inline':
2139
- $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
2140
- $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
2141
- break;
2142
- default:
2143
- // Catches case 'plain': and case '':
2144
- $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
2145
- $ismultipart = false;
2146
- break;
2147
- }
2148
- // RFC1341 part 5 says 7bit is assumed if not specified
2149
- if ($this->Encoding != '7bit') {
2150
- // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
2151
- if ($ismultipart) {
2152
- if ($this->Encoding == '8bit') {
2153
- $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
2154
- }
2155
- // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
2156
- } else {
2157
- $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
2158
- }
2159
- }
2160
-
2161
- if ($this->Mailer != 'mail') {
2162
- $result .= $this->LE;
2163
- }
2164
-
2165
- return $result;
2166
- }
2167
-
2168
- /**
2169
- * Returns the whole MIME message.
2170
- * Includes complete headers and body.
2171
- * Only valid post preSend().
2172
- * @see PHPMailer::preSend()
2173
- * @access public
2174
- * @return string
2175
- */
2176
- public function getSentMIMEMessage()
2177
- {
2178
- return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
2179
- }
2180
-
2181
- /**
2182
- * Create unique ID
2183
- * @return string
2184
- */
2185
- protected function generateId() {
2186
- return md5(uniqid(time()));
2187
- }
2188
-
2189
- /**
2190
- * Assemble the message body.
2191
- * Returns an empty string on failure.
2192
- * @access public
2193
- * @throws phpmailerException
2194
- * @return string The assembled message body
2195
- */
2196
- public function createBody()
2197
- {
2198
- $body = '';
2199
- //Create unique IDs and preset boundaries
2200
- $this->uniqueid = $this->generateId();
2201
- $this->boundary[1] = 'b1_' . $this->uniqueid;
2202
- $this->boundary[2] = 'b2_' . $this->uniqueid;
2203
- $this->boundary[3] = 'b3_' . $this->uniqueid;
2204
-
2205
- if ($this->sign_key_file) {
2206
- $body .= $this->getMailMIME() . $this->LE;
2207
- }
2208
-
2209
- $this->setWordWrap();
2210
-
2211
- $bodyEncoding = $this->Encoding;
2212
- $bodyCharSet = $this->CharSet;
2213
- //Can we do a 7-bit downgrade?
2214
- if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
2215
- $bodyEncoding = '7bit';
2216
- //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
2217
- $bodyCharSet = 'us-ascii';
2218
- }
2219
- //If lines are too long, and we're not already using an encoding that will shorten them,
2220
- //change to quoted-printable transfer encoding for the body part only
2221
- if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
2222
- $bodyEncoding = 'quoted-printable';
2223
- }
2224
-
2225
- $altBodyEncoding = $this->Encoding;
2226
- $altBodyCharSet = $this->CharSet;
2227
- //Can we do a 7-bit downgrade?
2228
- if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
2229
- $altBodyEncoding = '7bit';
2230
- //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
2231
- $altBodyCharSet = 'us-ascii';
2232
- }
2233
- //If lines are too long, and we're not already using an encoding that will shorten them,
2234
- //change to quoted-printable transfer encoding for the alt body part only
2235
- if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
2236
- $altBodyEncoding = 'quoted-printable';
2237
- }
2238
- //Use this as a preamble in all multipart message types
2239
- $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
2240
- switch ($this->message_type) {
2241
- case 'inline':
2242
- $body .= $mimepre;
2243
- $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
2244
- $body .= $this->encodeString($this->Body, $bodyEncoding);
2245
- $body .= $this->LE . $this->LE;
2246
- $body .= $this->attachAll('inline', $this->boundary[1]);
2247
- break;
2248
- case 'attach':
2249
- $body .= $mimepre;
2250
- $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
2251
- $body .= $this->encodeString($this->Body, $bodyEncoding);
2252
- $body .= $this->LE . $this->LE;
2253
- $body .= $this->attachAll('attachment', $this->boundary[1]);
2254
- break;
2255
- case 'inline_attach':
2256
- $body .= $mimepre;
2257
- $body .= $this->textLine('--' . $this->boundary[1]);
2258
- $body .= $this->headerLine('Content-Type', 'multipart/related;');
2259
- $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
2260
- $body .= $this->LE;
2261
- $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
2262
- $body .= $this->encodeString($this->Body, $bodyEncoding);
2263
- $body .= $this->LE . $this->LE;
2264
- $body .= $this->attachAll('inline', $this->boundary[2]);
2265
- $body .= $this->LE;
2266
- $body .= $this->attachAll('attachment', $this->boundary[1]);
2267
- break;
2268
- case 'alt':
2269
- $body .= $mimepre;
2270
- $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
2271
- $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
2272
- $body .= $this->LE . $this->LE;
2273
- $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
2274
- $body .= $this->encodeString($this->Body, $bodyEncoding);
2275
- $body .= $this->LE . $this->LE;
2276
- if (!empty($this->Ical)) {
2277
- $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
2278
- $body .= $this->encodeString($this->Ical, $this->Encoding);
2279
- $body .= $this->LE . $this->LE;
2280
- }
2281
- $body .= $this->endBoundary($this->boundary[1]);
2282
- break;
2283
- case 'alt_inline':
2284
- $body .= $mimepre;
2285
- $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
2286
- $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
2287
- $body .= $this->LE . $this->LE;
2288
- $body .= $this->textLine('--' . $this->boundary[1]);
2289
- $body .= $this->headerLine('Content-Type', 'multipart/related;');
2290
- $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
2291
- $body .= $this->LE;
2292
- $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
2293
- $body .= $this->encodeString($this->Body, $bodyEncoding);
2294
- $body .= $this->LE . $this->LE;
2295
- $body .= $this->attachAll('inline', $this->boundary[2]);
2296
- $body .= $this->LE;
2297
- $body .= $this->endBoundary($this->boundary[1]);
2298
- break;
2299
- case 'alt_attach':
2300
- $body .= $mimepre;
2301
- $body .= $this->textLine('--' . $this->boundary[1]);
2302
- $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
2303
- $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
2304
- $body .= $this->LE;
2305
- $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
2306
- $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
2307
- $body .= $this->LE . $this->LE;
2308
- $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
2309
- $body .= $this->encodeString($this->Body, $bodyEncoding);
2310
- $body .= $this->LE . $this->LE;
2311
- $body .= $this->endBoundary($this->boundary[2]);
2312
- $body .= $this->LE;
2313
- $body .= $this->attachAll('attachment', $this->boundary[1]);
2314
- break;
2315
- case 'alt_inline_attach':
2316
- $body .= $mimepre;
2317
- $body .= $this->textLine('--' . $this->boundary[1]);
2318
- $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
2319
- $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
2320
- $body .= $this->LE;
2321
- $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
2322
- $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
2323
- $body .= $this->LE . $this->LE;
2324
- $body .= $this->textLine('--' . $this->boundary[2]);
2325
- $body .= $this->headerLine('Content-Type', 'multipart/related;');
2326
- $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
2327
- $body .= $this->LE;
2328
- $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
2329
- $body .= $this->encodeString($this->Body, $bodyEncoding);
2330
- $body .= $this->LE . $this->LE;
2331
- $body .= $this->attachAll('inline', $this->boundary[3]);
2332
- $body .= $this->LE;
2333
- $body .= $this->endBoundary($this->boundary[2]);
2334
- $body .= $this->LE;
2335
- $body .= $this->attachAll('attachment', $this->boundary[1]);
2336
- break;
2337
- default:
2338
- // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
2339
- //Reset the `Encoding` property in case we changed it for line length reasons
2340
- $this->Encoding = $bodyEncoding;
2341
- $body .= $this->encodeString($this->Body, $this->Encoding);
2342
- break;
2343
- }
2344
-
2345
- if ($this->isError()) {
2346
- $body = '';
2347
- } elseif ($this->sign_key_file) {
2348
- try {
2349
- if (!defined('PKCS7_TEXT')) {
2350
- throw new phpmailerException($this->lang('extension_missing') . 'openssl');
2351
- }
2352
- // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
2353
- $file = tempnam(sys_get_temp_dir(), 'mail');
2354
- if (false === file_put_contents($file, $body)) {
2355
- throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
2356
- }
2357
- $signed = tempnam(sys_get_temp_dir(), 'signed');
2358
- //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
2359
- if (empty($this->sign_extracerts_file)) {
2360
- $sign = @openssl_pkcs7_sign(
2361
- $file,
2362
- $signed,
2363
- 'file://' . realpath($this->sign_cert_file),
2364
- array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
2365
- null
2366
- );
2367
- } else {
2368
- $sign = @openssl_pkcs7_sign(
2369
- $file,
2370
- $signed,
2371
- 'file://' . realpath($this->sign_cert_file),
2372
- array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
2373
- null,
2374
- PKCS7_DETACHED,
2375
- $this->sign_extracerts_file
2376
- );
2377
- }
2378
- if ($sign) {
2379
- @unlink($file);
2380
- $body = file_get_contents($signed);
2381
- @unlink($signed);
2382
- //The message returned by openssl contains both headers and body, so need to split them up
2383
- $parts = explode("\n\n", $body, 2);
2384
- $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
2385
- $body = $parts[1];
2386
- } else {
2387
- @unlink($file);
2388
- @unlink($signed);
2389
- throw new phpmailerException($this->lang('signing') . openssl_error_string());
2390
- }
2391
- } catch (phpmailerException $exc) {
2392
- $body = '';
2393
- if ($this->exceptions) {
2394
- throw $exc;
2395
- }
2396
- }
2397
- }
2398
- return $body;
2399
- }
2400
-
2401
- /**
2402
- * Return the start of a message boundary.
2403
- * @access protected
2404
- * @param string $boundary
2405
- * @param string $charSet
2406
- * @param string $contentType
2407
- * @param string $encoding
2408
- * @return string
2409
- */
2410
- protected function getBoundary($boundary, $charSet, $contentType, $encoding)
2411
- {
2412
- $result = '';
2413
- if ($charSet == '') {
2414
- $charSet = $this->CharSet;
2415
- }
2416
- if ($contentType == '') {
2417
- $contentType = $this->ContentType;
2418
- }
2419
- if ($encoding == '') {
2420
- $encoding = $this->Encoding;
2421
- }
2422
- $result .= $this->textLine('--' . $boundary);
2423
- $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
2424
- $result .= $this->LE;
2425
- // RFC1341 part 5 says 7bit is assumed if not specified
2426
- if ($encoding != '7bit') {
2427
- $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
2428
- }
2429
- $result .= $this->LE;
2430
-
2431
- return $result;
2432
- }
2433
-
2434
- /**
2435
- * Return the end of a message boundary.
2436
- * @access protected
2437
- * @param string $boundary
2438
- * @return string
2439
- */
2440
- protected function endBoundary($boundary)
2441
- {
2442
- return $this->LE . '--' . $boundary . '--' . $this->LE;
2443
- }
2444
-
2445
- /**
2446
- * Set the message type.
2447
- * PHPMailer only supports some preset message types, not arbitrary MIME structures.
2448
- * @access protected
2449
- * @return void
2450
- */
2451
- protected function setMessageType()
2452
- {
2453
- $type = array();
2454
- if ($this->alternativeExists()) {
2455
- $type[] = 'alt';
2456
- }
2457
- if ($this->inlineImageExists()) {
2458
- $type[] = 'inline';
2459
- }
2460
- if ($this->attachmentExists()) {
2461
- $type[] = 'attach';
2462
- }
2463
- $this->message_type = implode('_', $type);
2464
- if ($this->message_type == '') {
2465
- //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
2466
- $this->message_type = 'plain';
2467
- }
2468
- }
2469
-
2470
- /**
2471
- * Format a header line.
2472
- * @access public
2473
- * @param string $name
2474
- * @param string $value
2475
- * @return string
2476
- */
2477
- public function headerLine($name, $value)
2478
- {
2479
- return $name . ': ' . $value . $this->LE;
2480
- }
2481
-
2482
- /**
2483
- * Return a formatted mail line.
2484
- * @access public
2485
- * @param string $value
2486
- * @return string
2487
- */
2488
- public function textLine($value)
2489
- {
2490
- return $value . $this->LE;
2491
- }
2492
-
2493
- /**
2494
- * Add an attachment from a path on the filesystem.
2495
- * Never use a user-supplied path to a file!
2496
- * Returns false if the file could not be found or read.
2497
- * @param string $path Path to the attachment.
2498
- * @param string $name Overrides the attachment name.
2499
- * @param string $encoding File encoding (see $Encoding).
2500
- * @param string $type File extension (MIME) type.
2501
- * @param string $disposition Disposition to use
2502
- * @throws phpmailerException
2503
- * @return boolean
2504
- */
2505
- public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
2506
- {
2507
- try {
2508
- if (!@is_file($path)) {
2509
- throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
2510
- }
2511
-
2512
- // If a MIME type is not specified, try to work it out from the file name
2513
- if ($type == '') {
2514
- $type = self::filenameToType($path);
2515
- }
2516
-
2517
- $filename = basename($path);
2518
- if ($name == '') {
2519
- $name = $filename;
2520
- }
2521
-
2522
- $this->attachment[] = array(
2523
- 0 => $path,
2524
- 1 => $filename,
2525
- 2 => $name,
2526
- 3 => $encoding,
2527
- 4 => $type,
2528
- 5 => false, // isStringAttachment
2529
- 6 => $disposition,
2530
- 7 => 0
2531
- );
2532
-
2533
- } catch (phpmailerException $exc) {
2534
- $this->setError($exc->getMessage());
2535
- $this->edebug($exc->getMessage());
2536
- if ($this->exceptions) {
2537
- throw $exc;
2538
- }
2539
- return false;
2540
- }
2541
- return true;
2542
- }
2543
-
2544
- /**
2545
- * Return the array of attachments.
2546
- * @return array
2547
- */
2548
- public function getAttachments()
2549
- {
2550
- return $this->attachment;
2551
- }
2552
-
2553
- /**
2554
- * Attach all file, string, and binary attachments to the message.
2555
- * Returns an empty string on failure.
2556
- * @access protected
2557
- * @param string $disposition_type
2558
- * @param string $boundary
2559
- * @return string
2560
- */
2561
- protected function attachAll($disposition_type, $boundary)
2562
- {
2563
- // Return text of body
2564
- $mime = array();
2565
- $cidUniq = array();
2566
- $incl = array();
2567
-
2568
- // Add all attachments
2569
- foreach ($this->attachment as $attachment) {
2570
- // Check if it is a valid disposition_filter
2571
- if ($attachment[6] == $disposition_type) {
2572
- // Check for string attachment
2573
- $string = '';
2574
- $path = '';
2575
- $bString = $attachment[5];
2576
- if ($bString) {
2577
- $string = $attachment[0];
2578
- } else {
2579
- $path = $attachment[0];
2580
- }
2581
-
2582
- $inclhash = md5(serialize($attachment));
2583
- if (in_array($inclhash, $incl)) {
2584
- continue;
2585
- }
2586
- $incl[] = $inclhash;
2587
- $name = $attachment[2];
2588
- $encoding = $attachment[3];
2589
- $type = $attachment[4];
2590
- $disposition = $attachment[6];
2591
- $cid = $attachment[7];
2592
- if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
2593
- continue;
2594
- }
2595
- $cidUniq[$cid] = true;
2596
-
2597
- $mime[] = sprintf('--%s%s', $boundary, $this->LE);
2598
- //Only include a filename property if we have one
2599
- if (!empty($name)) {
2600
- $mime[] = sprintf(
2601
- 'Content-Type: %s; name="%s"%s',
2602
- $type,
2603
- $this->encodeHeader($this->secureHeader($name)),
2604
- $this->LE
2605
- );
2606
- } else {
2607
- $mime[] = sprintf(
2608
- 'Content-Type: %s%s',
2609
- $type,
2610
- $this->LE
2611
- );
2612
- }
2613
- // RFC1341 part 5 says 7bit is assumed if not specified
2614
- if ($encoding != '7bit') {
2615
- $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
2616
- }
2617
-
2618
- if ($disposition == 'inline') {
2619
- $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
2620
- }
2621
-
2622
- // If a filename contains any of these chars, it should be quoted,
2623
- // but not otherwise: RFC2183 & RFC2045 5.1
2624
- // Fixes a warning in IETF's msglint MIME checker
2625
- // Allow for bypassing the Content-Disposition header totally
2626
- if (!(empty($disposition))) {
2627
- $encoded_name = $this->encodeHeader($this->secureHeader($name));
2628
- if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
2629
- $mime[] = sprintf(
2630
- 'Content-Disposition: %s; filename="%s"%s',
2631
- $disposition,
2632
- $encoded_name,
2633
- $this->LE . $this->LE
2634
- );
2635
- } else {
2636
- if (!empty($encoded_name)) {
2637
- $mime[] = sprintf(
2638
- 'Content-Disposition: %s; filename=%s%s',
2639
- $disposition,
2640
- $encoded_name,
2641
- $this->LE . $this->LE
2642
- );
2643
- } else {
2644
- $mime[] = sprintf(
2645
- 'Content-Disposition: %s%s',
2646
- $disposition,
2647
- $this->LE . $this->LE
2648
- );
2649
- }
2650
- }
2651
- } else {
2652
- $mime[] = $this->LE;
2653
- }
2654
-
2655
- // Encode as string attachment
2656
- if ($bString) {
2657
- $mime[] = $this->encodeString($string, $encoding);
2658
- if ($this->isError()) {
2659
- return '';
2660
- }
2661
- $mime[] = $this->LE . $this->LE;
2662
- } else {
2663
- $mime[] = $this->encodeFile($path, $encoding);
2664
- if ($this->isError()) {
2665
- return '';
2666
- }
2667
- $mime[] = $this->LE . $this->LE;
2668
- }
2669
- }
2670
- }
2671
-
2672
- $mime[] = sprintf('--%s--%s', $boundary, $this->LE);
2673
-
2674
- return implode('', $mime);
2675
- }
2676
-
2677
- /**
2678
- * Encode a file attachment in requested format.
2679
- * Returns an empty string on failure.
2680
- * @param string $path The full path to the file
2681
- * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
2682
- * @throws phpmailerException
2683
- * @access protected
2684
- * @return string
2685
- */
2686
- protected function encodeFile($path, $encoding = 'base64')
2687
- {
2688
- try {
2689
- if (!is_readable($path)) {
2690
- throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
2691
- }
2692
- $magic_quotes = get_magic_quotes_runtime();
2693
- if ($magic_quotes) {
2694
- if (version_compare(PHP_VERSION, '5.3.0', '<')) {
2695
- set_magic_quotes_runtime(false);
2696
- } else {
2697
- //Doesn't exist in PHP 5.4, but we don't need to check because
2698
- //get_magic_quotes_runtime always returns false in 5.4+
2699
- //so it will never get here
2700
- ini_set('magic_quotes_runtime', false);
2701
- }
2702
- }
2703
- $file_buffer = file_get_contents($path);
2704
- $file_buffer = $this->encodeString($file_buffer, $encoding);
2705
- if ($magic_quotes) {
2706
- if (version_compare(PHP_VERSION, '5.3.0', '<')) {
2707
- set_magic_quotes_runtime($magic_quotes);
2708
- } else {
2709
- ini_set('magic_quotes_runtime', $magic_quotes);
2710
- }
2711
- }
2712
- return $file_buffer;
2713
- } catch (Exception $exc) {
2714
- $this->setError($exc->getMessage());
2715
- return '';
2716
- }
2717
- }
2718
-
2719
- /**
2720
- * Encode a string in requested format.
2721
- * Returns an empty string on failure.
2722
- * @param string $str The text to encode
2723
- * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
2724
- * @access public
2725
- * @return string
2726
- */
2727
- public function encodeString($str, $encoding = 'base64')
2728
- {
2729
- $encoded = '';
2730
- switch (strtolower($encoding)) {
2731
- case 'base64':
2732
- $encoded = chunk_split(base64_encode($str), 76, $this->LE);
2733
- break;
2734
- case '7bit':
2735
- case '8bit':
2736
- $encoded = $this->fixEOL($str);
2737
- // Make sure it ends with a line break
2738
- if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
2739
- $encoded .= $this->LE;
2740
- }
2741
- break;
2742
- case 'binary':
2743
- $encoded = $str;
2744
- break;
2745
- case 'quoted-printable':
2746
- $encoded = $this->encodeQP($str);
2747
- break;
2748
- default:
2749
- $this->setError($this->lang('encoding') . $encoding);
2750
- break;
2751
- }
2752
- return $encoded;
2753
- }
2754
-
2755
- /**
2756
- * Encode a header string optimally.
2757
- * Picks shortest of Q, B, quoted-printable or none.
2758
- * @access public
2759
- * @param string $str
2760
- * @param string $position
2761
- * @return string
2762
- */
2763
- public function encodeHeader($str, $position = 'text')
2764
- {
2765
- $matchcount = 0;
2766
- switch (strtolower($position)) {
2767
- case 'phrase':
2768
- if (!preg_match('/[\200-\377]/', $str)) {
2769
- // Can't use addslashes as we don't know the value of magic_quotes_sybase
2770
- $encoded = addcslashes($str, "\0..\37\177\\\"");
2771
- if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
2772
- return ($encoded);
2773
- } else {
2774
- return ("\"$encoded\"");
2775
- }
2776
- }
2777
- $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
2778
- break;
2779
- /** @noinspection PhpMissingBreakStatementInspection */
2780
- case 'comment':
2781
- $matchcount = preg_match_all('/[()"]/', $str, $matches);
2782
- // Intentional fall-through
2783
- case 'text':
2784
- default:
2785
- $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
2786
- break;
2787
- }
2788
-
2789
- //There are no chars that need encoding
2790
- if ($matchcount == 0) {
2791
- return ($str);
2792
- }
2793
-
2794
- $maxlen = 75 - 7 - strlen($this->CharSet);
2795
- // Try to select the encoding which should produce the shortest output
2796
- if ($matchcount > strlen($str) / 3) {
2797
- // More than a third of the content will need encoding, so B encoding will be most efficient
2798
- $encoding = 'B';
2799
- if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
2800
- // Use a custom function which correctly encodes and wraps long
2801
- // multibyte strings without breaking lines within a character
2802
- $encoded = $this->base64EncodeWrapMB($str, "\n");
2803
- } else {
2804
- $encoded = base64_encode($str);
2805
- $maxlen -= $maxlen % 4;
2806
- $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
2807
- }
2808
- } else {
2809
- $encoding = 'Q';
2810
- $encoded = $this->encodeQ($str, $position);
2811
- $encoded = $this->wrapText($encoded, $maxlen, true);
2812
- $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
2813
- }
2814
-
2815
- $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
2816
- $encoded = trim(str_replace("\n", $this->LE, $encoded));
2817
-
2818
- return $encoded;
2819
- }
2820
-
2821
- /**
2822
- * Check if a string contains multi-byte characters.
2823
- * @access public
2824
- * @param string $str multi-byte text to wrap encode
2825
- * @return boolean
2826
- */
2827
- public function hasMultiBytes($str)
2828
- {
2829
- if (function_exists('mb_strlen')) {
2830
- return (strlen($str) > mb_strlen($str, $this->CharSet));
2831
- } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
2832
- return false;
2833
- }
2834
- }
2835
-
2836
- /**
2837
- * Does a string contain any 8-bit chars (in any charset)?
2838
- * @param string $text
2839
- * @return boolean
2840
- */
2841
- public function has8bitChars($text)
2842
- {
2843
- return (boolean)preg_match('/[\x80-\xFF]/', $text);
2844
- }
2845
-
2846
- /**
2847
- * Encode and wrap long multibyte strings for mail headers
2848
- * without breaking lines within a character.
2849
- * Adapted from a function by paravoid
2850
- * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
2851
- * @access public
2852
- * @param string $str multi-byte text to wrap encode
2853
- * @param string $linebreak string to use as linefeed/end-of-line
2854
- * @return string
2855
- */
2856
- public function base64EncodeWrapMB($str, $linebreak = null)
2857
- {
2858
- $start = '=?' . $this->CharSet . '?B?';
2859
- $end = '?=';
2860
- $encoded = '';
2861
- if ($linebreak === null) {
2862
- $linebreak = $this->LE;
2863
- }
2864
-
2865
- $mb_length = mb_strlen($str, $this->CharSet);
2866
- // Each line must have length <= 75, including $start and $end
2867
- $length = 75 - strlen($start) - strlen($end);
2868
- // Average multi-byte ratio
2869
- $ratio = $mb_length / strlen($str);
2870
- // Base64 has a 4:3 ratio
2871
- $avgLength = floor($length * $ratio * .75);
2872
-
2873
- for ($i = 0; $i < $mb_length; $i += $offset) {
2874
- $lookBack = 0;
2875
- do {
2876
- $offset = $avgLength - $lookBack;
2877
- $chunk = mb_substr($str, $i, $offset, $this->CharSet);
2878
- $chunk = base64_encode($chunk);
2879
- $lookBack++;
2880
- } while (strlen($chunk) > $length);
2881
- $encoded .= $chunk . $linebreak;
2882
- }
2883
-
2884
- // Chomp the last linefeed
2885
- $encoded = substr($encoded, 0, -strlen($linebreak));
2886
- return $encoded;
2887
- }
2888
-
2889
- /**
2890
- * Encode a string in quoted-printable format.
2891
- * According to RFC2045 section 6.7.
2892
- * @access public
2893
- * @param string $string The text to encode
2894
- * @param integer $line_max Number of chars allowed on a line before wrapping
2895
- * @return string
2896
- * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
2897
- */
2898
- public function encodeQP($string, $line_max = 76)
2899
- {
2900
- // Use native function if it's available (>= PHP5.3)
2901
- if (function_exists('quoted_printable_encode')) {
2902
- return quoted_printable_encode($string);
2903
- }
2904
- // Fall back to a pure PHP implementation
2905
- $string = str_replace(
2906
- array('%20', '%0D%0A.', '%0D%0A', '%'),
2907
- array(' ', "\r\n=2E", "\r\n", '='),
2908
- rawurlencode($string)
2909
- );
2910
- return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
2911
- }
2912
-
2913
- /**
2914
- * Backward compatibility wrapper for an old QP encoding function that was removed.
2915
- * @see PHPMailer::encodeQP()
2916
- * @access public
2917
- * @param string $string
2918
- * @param integer $line_max
2919
- * @param boolean $space_conv
2920
- * @return string
2921
- * @deprecated Use encodeQP instead.
2922
- */
2923
- public function encodeQPphp(
2924
- $string,
2925
- $line_max = 76,
2926
- /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
2927
- ) {
2928
- return $this->encodeQP($string, $line_max);
2929
- }
2930
-
2931
- /**
2932
- * Encode a string using Q encoding.
2933
- * @link http://tools.ietf.org/html/rfc2047
2934
- * @param string $str the text to encode
2935
- * @param string $position Where the text is going to be used, see the RFC for what that means
2936
- * @access public
2937
- * @return string
2938
- */
2939
- public function encodeQ($str, $position = 'text')
2940
- {
2941
- // There should not be any EOL in the string
2942
- $pattern = '';
2943
- $encoded = str_replace(array("\r", "\n"), '', $str);
2944
- switch (strtolower($position)) {
2945
- case 'phrase':
2946
- // RFC 2047 section 5.3
2947
- $pattern = '^A-Za-z0-9!*+\/ -';
2948
- break;
2949
- /** @noinspection PhpMissingBreakStatementInspection */
2950
- case 'comment':
2951
- // RFC 2047 section 5.2
2952
- $pattern = '\(\)"';
2953
- // intentional fall-through
2954
- // for this reason we build the $pattern without including delimiters and []
2955
- case 'text':
2956
- default:
2957
- // RFC 2047 section 5.1
2958
- // Replace every high ascii, control, =, ? and _ characters
2959
- $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
2960
- break;
2961
- }
2962
- $matches = array();
2963
- if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
2964
- // If the string contains an '=', make sure it's the first thing we replace
2965
- // so as to avoid double-encoding
2966
- $eqkey = array_search('=', $matches[0]);
2967
- if (false !== $eqkey) {
2968
- unset($matches[0][$eqkey]);
2969
- array_unshift($matches[0], '=');
2970
- }
2971
- foreach (array_unique($matches[0]) as $char) {
2972
- $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
2973
- }
2974
- }
2975
- // Replace every spaces to _ (more readable than =20)
2976
- return str_replace(' ', '_', $encoded);
2977
- }
2978
-
2979
- /**
2980
- * Add a string or binary attachment (non-filesystem).
2981
- * This method can be used to attach ascii or binary data,
2982
- * such as a BLOB record from a database.
2983
- * @param string $string String attachment data.
2984
- * @param string $filename Name of the attachment.
2985
- * @param string $encoding File encoding (see $Encoding).
2986
- * @param string $type File extension (MIME) type.
2987
- * @param string $disposition Disposition to use
2988
- * @return void
2989
- */
2990
- public function addStringAttachment(
2991
- $string,
2992
- $filename,
2993
- $encoding = 'base64',
2994
- $type = '',
2995
- $disposition = 'attachment'
2996
- ) {
2997
- // If a MIME type is not specified, try to work it out from the file name
2998
- if ($type == '') {
2999
- $type = self::filenameToType($filename);
3000
- }
3001
- // Append to $attachment array
3002
- $this->attachment[] = array(
3003
- 0 => $string,
3004
- 1 => $filename,
3005
- 2 => basename($filename),
3006
- 3 => $encoding,
3007
- 4 => $type,
3008
- 5 => true, // isStringAttachment
3009
- 6 => $disposition,
3010
- 7 => 0
3011
- );
3012
- }
3013
-
3014
- /**
3015
- * Add an embedded (inline) attachment from a file.
3016
- * This can include images, sounds, and just about any other document type.
3017
- * These differ from 'regular' attachments in that they are intended to be
3018
- * displayed inline with the message, not just attached for download.
3019
- * This is used in HTML messages that embed the images
3020
- * the HTML refers to using the $cid value.
3021
- * Never use a user-supplied path to a file!
3022
- * @param string $path Path to the attachment.
3023
- * @param string $cid Content ID of the attachment; Use this to reference
3024
- * the content when using an embedded image in HTML.
3025
- * @param string $name Overrides the attachment name.
3026
- * @param string $encoding File encoding (see $Encoding).
3027
- * @param string $type File MIME type.
3028
- * @param string $disposition Disposition to use
3029
- * @return boolean True on successfully adding an attachment
3030
- */
3031
- public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
3032
- {
3033
- if (!@is_file($path)) {
3034
- $this->setError($this->lang('file_access') . $path);
3035
- return false;
3036
- }
3037
-
3038
- // If a MIME type is not specified, try to work it out from the file name
3039
- if ($type == '') {
3040
- $type = self::filenameToType($path);
3041
- }
3042
-
3043
- $filename = basename($path);
3044
- if ($name == '') {
3045
- $name = $filename;
3046
- }
3047
-
3048
- // Append to $attachment array
3049
- $this->attachment[] = array(
3050
- 0 => $path,
3051
- 1 => $filename,
3052
- 2 => $name,
3053
- 3 => $encoding,
3054
- 4 => $type,
3055
- 5 => false, // isStringAttachment
3056
- 6 => $disposition,
3057
- 7 => $cid
3058
- );
3059
- return true;
3060
- }
3061
-
3062
- /**
3063
- * Add an embedded stringified attachment.
3064
- * This can include images, sounds, and just about any other document type.
3065
- * Be sure to set the $type to an image type for images:
3066
- * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
3067
- * @param string $string The attachment binary data.
3068
- * @param string $cid Content ID of the attachment; Use this to reference
3069
- * the content when using an embedded image in HTML.
3070
- * @param string $name
3071
- * @param string $encoding File encoding (see $Encoding).
3072
- * @param string $type MIME type.
3073
- * @param string $disposition Disposition to use
3074
- * @return boolean True on successfully adding an attachment
3075
- */
3076
- public function addStringEmbeddedImage(
3077
- $string,
3078
- $cid,
3079
- $name = '',
3080
- $encoding = 'base64',
3081
- $type = '',
3082
- $disposition = 'inline'
3083
- ) {
3084
- // If a MIME type is not specified, try to work it out from the name
3085
- if ($type == '' and !empty($name)) {
3086
- $type = self::filenameToType($name);
3087
- }
3088
-
3089
- // Append to $attachment array
3090
- $this->attachment[] = array(
3091
- 0 => $string,
3092
- 1 => $name,
3093
- 2 => $name,
3094
- 3 => $encoding,
3095
- 4 => $type,
3096
- 5 => true, // isStringAttachment
3097
- 6 => $disposition,
3098
- 7 => $cid
3099
- );
3100
- return true;
3101
- }
3102
-
3103
- /**
3104
- * Check if an inline attachment is present.
3105
- * @access public
3106
- * @return boolean
3107
- */
3108
- public function inlineImageExists()
3109
- {
3110
- foreach ($this->attachment as $attachment) {
3111
- if ($attachment[6] == 'inline') {
3112
- return true;
3113
- }
3114
- }
3115
- return false;
3116
- }
3117
-
3118
- /**
3119
- * Check if an attachment (non-inline) is present.
3120
- * @return boolean
3121
- */
3122
- public function attachmentExists()
3123
- {
3124
- foreach ($this->attachment as $attachment) {
3125
- if ($attachment[6] == 'attachment') {
3126
- return true;
3127
- }
3128
- }
3129
- return false;
3130
- }
3131
-
3132
- /**
3133
- * Check if this message has an alternative body set.
3134
- * @return boolean
3135
- */
3136
- public function alternativeExists()
3137
- {
3138
- return !empty($this->AltBody);
3139
- }
3140
-
3141
- /**
3142
- * Clear queued addresses of given kind.
3143
- * @access protected
3144
- * @param string $kind 'to', 'cc', or 'bcc'
3145
- * @return void
3146
- */
3147
- public function clearQueuedAddresses($kind)
3148
- {
3149
- $RecipientsQueue = $this->RecipientsQueue;
3150
- foreach ($RecipientsQueue as $address => $params) {
3151
- if ($params[0] == $kind) {
3152
- unset($this->RecipientsQueue[$address]);
3153
- }
3154
- }
3155
- }
3156
-
3157
- /**
3158
- * Clear all To recipients.
3159
- * @return void
3160
- */
3161
- public function clearAddresses()
3162
- {
3163
- foreach ($this->to as $to) {
3164
- unset($this->all_recipients[strtolower($to[0])]);
3165
- }
3166
- $this->to = array();
3167
- $this->clearQueuedAddresses('to');
3168
- }
3169
-
3170
- /**
3171
- * Clear all CC recipients.
3172
- * @return void
3173
- */
3174
- public function clearCCs()
3175
- {
3176
- foreach ($this->cc as $cc) {
3177
- unset($this->all_recipients[strtolower($cc[0])]);
3178
- }
3179
- $this->cc = array();
3180
- $this->clearQueuedAddresses('cc');
3181
- }
3182
-
3183
- /**
3184
- * Clear all BCC recipients.
3185
- * @return void
3186
- */
3187
- public function clearBCCs()
3188
- {
3189
- foreach ($this->bcc as $bcc) {
3190
- unset($this->all_recipients[strtolower($bcc[0])]);
3191
- }
3192
- $this->bcc = array();
3193
- $this->clearQueuedAddresses('bcc');
3194
- }
3195
-
3196
- /**
3197
- * Clear all ReplyTo recipients.
3198
- * @return void
3199
- */
3200
- public function clearReplyTos()
3201
- {
3202
- $this->ReplyTo = array();
3203
- $this->ReplyToQueue = array();
3204
- }
3205
-
3206
- /**
3207
- * Clear all recipient types.
3208
- * @return void
3209
- */
3210
- public function clearAllRecipients()
3211
- {
3212
- $this->to = array();
3213
- $this->cc = array();
3214
- $this->bcc = array();
3215
- $this->all_recipients = array();
3216
- $this->RecipientsQueue = array();
3217
- }
3218
-
3219
- /**
3220
- * Clear all filesystem, string, and binary attachments.
3221
- * @return void
3222
- */
3223
- public function clearAttachments()
3224
- {
3225
- $this->attachment = array();
3226
- }
3227
-
3228
- /**
3229
- * Clear all custom headers.
3230
- * @return void
3231
- */
3232
- public function clearCustomHeaders()
3233
- {
3234
- $this->CustomHeader = array();
3235
- }
3236
-
3237
- /**
3238
- * Add an error message to the error container.
3239
- * @access protected
3240
- * @param string $msg
3241
- * @return void
3242
- */
3243
- protected function setError($msg)
3244
- {
3245
- $this->error_count++;
3246
- if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
3247
- $lasterror = $this->smtp->getError();
3248
- if (!empty($lasterror['error'])) {
3249
- $msg .= $this->lang('smtp_error') . $lasterror['error'];
3250
- if (!empty($lasterror['detail'])) {
3251
- $msg .= ' Detail: '. $lasterror['detail'];
3252
- }
3253
- if (!empty($lasterror['smtp_code'])) {
3254
- $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
3255
- }
3256
- if (!empty($lasterror['smtp_code_ex'])) {
3257
- $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
3258
- }
3259
- }
3260
- }
3261
- $this->ErrorInfo = $msg;
3262
- }
3263
-
3264
- /**
3265
- * Return an RFC 822 formatted date.
3266
- * @access public
3267
- * @return string
3268
- * @static
3269
- */
3270
- public static function rfcDate()
3271
- {
3272
- // Set the time zone to whatever the default is to avoid 500 errors
3273
- // Will default to UTC if it's not set properly in php.ini
3274
- date_default_timezone_set(@date_default_timezone_get());
3275
- return date('D, j M Y H:i:s O');
3276
- }
3277
-
3278
- /**
3279
- * Get the server hostname.
3280
- * Returns 'localhost.localdomain' if unknown.
3281
- * @access protected
3282
- * @return string
3283
- */
3284
- protected function serverHostname()
3285
- {
3286
- $result = 'localhost.localdomain';
3287
- if (!empty($this->Hostname)) {
3288
- $result = $this->Hostname;
3289
- } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
3290
- $result = $_SERVER['SERVER_NAME'];
3291
- } elseif (function_exists('gethostname') && gethostname() !== false) {
3292
- $result = gethostname();
3293
- } elseif (php_uname('n') !== false) {
3294
- $result = php_uname('n');
3295
- }
3296
- return $result;
3297
- }
3298
-
3299
- /**
3300
- * Get an error message in the current language.
3301
- * @access protected
3302
- * @param string $key
3303
- * @return string
3304
- */
3305
- protected function lang($key)
3306
- {
3307
- if (count($this->language) < 1) {
3308
- $this->setLanguage('en'); // set the default language
3309
- }
3310
-
3311
- if (array_key_exists($key, $this->language)) {
3312
- if ($key == 'smtp_connect_failed') {
3313
- //Include a link to troubleshooting docs on SMTP connection failure
3314
- //this is by far the biggest cause of support questions
3315
- //but it's usually not PHPMailer's fault.
3316
- return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
3317
- }
3318
- return $this->language[$key];
3319
- } else {
3320
- //Return the key as a fallback
3321
- return $key;
3322
- }
3323
- }
3324
-
3325
- /**
3326
- * Check if an error occurred.
3327
- * @access public
3328
- * @return boolean True if an error did occur.
3329
- */
3330
- public function isError()
3331
- {
3332
- return ($this->error_count > 0);
3333
- }
3334
-
3335
- /**
3336
- * Ensure consistent line endings in a string.
3337
- * Changes every end of line from CRLF, CR or LF to $this->LE.
3338
- * @access public
3339
- * @param string $str String to fixEOL
3340
- * @return string
3341
- */
3342
- public function fixEOL($str)
3343
- {
3344
- // Normalise to \n
3345
- $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
3346
- // Now convert LE as needed
3347
- if ($this->LE !== "\n") {
3348
- $nstr = str_replace("\n", $this->LE, $nstr);
3349
- }
3350
- return $nstr;
3351
- }
3352
-
3353
- /**
3354
- * Add a custom header.
3355
- * $name value can be overloaded to contain
3356
- * both header name and value (name:value)
3357
- * @access public
3358
- * @param string $name Custom header name
3359
- * @param string $value Header value
3360
- * @return void
3361
- */
3362
- public function addCustomHeader($name, $value = null)
3363
- {
3364
- if ($value === null) {
3365
- // Value passed in as name:value
3366
- $this->CustomHeader[] = explode(':', $name, 2);
3367
- } else {
3368
- $this->CustomHeader[] = array($name, $value);
3369
- }
3370
- }
3371
-
3372
- /**
3373
- * Returns all custom headers.
3374
- * @return array
3375
- */
3376
- public function getCustomHeaders()
3377
- {
3378
- return $this->CustomHeader;
3379
- }
3380
-
3381
- /**
3382
- * Create a message body from an HTML string.
3383
- * Automatically inlines images and creates a plain-text version by converting the HTML,
3384
- * overwriting any existing values in Body and AltBody.
3385
- * Do not source $message content from user input!
3386
- * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
3387
- * will look for an image file in $basedir/images/a.png and convert it to inline.
3388
- * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
3389
- * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
3390
- * @access public
3391
- * @param string $message HTML message string
3392
- * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
3393
- * @param boolean|callable $advanced Whether to use the internal HTML to text converter
3394
- * or your own custom converter @see PHPMailer::html2text()
3395
- * @return string $message The transformed message Body
3396
- */
3397
- public function msgHTML($message, $basedir = '', $advanced = false)
3398
- {
3399
- preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
3400
- if (array_key_exists(2, $images)) {
3401
- if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
3402
- // Ensure $basedir has a trailing /
3403
- $basedir .= '/';
3404
- }
3405
- foreach ($images[2] as $imgindex => $url) {
3406
- // Convert data URIs into embedded images
3407
- if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
3408
- $data = substr($url, strpos($url, ','));
3409
- if ($match[2]) {
3410
- $data = base64_decode($data);
3411
- } else {
3412
- $data = rawurldecode($data);
3413
- }
3414
- $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
3415
- if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
3416
- $message = str_replace(
3417
- $images[0][$imgindex],
3418
- $images[1][$imgindex] . '="cid:' . $cid . '"',
3419
- $message
3420
- );
3421
- }
3422
- continue;
3423
- }
3424
- if (
3425
- // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
3426
- !empty($basedir)
3427
- // Ignore URLs containing parent dir traversal (..)
3428
- && (strpos($url, '..') === false)
3429
- // Do not change urls that are already inline images
3430
- && substr($url, 0, 4) !== 'cid:'
3431
- // Do not change absolute URLs, including anonymous protocol
3432
- && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
3433
- ) {
3434
- $filename = basename($url);
3435
- $directory = dirname($url);
3436
- if ($directory == '.') {
3437
- $directory = '';
3438
- }
3439
- $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
3440
- if (strlen($directory) > 1 && substr($directory, -1) != '/') {
3441
- $directory .= '/';
3442
- }
3443
- if ($this->addEmbeddedImage(
3444
- $basedir . $directory . $filename,
3445
- $cid,
3446
- $filename,
3447
- 'base64',
3448
- self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
3449
- )
3450
- ) {
3451
- $message = preg_replace(
3452
- '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
3453
- $images[1][$imgindex] . '="cid:' . $cid . '"',
3454
- $message
3455
- );
3456
- }
3457
- }
3458
- }
3459
- }
3460
- $this->isHTML(true);
3461
- // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
3462
- $this->Body = $this->normalizeBreaks($message);
3463
- $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
3464
- if (!$this->alternativeExists()) {
3465
- $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
3466
- self::CRLF . self::CRLF;
3467
- }
3468
- return $this->Body;
3469
- }
3470
-
3471
- /**
3472
- * Convert an HTML string into plain text.
3473
- * This is used by msgHTML().
3474
- * Note - older versions of this function used a bundled advanced converter
3475
- * which was been removed for license reasons in #232.
3476
- * Example usage:
3477
- * <code>
3478
- * // Use default conversion
3479
- * $plain = $mail->html2text($html);
3480
- * // Use your own custom converter
3481
- * $plain = $mail->html2text($html, function($html) {
3482
- * $converter = new MyHtml2text($html);
3483
- * return $converter->get_text();
3484
- * });
3485
- * </code>
3486
- * @param string $html The HTML text to convert
3487
- * @param boolean|callable $advanced Any boolean value to use the internal converter,
3488
- * or provide your own callable for custom conversion.
3489
- * @return string
3490
- */
3491
- public function html2text($html, $advanced = false)
3492
- {
3493
- if (is_callable($advanced)) {
3494
- return call_user_func($advanced, $html);
3495
- }
3496
- return html_entity_decode(
3497
- trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
3498
- ENT_QUOTES,
3499
- $this->CharSet
3500
- );
3501
- }
3502
-
3503
- /**
3504
- * Get the MIME type for a file extension.
3505
- * @param string $ext File extension
3506
- * @access public
3507
- * @return string MIME type of file.
3508
- * @static
3509
- */
3510
- public static function _mime_types($ext = '')
3511
- {
3512
- $mimes = array(
3513
- 'xl' => 'application/excel',
3514
- 'js' => 'application/javascript',
3515
- 'hqx' => 'application/mac-binhex40',
3516
- 'cpt' => 'application/mac-compactpro',
3517
- 'bin' => 'application/macbinary',
3518
- 'doc' => 'application/msword',
3519
- 'word' => 'application/msword',
3520
- 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
3521
- 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
3522
- 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
3523
- 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
3524
- 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
3525
- 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
3526
- 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
3527
- 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
3528
- 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
3529
- 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
3530
- 'class' => 'application/octet-stream',
3531
- 'dll' => 'application/octet-stream',
3532
- 'dms' => 'application/octet-stream',
3533
- 'exe' => 'application/octet-stream',
3534
- 'lha' => 'application/octet-stream',
3535
- 'lzh' => 'application/octet-stream',
3536
- 'psd' => 'application/octet-stream',
3537
- 'sea' => 'application/octet-stream',
3538
- 'so' => 'application/octet-stream',
3539
- 'oda' => 'application/oda',
3540
- 'pdf' => 'application/pdf',
3541
- 'ai' => 'application/postscript',
3542
- 'eps' => 'application/postscript',
3543
- 'ps' => 'application/postscript',
3544
- 'smi' => 'application/smil',
3545
- 'smil' => 'application/smil',
3546
- 'mif' => 'application/vnd.mif',
3547
- 'xls' => 'application/vnd.ms-excel',
3548
- 'ppt' => 'application/vnd.ms-powerpoint',
3549
- 'wbxml' => 'application/vnd.wap.wbxml',
3550
- 'wmlc' => 'application/vnd.wap.wmlc',
3551
- 'dcr' => 'application/x-director',
3552
- 'dir' => 'application/x-director',
3553
- 'dxr' => 'application/x-director',
3554
- 'dvi' => 'application/x-dvi',
3555
- 'gtar' => 'application/x-gtar',
3556
- 'php3' => 'application/x-httpd-php',
3557
- 'php4' => 'application/x-httpd-php',
3558
- 'php' => 'application/x-httpd-php',
3559
- 'phtml' => 'application/x-httpd-php',
3560
- 'phps' => 'application/x-httpd-php-source',
3561
- 'swf' => 'application/x-shockwave-flash',
3562
- 'sit' => 'application/x-stuffit',
3563
- 'tar' => 'application/x-tar',
3564
- 'tgz' => 'application/x-tar',
3565
- 'xht' => 'application/xhtml+xml',
3566
- 'xhtml' => 'application/xhtml+xml',
3567
- 'zip' => 'application/zip',
3568
- 'mid' => 'audio/midi',
3569
- 'midi' => 'audio/midi',
3570
- 'mp2' => 'audio/mpeg',
3571
- 'mp3' => 'audio/mpeg',
3572
- 'mpga' => 'audio/mpeg',
3573
- 'aif' => 'audio/x-aiff',
3574
- 'aifc' => 'audio/x-aiff',
3575
- 'aiff' => 'audio/x-aiff',
3576
- 'ram' => 'audio/x-pn-realaudio',
3577
- 'rm' => 'audio/x-pn-realaudio',
3578
- 'rpm' => 'audio/x-pn-realaudio-plugin',
3579
- 'ra' => 'audio/x-realaudio',
3580
- 'wav' => 'audio/x-wav',
3581
- 'bmp' => 'image/bmp',
3582
- 'gif' => 'image/gif',
3583
- 'jpeg' => 'image/jpeg',
3584
- 'jpe' => 'image/jpeg',
3585
- 'jpg' => 'image/jpeg',
3586
- 'png' => 'image/png',
3587
- 'tiff' => 'image/tiff',
3588
- 'tif' => 'image/tiff',
3589
- 'eml' => 'message/rfc822',
3590
- 'css' => 'text/css',
3591
- 'html' => 'text/html',
3592
- 'htm' => 'text/html',
3593
- 'shtml' => 'text/html',
3594
- 'log' => 'text/plain',
3595
- 'text' => 'text/plain',
3596
- 'txt' => 'text/plain',
3597
- 'rtx' => 'text/richtext',
3598
- 'rtf' => 'text/rtf',
3599
- 'vcf' => 'text/vcard',
3600
- 'vcard' => 'text/vcard',
3601
- 'xml' => 'text/xml',
3602
- 'xsl' => 'text/xml',
3603
- 'mpeg' => 'video/mpeg',
3604
- 'mpe' => 'video/mpeg',
3605
- 'mpg' => 'video/mpeg',
3606
- 'mov' => 'video/quicktime',
3607
- 'qt' => 'video/quicktime',
3608
- 'rv' => 'video/vnd.rn-realvideo',
3609
- 'avi' => 'video/x-msvideo',
3610
- 'movie' => 'video/x-sgi-movie'
3611
- );
3612
- if (array_key_exists(strtolower($ext), $mimes)) {
3613
- return $mimes[strtolower($ext)];
3614
- }
3615
- return 'application/octet-stream';
3616
- }
3617
-
3618
- /**
3619
- * Map a file name to a MIME type.
3620
- * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
3621
- * @param string $filename A file name or full path, does not need to exist as a file
3622
- * @return string
3623
- * @static
3624
- */
3625
- public static function filenameToType($filename)
3626
- {
3627
- // In case the path is a URL, strip any query string before getting extension
3628
- $qpos = strpos($filename, '?');
3629
- if (false !== $qpos) {
3630
- $filename = substr($filename, 0, $qpos);
3631
- }
3632
- $pathinfo = self::mb_pathinfo($filename);
3633
- return self::_mime_types($pathinfo['extension']);
3634
- }
3635
-
3636
- /**
3637
- * Multi-byte-safe pathinfo replacement.
3638
- * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
3639
- * Works similarly to the one in PHP >= 5.2.0
3640
- * @link http://www.php.net/manual/en/function.pathinfo.php#107461
3641
- * @param string $path A filename or path, does not need to exist as a file
3642
- * @param integer|string $options Either a PATHINFO_* constant,
3643
- * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
3644
- * @return string|array
3645
- * @static
3646
- */
3647
- public static function mb_pathinfo($path, $options = null)
3648
- {
3649
- $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
3650
- $pathinfo = array();
3651
- if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
3652
- if (array_key_exists(1, $pathinfo)) {
3653
- $ret['dirname'] = $pathinfo[1];
3654
- }
3655
- if (array_key_exists(2, $pathinfo)) {
3656
- $ret['basename'] = $pathinfo[2];
3657
- }
3658
- if (array_key_exists(5, $pathinfo)) {
3659
- $ret['extension'] = $pathinfo[5];
3660
- }
3661
- if (array_key_exists(3, $pathinfo)) {
3662
- $ret['filename'] = $pathinfo[3];
3663
- }
3664
- }
3665
- switch ($options) {
3666
- case PATHINFO_DIRNAME:
3667
- case 'dirname':
3668
- return $ret['dirname'];
3669
- case PATHINFO_BASENAME:
3670
- case 'basename':
3671
- return $ret['basename'];
3672
- case PATHINFO_EXTENSION:
3673
- case 'extension':
3674
- return $ret['extension'];
3675
- case PATHINFO_FILENAME:
3676
- case 'filename':
3677
- return $ret['filename'];
3678
- default:
3679
- return $ret;
3680
- }
3681
- }
3682
-
3683
- /**
3684
- * Set or reset instance properties.
3685
- * You should avoid this function - it's more verbose, less efficient, more error-prone and
3686
- * harder to debug than setting properties directly.
3687
- * Usage Example:
3688
- * `$mail->set('SMTPSecure', 'tls');`
3689
- * is the same as:
3690
- * `$mail->SMTPSecure = 'tls';`
3691
- * @access public
3692
- * @param string $name The property name to set
3693
- * @param mixed $value The value to set the property to
3694
- * @return boolean
3695
- * @TODO Should this not be using the __set() magic function?
3696
- */
3697
- public function set($name, $value = '')
3698
- {
3699
- if (property_exists($this, $name)) {
3700
- $this->$name = $value;
3701
- return true;
3702
- } else {
3703
- $this->setError($this->lang('variable_set') . $name);
3704
- return false;
3705
- }
3706
- }
3707
-
3708
- /**
3709
- * Strip newlines to prevent header injection.
3710
- * @access public
3711
- * @param string $str
3712
- * @return string
3713
- */
3714
- public function secureHeader($str)
3715
- {
3716
- return trim(str_replace(array("\r", "\n"), '', $str));
3717
- }
3718
-
3719
- /**
3720
- * Normalize line breaks in a string.
3721
- * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
3722
- * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
3723
- * @param string $text
3724
- * @param string $breaktype What kind of line break to use, defaults to CRLF
3725
- * @return string
3726
- * @access public
3727
- * @static
3728
- */
3729
- public static function normalizeBreaks($text, $breaktype = "\r\n")
3730
- {
3731
- return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
3732
- }
3733
-
3734
- /**
3735
- * Set the public and private key files and password for S/MIME signing.
3736
- * @access public
3737
- * @param string $cert_filename
3738
- * @param string $key_filename
3739
- * @param string $key_pass Password for private key
3740
- * @param string $extracerts_filename Optional path to chain certificate
3741
- */
3742
- public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
3743
- {
3744
- $this->sign_cert_file = $cert_filename;
3745
- $this->sign_key_file = $key_filename;
3746
- $this->sign_key_pass = $key_pass;
3747
- $this->sign_extracerts_file = $extracerts_filename;
3748
- }
3749
-
3750
- /**
3751
- * Quoted-Printable-encode a DKIM header.
3752
- * @access public
3753
- * @param string $txt
3754
- * @return string
3755
- */
3756
- public function DKIM_QP($txt)
3757
- {
3758
- $line = '';
3759
- for ($i = 0; $i < strlen($txt); $i++) {
3760
- $ord = ord($txt[$i]);
3761
- if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
3762
- $line .= $txt[$i];
3763
- } else {
3764
- $line .= '=' . sprintf('%02X', $ord);
3765
- }
3766
- }
3767
- return $line;
3768
- }
3769
-
3770
- /**
3771
- * Generate a DKIM signature.
3772
- * @access public
3773
- * @param string $signHeader
3774
- * @throws phpmailerException
3775
- * @return string The DKIM signature value
3776
- */
3777
- public function DKIM_Sign($signHeader)
3778
- {
3779
- if (!defined('PKCS7_TEXT')) {
3780
- if ($this->exceptions) {
3781
- throw new phpmailerException($this->lang('extension_missing') . 'openssl');
3782
- }
3783
- return '';
3784
- }
3785
- $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
3786
- if ('' != $this->DKIM_passphrase) {
3787
- $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
3788
- } else {
3789
- $privKey = openssl_pkey_get_private($privKeyStr);
3790
- }
3791
- //Workaround for missing digest algorithms in old PHP & OpenSSL versions
3792
- //@link http://stackoverflow.com/a/11117338/333340
3793
- if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
3794
- in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
3795
- if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
3796
- openssl_pkey_free($privKey);
3797
- return base64_encode($signature);
3798
- }
3799
- } else {
3800
- $pinfo = openssl_pkey_get_details($privKey);
3801
- $hash = hash('sha256', $signHeader);
3802
- //'Magic' constant for SHA256 from RFC3447
3803
- //@link https://tools.ietf.org/html/rfc3447#page-43
3804
- $t = '3031300d060960864801650304020105000420' . $hash;
3805
- $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
3806
- $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);
3807
-
3808
- if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
3809
- openssl_pkey_free($privKey);
3810
- return base64_encode($signature);
3811
- }
3812
- }
3813
- openssl_pkey_free($privKey);
3814
- return '';
3815
- }
3816
-
3817
- /**
3818
- * Generate a DKIM canonicalization header.
3819
- * @access public
3820
- * @param string $signHeader Header
3821
- * @return string
3822
- */
3823
- public function DKIM_HeaderC($signHeader)
3824
- {
3825
- $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
3826
- $lines = explode("\r\n", $signHeader);
3827
- foreach ($lines as $key => $line) {
3828
- list($heading, $value) = explode(':', $line, 2);
3829
- $heading = strtolower($heading);
3830
- $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
3831
- $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
3832
- }
3833
- $signHeader = implode("\r\n", $lines);
3834
- return $signHeader;
3835
- }
3836
-
3837
- /**
3838
- * Generate a DKIM canonicalization body.
3839
- * @access public
3840
- * @param string $body Message Body
3841
- * @return string
3842
- */
3843
- public function DKIM_BodyC($body)
3844
- {
3845
- if ($body == '') {
3846
- return "\r\n";
3847
- }
3848
- // stabilize line endings
3849
- $body = str_replace("\r\n", "\n", $body);
3850
- $body = str_replace("\n", "\r\n", $body);
3851
- // END stabilize line endings
3852
- while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
3853
- $body = substr($body, 0, strlen($body) - 2);
3854
- }
3855
- return $body;
3856
- }
3857
-
3858
- /**
3859
- * Create the DKIM header and body in a new message header.
3860
- * @access public
3861
- * @param string $headers_line Header lines
3862
- * @param string $subject Subject
3863
- * @param string $body Body
3864
- * @return string
3865
- */
3866
- public function DKIM_Add($headers_line, $subject, $body)
3867
- {
3868
- $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
3869
- $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
3870
- $DKIMquery = 'dns/txt'; // Query method
3871
- $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
3872
- $subject_header = "Subject: $subject";
3873
- $headers = explode($this->LE, $headers_line);
3874
- $from_header = '';
3875
- $to_header = '';
3876
- $date_header = '';
3877
- $current = '';
3878
- foreach ($headers as $header) {
3879
- if (strpos($header, 'From:') === 0) {
3880
- $from_header = $header;
3881
- $current = 'from_header';
3882
- } elseif (strpos($header, 'To:') === 0) {
3883
- $to_header = $header;
3884
- $current = 'to_header';
3885
- } elseif (strpos($header, 'Date:') === 0) {
3886
- $date_header = $header;
3887
- $current = 'date_header';
3888
- } else {
3889
- if (!empty($$current) && strpos($header, ' =?') === 0) {
3890
- $$current .= $header;
3891
- } else {
3892
- $current = '';
3893
- }
3894
- }
3895
- }
3896
- $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
3897
- $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
3898
- $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
3899
- $subject = str_replace(
3900
- '|',
3901
- '=7C',
3902
- $this->DKIM_QP($subject_header)
3903
- ); // Copied header fields (dkim-quoted-printable)
3904
- $body = $this->DKIM_BodyC($body);
3905
- $DKIMlen = strlen($body); // Length of body
3906
- $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
3907
- if ('' == $this->DKIM_identity) {
3908
- $ident = '';
3909
- } else {
3910
- $ident = ' i=' . $this->DKIM_identity . ';';
3911
- }
3912
- $dkimhdrs = 'DKIM-Signature: v=1; a=' .
3913
- $DKIMsignatureType . '; q=' .
3914
- $DKIMquery . '; l=' .
3915
- $DKIMlen . '; s=' .
3916
- $this->DKIM_selector .
3917
- ";\r\n" .
3918
- "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
3919
- "\th=From:To:Date:Subject;\r\n" .
3920
- "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
3921
- "\tz=$from\r\n" .
3922
- "\t|$to\r\n" .
3923
- "\t|$date\r\n" .
3924
- "\t|$subject;\r\n" .
3925
- "\tbh=" . $DKIMb64 . ";\r\n" .
3926
- "\tb=";
3927
- $toSign = $this->DKIM_HeaderC(
3928
- $from_header . "\r\n" .
3929
- $to_header . "\r\n" .
3930
- $date_header . "\r\n" .
3931
- $subject_header . "\r\n" .
3932
- $dkimhdrs
3933
- );
3934
- $signed = $this->DKIM_Sign($toSign);
3935
- return $dkimhdrs . $signed . "\r\n";
3936
- }
3937
-
3938
- /**
3939
- * Detect if a string contains a line longer than the maximum line length allowed.
3940
- * @param string $str
3941
- * @return boolean
3942
- * @static
3943
- */
3944
- public static function hasLineLongerThanMax($str)
3945
- {
3946
- //+2 to include CRLF line break for a 1000 total
3947
- return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
3948
- }
3949
-
3950
- /**
3951
- * Allows for public read access to 'to' property.
3952
- * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
3953
- * @access public
3954
- * @return array
3955
- */
3956
- public function getToAddresses()
3957
- {
3958
- return $this->to;
3959
- }
3960
-
3961
- /**
3962
- * Allows for public read access to 'cc' property.
3963
- * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
3964
- * @access public
3965
- * @return array
3966
- */
3967
- public function getCcAddresses()
3968
- {
3969
- return $this->cc;
3970
- }
3971
-
3972
- /**
3973
- * Allows for public read access to 'bcc' property.
3974
- * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
3975
- * @access public
3976
- * @return array
3977
- */
3978
- public function getBccAddresses()
3979
- {
3980
- return $this->bcc;
3981
- }
3982
-
3983
- /**
3984
- * Allows for public read access to 'ReplyTo' property.
3985
- * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
3986
- * @access public
3987
- * @return array
3988
- */
3989
- public function getReplyToAddresses()
3990
- {
3991
- return $this->ReplyTo;
3992
- }
3993
-
3994
- /**
3995
- * Allows for public read access to 'all_recipients' property.
3996
- * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
3997
- * @access public
3998
- * @return array
3999
- */
4000
- public function getAllRecipientAddresses()
4001
- {
4002
- return $this->all_recipients;
4003
- }
4004
-
4005
- /**
4006
- * Perform a callback.
4007
- * @param boolean $isSent
4008
- * @param array $to
4009
- * @param array $cc
4010
- * @param array $bcc
4011
- * @param string $subject
4012
- * @param string $body
4013
- * @param string $from
4014
- */
4015
- protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
4016
- {
4017
- if (!empty($this->action_function) && is_callable($this->action_function)) {
4018
- $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
4019
- call_user_func_array($this->action_function, $params);
4020
- }
4021
- }
4022
- }
4023
-
4024
- /**
4025
- * PHPMailer exception handler
4026
- * @package PHPMailer
4027
- */
4028
- class phpmailerException extends Exception
4029
- {
4030
- /**
4031
- * Prettify error message output
4032
- * @return string
4033
- */
4034
- public function errorMessage()
4035
- {
4036
- $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";
4037
- return $errorMsg;
4038
- }
4039
- }
1
+ <?php
2
+ /**
3
+ * PHPMailer - PHP email creation and transport class.
4
+ * PHP Version 5
5
+ * @package PHPMailer
6
+ * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
7
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
+ * @author Brent R. Matzelle (original founder)
11
+ * @copyright 2012 - 2014 Marcus Bointon
12
+ * @copyright 2010 - 2012 Jim Jagielski
13
+ * @copyright 2004 - 2009 Andy Prevost
14
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
16
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
+ * FITNESS FOR A PARTICULAR PURPOSE.
18
+ */
19
+
20
+ /**
21
+ * PHPMailer - PHP email creation and transport class.
22
+ * @package PHPMailer
23
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
24
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
25
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
26
+ * @author Brent R. Matzelle (original founder)
27
+ */
28
+ class PHPMailer
29
+ {
30
+ /**
31
+ * The PHPMailer Version number.
32
+ * @var string
33
+ */
34
+ public $Version = '5.2.22';
35
+
36
+ /**
37
+ * Email priority.
38
+ * Options: null (default), 1 = High, 3 = Normal, 5 = low.
39
+ * When null, the header is not set at all.
40
+ * @var integer
41
+ */
42
+ public $Priority = null;
43
+
44
+ /**
45
+ * The character set of the message.
46
+ * @var string
47
+ */
48
+ public $CharSet = 'iso-8859-1';
49
+
50
+ /**
51
+ * The MIME Content-type of the message.
52
+ * @var string
53
+ */
54
+ public $ContentType = 'text/plain';
55
+
56
+ /**
57
+ * The message encoding.
58
+ * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
59
+ * @var string
60
+ */
61
+ public $Encoding = '8bit';
62
+
63
+ /**
64
+ * Holds the most recent mailer error message.
65
+ * @var string
66
+ */
67
+ public $ErrorInfo = '';
68
+
69
+ /**
70
+ * The From email address for the message.
71
+ * @var string
72
+ */
73
+ public $From = 'root@localhost';
74
+
75
+ /**
76
+ * The From name of the message.
77
+ * @var string
78
+ */
79
+ public $FromName = 'Root User';
80
+
81
+ /**
82
+ * The Sender email (Return-Path) of the message.
83
+ * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
84
+ * @var string
85
+ */
86
+ public $Sender = '';
87
+
88
+ /**
89
+ * The Return-Path of the message.
90
+ * If empty, it will be set to either From or Sender.
91
+ * @var string
92
+ * @deprecated Email senders should never set a return-path header;
93
+ * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
94
+ * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
95
+ */
96
+ public $ReturnPath = '';
97
+
98
+ /**
99
+ * The Subject of the message.
100
+ * @var string
101
+ */
102
+ public $Subject = '';
103
+
104
+ /**
105
+ * An HTML or plain text message body.
106
+ * If HTML then call isHTML(true).
107
+ * @var string
108
+ */
109
+ public $Body = '';
110
+
111
+ /**
112
+ * The plain-text message body.
113
+ * This body can be read by mail clients that do not have HTML email
114
+ * capability such as mutt & Eudora.
115
+ * Clients that can read HTML will view the normal Body.
116
+ * @var string
117
+ */
118
+ public $AltBody = '';
119
+
120
+ /**
121
+ * An iCal message part body.
122
+ * Only supported in simple alt or alt_inline message types
123
+ * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
124
+ * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
125
+ * @link http://kigkonsult.se/iCalcreator/
126
+ * @var string
127
+ */
128
+ public $Ical = '';
129
+
130
+ /**
131
+ * The complete compiled MIME message body.
132
+ * @access protected
133
+ * @var string
134
+ */
135
+ protected $MIMEBody = '';
136
+
137
+ /**
138
+ * The complete compiled MIME message headers.
139
+ * @var string
140
+ * @access protected
141
+ */
142
+ protected $MIMEHeader = '';
143
+
144
+ /**
145
+ * Extra headers that createHeader() doesn't fold in.
146
+ * @var string
147
+ * @access protected
148
+ */
149
+ protected $mailHeader = '';
150
+
151
+ /**
152
+ * Word-wrap the message body to this number of chars.
153
+ * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
154
+ * @var integer
155
+ */
156
+ public $WordWrap = 0;
157
+
158
+ /**
159
+ * Which method to use to send mail.
160
+ * Options: "mail", "sendmail", or "smtp".
161
+ * @var string
162
+ */
163
+ public $Mailer = 'mail';
164
+
165
+ /**
166
+ * The path to the sendmail program.
167
+ * @var string
168
+ */
169
+ public $Sendmail = '/usr/sbin/sendmail';
170
+
171
+ /**
172
+ * Whether mail() uses a fully sendmail-compatible MTA.
173
+ * One which supports sendmail's "-oi -f" options.
174
+ * @var boolean
175
+ */
176
+ public $UseSendmailOptions = true;
177
+
178
+ /**
179
+ * Path to PHPMailer plugins.
180
+ * Useful if the SMTP class is not in the PHP include path.
181
+ * @var string
182
+ * @deprecated Should not be needed now there is an autoloader.
183
+ */
184
+ public $PluginDir = '';
185
+
186
+ /**
187
+ * The email address that a reading confirmation should be sent to, also known as read receipt.
188
+ * @var string
189
+ */
190
+ public $ConfirmReadingTo = '';
191
+
192
+ /**
193
+ * The hostname to use in the Message-ID header and as default HELO string.
194
+ * If empty, PHPMailer attempts to find one with, in order,
195
+ * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
196
+ * 'localhost.localdomain'.
197
+ * @var string
198
+ */
199
+ public $Hostname = '';
200
+
201
+ /**
202
+ * An ID to be used in the Message-ID header.
203
+ * If empty, a unique id will be generated.
204
+ * You can set your own, but it must be in the format "<id@domain>",
205
+ * as defined in RFC5322 section 3.6.4 or it will be ignored.
206
+ * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
207
+ * @var string
208
+ */
209
+ public $MessageID = '';
210
+
211
+ /**
212
+ * The message Date to be used in the Date header.
213
+ * If empty, the current date will be added.
214
+ * @var string
215
+ */
216
+ public $MessageDate = '';
217
+
218
+ /**
219
+ * SMTP hosts.
220
+ * Either a single hostname or multiple semicolon-delimited hostnames.
221
+ * You can also specify a different port
222
+ * for each host by using this format: [hostname:port]
223
+ * (e.g. "smtp1.example.com:25;smtp2.example.com").
224
+ * You can also specify encryption type, for example:
225
+ * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
226
+ * Hosts will be tried in order.
227
+ * @var string
228
+ */
229
+ public $Host = 'localhost';
230
+
231
+ /**
232
+ * The default SMTP server port.
233
+ * @var integer
234
+ * @TODO Why is this needed when the SMTP class takes care of it?
235
+ */
236
+ public $Port = 25;
237
+
238
+ /**
239
+ * The SMTP HELO of the message.
240
+ * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
241
+ * one with the same method described above for $Hostname.
242
+ * @var string
243
+ * @see PHPMailer::$Hostname
244
+ */
245
+ public $Helo = '';
246
+
247
+ /**
248
+ * What kind of encryption to use on the SMTP connection.
249
+ * Options: '', 'ssl' or 'tls'
250
+ * @var string
251
+ */
252
+ public $SMTPSecure = '';
253
+
254
+ /**
255
+ * Whether to enable TLS encryption automatically if a server supports it,
256
+ * even if `SMTPSecure` is not set to 'tls'.
257
+ * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
258
+ * @var boolean
259
+ */
260
+ public $SMTPAutoTLS = true;
261
+
262
+ /**
263
+ * Whether to use SMTP authentication.
264
+ * Uses the Username and Password properties.
265
+ * @var boolean
266
+ * @see PHPMailer::$Username
267
+ * @see PHPMailer::$Password
268
+ */
269
+ public $SMTPAuth = false;
270
+
271
+ /**
272
+ * Options array passed to stream_context_create when connecting via SMTP.
273
+ * @var array
274
+ */
275
+ public $SMTPOptions = array();
276
+
277
+ /**
278
+ * SMTP username.
279
+ * @var string
280
+ */
281
+ public $Username = '';
282
+
283
+ /**
284
+ * SMTP password.
285
+ * @var string
286
+ */
287
+ public $Password = '';
288
+
289
+ /**
290
+ * SMTP auth type.
291
+ * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
292
+ * @var string
293
+ */
294
+ public $AuthType = '';
295
+
296
+ /**
297
+ * SMTP realm.
298
+ * Used for NTLM auth
299
+ * @var string
300
+ */
301
+ public $Realm = '';
302
+
303
+ /**
304
+ * SMTP workstation.
305
+ * Used for NTLM auth
306
+ * @var string
307
+ */
308
+ public $Workstation = '';
309
+
310
+ /**
311
+ * The SMTP server timeout in seconds.
312
+ * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
313
+ * @var integer
314
+ */
315
+ public $Timeout = 300;
316
+
317
+ /**
318
+ * SMTP class debug output mode.
319
+ * Debug output level.
320
+ * Options:
321
+ * * `0` No output
322
+ * * `1` Commands
323
+ * * `2` Data and commands
324
+ * * `3` As 2 plus connection status
325
+ * * `4` Low-level data output
326
+ * @var integer
327
+ * @see SMTP::$do_debug
328
+ */
329
+ public $SMTPDebug = 0;
330
+
331
+ /**
332
+ * How to handle debug output.
333
+ * Options:
334
+ * * `echo` Output plain-text as-is, appropriate for CLI
335
+ * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
336
+ * * `error_log` Output to error log as configured in php.ini
337
+ *
338
+ * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
339
+ * <code>
340
+ * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
341
+ * </code>
342
+ * @var string|callable
343
+ * @see SMTP::$Debugoutput
344
+ */
345
+ public $Debugoutput = 'echo';
346
+
347
+ /**
348
+ * Whether to keep SMTP connection open after each message.
349
+ * If this is set to true then to close the connection
350
+ * requires an explicit call to smtpClose().
351
+ * @var boolean
352
+ */
353
+ public $SMTPKeepAlive = false;
354
+
355
+ /**
356
+ * Whether to split multiple to addresses into multiple messages
357
+ * or send them all in one message.
358
+ * Only supported in `mail` and `sendmail` transports, not in SMTP.
359
+ * @var boolean
360
+ */
361
+ public $SingleTo = false;
362
+
363
+ /**
364
+ * Storage for addresses when SingleTo is enabled.
365
+ * @var array
366
+ * @TODO This should really not be public
367
+ */
368
+ public $SingleToArray = array();
369
+
370
+ /**
371
+ * Whether to generate VERP addresses on send.
372
+ * Only applicable when sending via SMTP.
373
+ * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
374
+ * @link http://www.postfix.org/VERP_README.html Postfix VERP info
375
+ * @var boolean
376
+ */
377
+ public $do_verp = false;
378
+
379
+ /**
380
+ * Whether to allow sending messages with an empty body.
381
+ * @var boolean
382
+ */
383
+ public $AllowEmpty = false;
384
+
385
+ /**
386
+ * The default line ending.
387
+ * @note The default remains "\n". We force CRLF where we know
388
+ * it must be used via self::CRLF.
389
+ * @var string
390
+ */
391
+ public $LE = "\n";
392
+
393
+ /**
394
+ * DKIM selector.
395
+ * @var string
396
+ */
397
+ public $DKIM_selector = '';
398
+
399
+ /**
400
+ * DKIM Identity.
401
+ * Usually the email address used as the source of the email.
402
+ * @var string
403
+ */
404
+ public $DKIM_identity = '';
405
+
406
+ /**
407
+ * DKIM passphrase.
408
+ * Used if your key is encrypted.
409
+ * @var string
410
+ */
411
+ public $DKIM_passphrase = '';
412
+
413
+ /**
414
+ * DKIM signing domain name.
415
+ * @example 'example.com'
416
+ * @var string
417
+ */
418
+ public $DKIM_domain = '';
419
+
420
+ /**
421
+ * DKIM private key file path.
422
+ * @var string
423
+ */
424
+ public $DKIM_private = '';
425
+
426
+ /**
427
+ * DKIM private key string.
428
+ * If set, takes precedence over `$DKIM_private`.
429
+ * @var string
430
+ */
431
+ public $DKIM_private_string = '';
432
+
433
+ /**
434
+ * Callback Action function name.
435
+ *
436
+ * The function that handles the result of the send email action.
437
+ * It is called out by send() for each email sent.
438
+ *
439
+ * Value can be any php callable: http://www.php.net/is_callable
440
+ *
441
+ * Parameters:
442
+ * boolean $result result of the send action
443
+ * string $to email address of the recipient
444
+ * string $cc cc email addresses
445
+ * string $bcc bcc email addresses
446
+ * string $subject the subject
447
+ * string $body the email body
448
+ * string $from email address of sender
449
+ * @var string
450
+ */
451
+ public $action_function = '';
452
+
453
+ /**
454
+ * What to put in the X-Mailer header.
455
+ * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
456
+ * @var string
457
+ */
458
+ public $XMailer = '';
459
+
460
+ /**
461
+ * Which validator to use by default when validating email addresses.
462
+ * May be a callable to inject your own validator, but there are several built-in validators.
463
+ * @see PHPMailer::validateAddress()
464
+ * @var string|callable
465
+ * @static
466
+ */
467
+ public static $validator = 'auto';
468
+
469
+ /**
470
+ * An instance of the SMTP sender class.
471
+ * @var SMTP
472
+ * @access protected
473
+ */
474
+ protected $smtp = null;
475
+
476
+ /**
477
+ * The array of 'to' names and addresses.
478
+ * @var array
479
+ * @access protected
480
+ */
481
+ protected $to = array();
482
+
483
+ /**
484
+ * The array of 'cc' names and addresses.
485
+ * @var array
486
+ * @access protected
487
+ */
488
+ protected $cc = array();
489
+
490
+ /**
491
+ * The array of 'bcc' names and addresses.
492
+ * @var array
493
+ * @access protected
494
+ */
495
+ protected $bcc = array();
496
+
497
+ /**
498
+ * The array of reply-to names and addresses.
499
+ * @var array
500
+ * @access protected
501
+ */
502
+ protected $ReplyTo = array();
503
+
504
+ /**
505
+ * An array of all kinds of addresses.
506
+ * Includes all of $to, $cc, $bcc
507
+ * @var array
508
+ * @access protected
509
+ * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
510
+ */
511
+ protected $all_recipients = array();
512
+
513
+ /**
514
+ * An array of names and addresses queued for validation.
515
+ * In send(), valid and non duplicate entries are moved to $all_recipients
516
+ * and one of $to, $cc, or $bcc.
517
+ * This array is used only for addresses with IDN.
518
+ * @var array
519
+ * @access protected
520
+ * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
521
+ * @see PHPMailer::$all_recipients
522
+ */
523
+ protected $RecipientsQueue = array();
524
+
525
+ /**
526
+ * An array of reply-to names and addresses queued for validation.
527
+ * In send(), valid and non duplicate entries are moved to $ReplyTo.
528
+ * This array is used only for addresses with IDN.
529
+ * @var array
530
+ * @access protected
531
+ * @see PHPMailer::$ReplyTo
532
+ */
533
+ protected $ReplyToQueue = array();
534
+
535
+ /**
536
+ * The array of attachments.
537
+ * @var array
538
+ * @access protected
539
+ */
540
+ protected $attachment = array();
541
+
542
+ /**
543
+ * The array of custom headers.
544
+ * @var array
545
+ * @access protected
546
+ */
547
+ protected $CustomHeader = array();
548
+
549
+ /**
550
+ * The most recent Message-ID (including angular brackets).
551
+ * @var string
552
+ * @access protected
553
+ */
554
+ protected $lastMessageID = '';
555
+
556
+ /**
557
+ * The message's MIME type.
558
+ * @var string
559
+ * @access protected
560
+ */
561
+ protected $message_type = '';
562
+
563
+ /**
564
+ * The array of MIME boundary strings.
565
+ * @var array
566
+ * @access protected
567
+ */
568
+ protected $boundary = array();
569
+
570
+ /**
571
+ * The array of available languages.
572
+ * @var array
573
+ * @access protected
574
+ */
575
+ protected $language = array();
576
+
577
+ /**
578
+ * The number of errors encountered.
579
+ * @var integer
580
+ * @access protected
581
+ */
582
+ protected $error_count = 0;
583
+
584
+ /**
585
+ * The S/MIME certificate file path.
586
+ * @var string
587
+ * @access protected
588
+ */
589
+ protected $sign_cert_file = '';
590
+
591
+ /**
592
+ * The S/MIME key file path.
593
+ * @var string
594
+ * @access protected
595
+ */
596
+ protected $sign_key_file = '';
597
+
598
+ /**
599
+ * The optional S/MIME extra certificates ("CA Chain") file path.
600
+ * @var string
601
+ * @access protected
602
+ */
603
+ protected $sign_extracerts_file = '';
604
+
605
+ /**
606
+ * The S/MIME password for the key.
607
+ * Used only if the key is encrypted.
608
+ * @var string
609
+ * @access protected
610
+ */
611
+ protected $sign_key_pass = '';
612
+
613
+ /**
614
+ * Whether to throw exceptions for errors.
615
+ * @var boolean
616
+ * @access protected
617
+ */
618
+ protected $exceptions = false;
619
+
620
+ /**
621
+ * Unique ID used for message ID and boundaries.
622
+ * @var string
623
+ * @access protected
624
+ */
625
+ protected $uniqueid = '';
626
+
627
+ /**
628
+ * Error severity: message only, continue processing.
629
+ */
630
+ const STOP_MESSAGE = 0;
631
+
632
+ /**
633
+ * Error severity: message, likely ok to continue processing.
634
+ */
635
+ const STOP_CONTINUE = 1;
636
+
637
+ /**
638
+ * Error severity: message, plus full stop, critical error reached.
639
+ */
640
+ const STOP_CRITICAL = 2;
641
+
642
+ /**
643
+ * SMTP RFC standard line ending.
644
+ */
645
+ const CRLF = "\r\n";
646
+
647
+ /**
648
+ * The maximum line length allowed by RFC 2822 section 2.1.1
649
+ * @var integer
650
+ */
651
+ const MAX_LINE_LENGTH = 998;
652
+
653
+ /**
654
+ * Constructor.
655
+ * @param boolean $exceptions Should we throw external exceptions?
656
+ */
657
+ public function __construct($exceptions = null)
658
+ {
659
+ if ($exceptions !== null) {
660
+ $this->exceptions = (boolean)$exceptions;
661
+ }
662
+ }
663
+
664
+ /**
665
+ * Destructor.
666
+ */
667
+ public function __destruct()
668
+ {
669
+ //Close any open SMTP connection nicely
670
+ $this->smtpClose();
671
+ }
672
+
673
+ /**
674
+ * Call mail() in a safe_mode-aware fashion.
675
+ * Also, unless sendmail_path points to sendmail (or something that
676
+ * claims to be sendmail), don't pass params (not a perfect fix,
677
+ * but it will do)
678
+ * @param string $to To
679
+ * @param string $subject Subject
680
+ * @param string $body Message Body
681
+ * @param string $header Additional Header(s)
682
+ * @param string $params Params
683
+ * @access private
684
+ * @return boolean
685
+ */
686
+ private function mailPassthru($to, $subject, $body, $header, $params)
687
+ {
688
+ //Check overloading of mail function to avoid double-encoding
689
+ if (ini_get('mbstring.func_overload') & 1) {
690
+ $subject = $this->secureHeader($subject);
691
+ } else {
692
+ $subject = $this->encodeHeader($this->secureHeader($subject));
693
+ }
694
+
695
+ //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
696
+ //@link http://php.net/manual/en/function.mail.php
697
+ if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
698
+ $result = @mail($to, $subject, $body, $header);
699
+ } else {
700
+ $result = @mail($to, $subject, $body, $header, $params);
701
+ }
702
+ return $result;
703
+ }
704
+ /**
705
+ * Output debugging info via user-defined method.
706
+ * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
707
+ * @see PHPMailer::$Debugoutput
708
+ * @see PHPMailer::$SMTPDebug
709
+ * @param string $str
710
+ */
711
+ protected function edebug($str)
712
+ {
713
+ if ($this->SMTPDebug <= 0) {
714
+ return;
715
+ }
716
+ //Avoid clash with built-in function names
717
+ if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
718
+ call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
719
+ return;
720
+ }
721
+ switch ($this->Debugoutput) {
722
+ case 'error_log':
723
+ //Don't output, just log
724
+ error_log($str);
725
+ break;
726
+ case 'html':
727
+ //Cleans up output a bit for a better looking, HTML-safe output
728
+ echo htmlentities(
729
+ preg_replace('/[\r\n]+/', '', $str),
730
+ ENT_QUOTES,
731
+ 'UTF-8'
732
+ )
733
+ . "<br>\n";
734
+ break;
735
+ case 'echo':
736
+ default:
737
+ //Normalize line breaks
738
+ $str = preg_replace('/\r\n?/ms', "\n", $str);
739
+ echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
740
+ "\n",
741
+ "\n \t ",
742
+ trim($str)
743
+ ) . "\n";
744
+ }
745
+ }
746
+
747
+ /**
748
+ * Sets message type to HTML or plain.
749
+ * @param boolean $isHtml True for HTML mode.
750
+ * @return void
751
+ */
752
+ public function isHTML($isHtml = true)
753
+ {
754
+ if ($isHtml) {
755
+ $this->ContentType = 'text/html';
756
+ } else {
757
+ $this->ContentType = 'text/plain';
758
+ }
759
+ }
760
+
761
+ /**
762
+ * Send messages using SMTP.
763
+ * @return void
764
+ */
765
+ public function isSMTP()
766
+ {
767
+ $this->Mailer = 'smtp';
768
+ }
769
+
770
+ /**
771
+ * Send messages using PHP's mail() function.
772
+ * @return void
773
+ */
774
+ public function isMail()
775
+ {
776
+ $this->Mailer = 'mail';
777
+ }
778
+
779
+ /**
780
+ * Send messages using $Sendmail.
781
+ * @return void
782
+ */
783
+ public function isSendmail()
784
+ {
785
+ $ini_sendmail_path = ini_get('sendmail_path');
786
+
787
+ if (!stristr($ini_sendmail_path, 'sendmail')) {
788
+ $this->Sendmail = '/usr/sbin/sendmail';
789
+ } else {
790
+ $this->Sendmail = $ini_sendmail_path;
791
+ }
792
+ $this->Mailer = 'sendmail';
793
+ }
794
+
795
+ /**
796
+ * Send messages using qmail.
797
+ * @return void
798
+ */
799
+ public function isQmail()
800
+ {
801
+ $ini_sendmail_path = ini_get('sendmail_path');
802
+
803
+ if (!stristr($ini_sendmail_path, 'qmail')) {
804
+ $this->Sendmail = '/var/qmail/bin/qmail-inject';
805
+ } else {
806
+ $this->Sendmail = $ini_sendmail_path;
807
+ }
808
+ $this->Mailer = 'qmail';
809
+ }
810
+
811
+ /**
812
+ * Add a "To" address.
813
+ * @param string $address The email address to send to
814
+ * @param string $name
815
+ * @return boolean true on success, false if address already used or invalid in some way
816
+ */
817
+ public function addAddress($address, $name = '')
818
+ {
819
+ return $this->addOrEnqueueAnAddress('to', $address, $name);
820
+ }
821
+
822
+ /**
823
+ * Add a "CC" address.
824
+ * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
825
+ * @param string $address The email address to send to
826
+ * @param string $name
827
+ * @return boolean true on success, false if address already used or invalid in some way
828
+ */
829
+ public function addCC($address, $name = '')
830
+ {
831
+ return $this->addOrEnqueueAnAddress('cc', $address, $name);
832
+ }
833
+
834
+ /**
835
+ * Add a "BCC" address.
836
+ * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
837
+ * @param string $address The email address to send to
838
+ * @param string $name
839
+ * @return boolean true on success, false if address already used or invalid in some way
840
+ */
841
+ public function addBCC($address, $name = '')
842
+ {
843
+ return $this->addOrEnqueueAnAddress('bcc', $address, $name);
844
+ }
845
+
846
+ /**
847
+ * Add a "Reply-To" address.
848
+ * @param string $address The email address to reply to
849
+ * @param string $name
850
+ * @return boolean true on success, false if address already used or invalid in some way
851
+ */
852
+ public function addReplyTo($address, $name = '')
853
+ {
854
+ return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
855
+ }
856
+
857
+ /**
858
+ * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
859
+ * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
860
+ * be modified after calling this function), addition of such addresses is delayed until send().
861
+ * Addresses that have been added already return false, but do not throw exceptions.
862
+ * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
863
+ * @param string $address The email address to send, resp. to reply to
864
+ * @param string $name
865
+ * @throws phpmailerException
866
+ * @return boolean true on success, false if address already used or invalid in some way
867
+ * @access protected
868
+ */
869
+ protected function addOrEnqueueAnAddress($kind, $address, $name)
870
+ {
871
+ $address = trim($address);
872
+ $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
873
+ if (($pos = strrpos($address, '@')) === false) {
874
+ // At-sign is misssing.
875
+ $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
876
+ $this->setError($error_message);
877
+ $this->edebug($error_message);
878
+ if ($this->exceptions) {
879
+ throw new phpmailerException($error_message);
880
+ }
881
+ return false;
882
+ }
883
+ $params = array($kind, $address, $name);
884
+ // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
885
+ if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
886
+ if ($kind != 'Reply-To') {
887
+ if (!array_key_exists($address, $this->RecipientsQueue)) {
888
+ $this->RecipientsQueue[$address] = $params;
889
+ return true;
890
+ }
891
+ } else {
892
+ if (!array_key_exists($address, $this->ReplyToQueue)) {
893
+ $this->ReplyToQueue[$address] = $params;
894
+ return true;
895
+ }
896
+ }
897
+ return false;
898
+ }
899
+ // Immediately add standard addresses without IDN.
900
+ return call_user_func_array(array($this, 'addAnAddress'), $params);
901
+ }
902
+
903
+ /**
904
+ * Add an address to one of the recipient arrays or to the ReplyTo array.
905
+ * Addresses that have been added already return false, but do not throw exceptions.
906
+ * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
907
+ * @param string $address The email address to send, resp. to reply to
908
+ * @param string $name
909
+ * @throws phpmailerException
910
+ * @return boolean true on success, false if address already used or invalid in some way
911
+ * @access protected
912
+ */
913
+ protected function addAnAddress($kind, $address, $name = '')
914
+ {
915
+ if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
916
+ $error_message = $this->lang('Invalid recipient kind: ') . $kind;
917
+ $this->setError($error_message);
918
+ $this->edebug($error_message);
919
+ if ($this->exceptions) {
920
+ throw new phpmailerException($error_message);
921
+ }
922
+ return false;
923
+ }
924
+ if (!$this->validateAddress($address)) {
925
+ $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
926
+ $this->setError($error_message);
927
+ $this->edebug($error_message);
928
+ if ($this->exceptions) {
929
+ throw new phpmailerException($error_message);
930
+ }
931
+ return false;
932
+ }
933
+ if ($kind != 'Reply-To') {
934
+ if (!array_key_exists(strtolower($address), $this->all_recipients)) {
935
+ array_push($this->$kind, array($address, $name));
936
+ $this->all_recipients[strtolower($address)] = true;
937
+ return true;
938
+ }
939
+ } else {
940
+ if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
941
+ $this->ReplyTo[strtolower($address)] = array($address, $name);
942
+ return true;
943
+ }
944
+ }
945
+ return false;
946
+ }
947
+
948
+ /**
949
+ * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
950
+ * of the form "display name <address>" into an array of name/address pairs.
951
+ * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
952
+ * Note that quotes in the name part are removed.
953
+ * @param string $addrstr The address list string
954
+ * @param bool $useimap Whether to use the IMAP extension to parse the list
955
+ * @return array
956
+ * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
957
+ */
958
+ public function parseAddresses($addrstr, $useimap = true)
959
+ {
960
+ $addresses = array();
961
+ if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
962
+ //Use this built-in parser if it's available
963
+ $list = imap_rfc822_parse_adrlist($addrstr, '');
964
+ foreach ($list as $address) {
965
+ if ($address->host != '.SYNTAX-ERROR.') {
966
+ if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
967
+ $addresses[] = array(
968
+ 'name' => (property_exists($address, 'personal') ? $address->personal : ''),
969
+ 'address' => $address->mailbox . '@' . $address->host
970
+ );
971
+ }
972
+ }
973
+ }
974
+ } else {
975
+ //Use this simpler parser
976
+ $list = explode(',', $addrstr);
977
+ foreach ($list as $address) {
978
+ $address = trim($address);
979
+ //Is there a separate name part?
980
+ if (strpos($address, '<') === false) {
981
+ //No separate name, just use the whole thing
982
+ if ($this->validateAddress($address)) {
983
+ $addresses[] = array(
984
+ 'name' => '',
985
+ 'address' => $address
986
+ );
987
+ }
988
+ } else {
989
+ list($name, $email) = explode('<', $address);
990
+ $email = trim(str_replace('>', '', $email));
991
+ if ($this->validateAddress($email)) {
992
+ $addresses[] = array(
993
+ 'name' => trim(str_replace(array('"', "'"), '', $name)),
994
+ 'address' => $email
995
+ );
996
+ }
997
+ }
998
+ }
999
+ }
1000
+ return $addresses;
1001
+ }
1002
+
1003
+ /**
1004
+ * Set the From and FromName properties.
1005
+ * @param string $address
1006
+ * @param string $name
1007
+ * @param boolean $auto Whether to also set the Sender address, defaults to true
1008
+ * @throws phpmailerException
1009
+ * @return boolean
1010
+ */
1011
+ public function setFrom($address, $name = '', $auto = true)
1012
+ {
1013
+ $address = trim($address);
1014
+ $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
1015
+ // Don't validate now addresses with IDN. Will be done in send().
1016
+ if (($pos = strrpos($address, '@')) === false or
1017
+ (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
1018
+ !$this->validateAddress($address)) {
1019
+ $error_message = $this->lang('invalid_address') . " (setFrom) $address";
1020
+ $this->setError($error_message);
1021
+ $this->edebug($error_message);
1022
+ if ($this->exceptions) {
1023
+ throw new phpmailerException($error_message);
1024
+ }
1025
+ return false;
1026
+ }
1027
+ $this->From = $address;
1028
+ $this->FromName = $name;
1029
+ if ($auto) {
1030
+ if (empty($this->Sender)) {
1031
+ $this->Sender = $address;
1032
+ }
1033
+ }
1034
+ return true;
1035
+ }
1036
+
1037
+ /**
1038
+ * Return the Message-ID header of the last email.
1039
+ * Technically this is the value from the last time the headers were created,
1040
+ * but it's also the message ID of the last sent message except in
1041
+ * pathological cases.
1042
+ * @return string
1043
+ */
1044
+ public function getLastMessageID()
1045
+ {
1046
+ return $this->lastMessageID;
1047
+ }
1048
+
1049
+ /**
1050
+ * Check that a string looks like an email address.
1051
+ * @param string $address The email address to check
1052
+ * @param string|callable $patternselect A selector for the validation pattern to use :
1053
+ * * `auto` Pick best pattern automatically;
1054
+ * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
1055
+ * * `pcre` Use old PCRE implementation;
1056
+ * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
1057
+ * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
1058
+ * * `noregex` Don't use a regex: super fast, really dumb.
1059
+ * Alternatively you may pass in a callable to inject your own validator, for example:
1060
+ * PHPMailer::validateAddress('user@example.com', function($address) {
1061
+ * return (strpos($address, '@') !== false);
1062
+ * });
1063
+ * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
1064
+ * @return boolean
1065
+ * @static
1066
+ * @access public
1067
+ */
1068
+ public static function validateAddress($address, $patternselect = null)
1069
+ {
1070
+ if (is_null($patternselect)) {
1071
+ $patternselect = self::$validator;
1072
+ }
1073
+ if (is_callable($patternselect)) {
1074
+ return call_user_func($patternselect, $address);
1075
+ }
1076
+ //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
1077
+ if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
1078
+ return false;
1079
+ }
1080
+ if (!$patternselect or $patternselect == 'auto') {
1081
+ //Check this constant first so it works when extension_loaded() is disabled by safe mode
1082
+ //Constant was added in PHP 5.2.4
1083
+ if (defined('PCRE_VERSION')) {
1084
+ //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
1085
+ if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
1086
+ $patternselect = 'pcre8';
1087
+ } else {
1088
+ $patternselect = 'pcre';
1089
+ }
1090
+ } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
1091
+ //Fall back to older PCRE
1092
+ $patternselect = 'pcre';
1093
+ } else {
1094
+ //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
1095
+ if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
1096
+ $patternselect = 'php';
1097
+ } else {
1098
+ $patternselect = 'noregex';
1099
+ }
1100
+ }
1101
+ }
1102
+ switch ($patternselect) {
1103
+ case 'pcre8':
1104
+ /**
1105
+ * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
1106
+ * @link http://squiloople.com/2009/12/20/email-address-validation/
1107
+ * @copyright 2009-2010 Michael Rushton
1108
+ * Feel free to use and redistribute this code. But please keep this copyright notice.
1109
+ */
1110
+ return (boolean)preg_match(
1111
+ '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
1112
+ '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
1113
+ '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
1114
+ '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
1115
+ '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
1116
+ '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
1117
+ '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
1118
+ '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
1119
+ '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
1120
+ $address
1121
+ );
1122
+ case 'pcre':
1123
+ //An older regex that doesn't need a recent PCRE
1124
+ return (boolean)preg_match(
1125
+ '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
1126
+ '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
1127
+ '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
1128
+ '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
1129
+ '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
1130
+ '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
1131
+ '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
1132
+ '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
1133
+ '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
1134
+ '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
1135
+ $address
1136
+ );
1137
+ case 'html5':
1138
+ /**
1139
+ * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
1140
+ * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
1141
+ */
1142
+ return (boolean)preg_match(
1143
+ '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
1144
+ '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
1145
+ $address
1146
+ );
1147
+ case 'noregex':
1148
+ //No PCRE! Do something _very_ approximate!
1149
+ //Check the address is 3 chars or longer and contains an @ that's not the first or last char
1150
+ return (strlen($address) >= 3
1151
+ and strpos($address, '@') >= 1
1152
+ and strpos($address, '@') != strlen($address) - 1);
1153
+ case 'php':
1154
+ default:
1155
+ return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
1156
+ }
1157
+ }
1158
+
1159
+ /**
1160
+ * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
1161
+ * "intl" and "mbstring" PHP extensions.
1162
+ * @return bool "true" if required functions for IDN support are present
1163
+ */
1164
+ public function idnSupported()
1165
+ {
1166
+ // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
1167
+ return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
1168
+ }
1169
+
1170
+ /**
1171
+ * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
1172
+ * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
1173
+ * This function silently returns unmodified address if:
1174
+ * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
1175
+ * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
1176
+ * or fails for any reason (e.g. domain has characters not allowed in an IDN)
1177
+ * @see PHPMailer::$CharSet
1178
+ * @param string $address The email address to convert
1179
+ * @return string The encoded address in ASCII form
1180
+ */
1181
+ public function punyencodeAddress($address)
1182
+ {
1183
+ // Verify we have required functions, CharSet, and at-sign.
1184
+ if ($this->idnSupported() and
1185
+ !empty($this->CharSet) and
1186
+ ($pos = strrpos($address, '@')) !== false) {
1187
+ $domain = substr($address, ++$pos);
1188
+ // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
1189
+ if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
1190
+ $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
1191
+ if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
1192
+ idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
1193
+ idn_to_ascii($domain)) !== false) {
1194
+ return substr($address, 0, $pos) . $punycode;
1195
+ }
1196
+ }
1197
+ }
1198
+ return $address;
1199
+ }
1200
+
1201
+ /**
1202
+ * Create a message and send it.
1203
+ * Uses the sending method specified by $Mailer.
1204
+ * @throws phpmailerException
1205
+ * @return boolean false on error - See the ErrorInfo property for details of the error.
1206
+ */
1207
+ public function send()
1208
+ {
1209
+ try {
1210
+ if (!$this->preSend()) {
1211
+ return false;
1212
+ }
1213
+ return $this->postSend();
1214
+ } catch (phpmailerException $exc) {
1215
+ $this->mailHeader = '';
1216
+ $this->setError($exc->getMessage());
1217
+ if ($this->exceptions) {
1218
+ throw $exc;
1219
+ }
1220
+ return false;
1221
+ }
1222
+ }
1223
+
1224
+ /**
1225
+ * Prepare a message for sending.
1226
+ * @throws phpmailerException
1227
+ * @return boolean
1228
+ */
1229
+ public function preSend()
1230
+ {
1231
+ try {
1232
+ $this->error_count = 0; // Reset errors
1233
+ $this->mailHeader = '';
1234
+
1235
+ // Dequeue recipient and Reply-To addresses with IDN
1236
+ foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
1237
+ $params[1] = $this->punyencodeAddress($params[1]);
1238
+ call_user_func_array(array($this, 'addAnAddress'), $params);
1239
+ }
1240
+ if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
1241
+ throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
1242
+ }
1243
+
1244
+ // Validate From, Sender, and ConfirmReadingTo addresses
1245
+ foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
1246
+ $this->$address_kind = trim($this->$address_kind);
1247
+ if (empty($this->$address_kind)) {
1248
+ continue;
1249
+ }
1250
+ $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
1251
+ if (!$this->validateAddress($this->$address_kind)) {
1252
+ $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
1253
+ $this->setError($error_message);
1254
+ $this->edebug($error_message);
1255
+ if ($this->exceptions) {
1256
+ throw new phpmailerException($error_message);
1257
+ }
1258
+ return false;
1259
+ }
1260
+ }
1261
+
1262
+ // Set whether the message is multipart/alternative
1263
+ if ($this->alternativeExists()) {
1264
+ $this->ContentType = 'multipart/alternative';
1265
+ }
1266
+
1267
+ $this->setMessageType();
1268
+ // Refuse to send an empty message unless we are specifically allowing it
1269
+ if (!$this->AllowEmpty and empty($this->Body)) {
1270
+ throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
1271
+ }
1272
+
1273
+ // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
1274
+ $this->MIMEHeader = '';
1275
+ $this->MIMEBody = $this->createBody();
1276
+ // createBody may have added some headers, so retain them
1277
+ $tempheaders = $this->MIMEHeader;
1278
+ $this->MIMEHeader = $this->createHeader();
1279
+ $this->MIMEHeader .= $tempheaders;
1280
+
1281
+ // To capture the complete message when using mail(), create
1282
+ // an extra header list which createHeader() doesn't fold in
1283
+ if ($this->Mailer == 'mail') {
1284
+ if (count($this->to) > 0) {
1285
+ $this->mailHeader .= $this->addrAppend('To', $this->to);
1286
+ } else {
1287
+ $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
1288
+ }
1289
+ $this->mailHeader .= $this->headerLine(
1290
+ 'Subject',
1291
+ $this->encodeHeader($this->secureHeader(trim($this->Subject)))
1292
+ );
1293
+ }
1294
+
1295
+ // Sign with DKIM if enabled
1296
+ if (!empty($this->DKIM_domain)
1297
+ && !empty($this->DKIM_selector)
1298
+ && (!empty($this->DKIM_private_string)
1299
+ || (!empty($this->DKIM_private) && file_exists($this->DKIM_private))
1300
+ )
1301
+ ) {
1302
+ $header_dkim = $this->DKIM_Add(
1303
+ $this->MIMEHeader . $this->mailHeader,
1304
+ $this->encodeHeader($this->secureHeader($this->Subject)),
1305
+ $this->MIMEBody
1306
+ );
1307
+ $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
1308
+ str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
1309
+ }
1310
+ return true;
1311
+ } catch (phpmailerException $exc) {
1312
+ $this->setError($exc->getMessage());
1313
+ if ($this->exceptions) {
1314
+ throw $exc;
1315
+ }
1316
+ return false;
1317
+ }
1318
+ }
1319
+
1320
+ /**
1321
+ * Actually send a message.
1322
+ * Send the email via the selected mechanism
1323
+ * @throws phpmailerException
1324
+ * @return boolean
1325
+ */
1326
+ public function postSend()
1327
+ {
1328
+ try {
1329
+ // Choose the mailer and send through it
1330
+ switch ($this->Mailer) {
1331
+ case 'sendmail':
1332
+ case 'qmail':
1333
+ return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
1334
+ case 'smtp':
1335
+ return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
1336
+ case 'mail':
1337
+ return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
1338
+ default:
1339
+ $sendMethod = $this->Mailer.'Send';
1340
+ if (method_exists($this, $sendMethod)) {
1341
+ return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
1342
+ }
1343
+
1344
+ return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
1345
+ }
1346
+ } catch (phpmailerException $exc) {
1347
+ $this->setError($exc->getMessage());
1348
+ $this->edebug($exc->getMessage());
1349
+ if ($this->exceptions) {
1350
+ throw $exc;
1351
+ }
1352
+ }
1353
+ return false;
1354
+ }
1355
+
1356
+ /**
1357
+ * Send mail using the $Sendmail program.
1358
+ * @param string $header The message headers
1359
+ * @param string $body The message body
1360
+ * @see PHPMailer::$Sendmail
1361
+ * @throws phpmailerException
1362
+ * @access protected
1363
+ * @return boolean
1364
+ */
1365
+ protected function sendmailSend($header, $body)
1366
+ {
1367
+ // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
1368
+ if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
1369
+ if ($this->Mailer == 'qmail') {
1370
+ $sendmailFmt = '%s -f%s';
1371
+ } else {
1372
+ $sendmailFmt = '%s -oi -f%s -t';
1373
+ }
1374
+ } else {
1375
+ if ($this->Mailer == 'qmail') {
1376
+ $sendmailFmt = '%s';
1377
+ } else {
1378
+ $sendmailFmt = '%s -oi -t';
1379
+ }
1380
+ }
1381
+
1382
+ // TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.
1383
+ $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);
1384
+
1385
+ if ($this->SingleTo) {
1386
+ foreach ($this->SingleToArray as $toAddr) {
1387
+ if (!@$mail = popen($sendmail, 'w')) {
1388
+ throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
1389
+ }
1390
+ fputs($mail, 'To: ' . $toAddr . "\n");
1391
+ fputs($mail, $header);
1392
+ fputs($mail, $body);
1393
+ $result = pclose($mail);
1394
+ $this->doCallback(
1395
+ ($result == 0),
1396
+ array($toAddr),
1397
+ $this->cc,
1398
+ $this->bcc,
1399
+ $this->Subject,
1400
+ $body,
1401
+ $this->From
1402
+ );
1403
+ if ($result != 0) {
1404
+ throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
1405
+ }
1406
+ }
1407
+ } else {
1408
+ if (!@$mail = popen($sendmail, 'w')) {
1409
+ throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
1410
+ }
1411
+ fputs($mail, $header);
1412
+ fputs($mail, $body);
1413
+ $result = pclose($mail);
1414
+ $this->doCallback(
1415
+ ($result == 0),
1416
+ $this->to,
1417
+ $this->cc,
1418
+ $this->bcc,
1419
+ $this->Subject,
1420
+ $body,
1421
+ $this->From
1422
+ );
1423
+ if ($result != 0) {
1424
+ throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
1425
+ }
1426
+ }
1427
+ return true;
1428
+ }
1429
+
1430
+ /**
1431
+ * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
1432
+ *
1433
+ * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
1434
+ * @param string $string The string to be validated
1435
+ * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
1436
+ * @access protected
1437
+ * @return boolean
1438
+ */
1439
+ protected static function isShellSafe($string)
1440
+ {
1441
+ // Future-proof
1442
+ if (escapeshellcmd($string) !== $string
1443
+ or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
1444
+ ) {
1445
+ return false;
1446
+ }
1447
+
1448
+ $length = strlen($string);
1449
+
1450
+ for ($i = 0; $i < $length; $i++) {
1451
+ $c = $string[$i];
1452
+
1453
+ // All other characters have a special meaning in at least one common shell, including = and +.
1454
+ // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
1455
+ // Note that this does permit non-Latin alphanumeric characters based on the current locale.
1456
+ if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
1457
+ return false;
1458
+ }
1459
+ }
1460
+
1461
+ return true;
1462
+ }
1463
+
1464
+ /**
1465
+ * Send mail using the PHP mail() function.
1466
+ * @param string $header The message headers
1467
+ * @param string $body The message body
1468
+ * @link http://www.php.net/manual/en/book.mail.php
1469
+ * @throws phpmailerException
1470
+ * @access protected
1471
+ * @return boolean
1472
+ */
1473
+ protected function mailSend($header, $body)
1474
+ {
1475
+ $toArr = array();
1476
+ foreach ($this->to as $toaddr) {
1477
+ $toArr[] = $this->addrFormat($toaddr);
1478
+ }
1479
+ $to = implode(', ', $toArr);
1480
+
1481
+ $params = null;
1482
+ //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
1483
+ if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
1484
+ // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
1485
+ if (self::isShellSafe($this->Sender)) {
1486
+ $params = sprintf('-f%s', $this->Sender);
1487
+ }
1488
+ }
1489
+ if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
1490
+ $old_from = ini_get('sendmail_from');
1491
+ ini_set('sendmail_from', $this->Sender);
1492
+ }
1493
+ $result = false;
1494
+ if ($this->SingleTo and count($toArr) > 1) {
1495
+ foreach ($toArr as $toAddr) {
1496
+ $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
1497
+ $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
1498
+ }
1499
+ } else {
1500
+ $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
1501
+ $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
1502
+ }
1503
+ if (isset($old_from)) {
1504
+ ini_set('sendmail_from', $old_from);
1505
+ }
1506
+ if (!$result) {
1507
+ throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
1508
+ }
1509
+ return true;
1510
+ }
1511
+
1512
+ /**
1513
+ * Get an instance to use for SMTP operations.
1514
+ * Override this function to load your own SMTP implementation
1515
+ * @return SMTP
1516
+ */
1517
+ public function getSMTPInstance()
1518
+ {
1519
+ if (!is_object($this->smtp)) {
1520
+ $this->smtp = new SMTP;
1521
+ }
1522
+ return $this->smtp;
1523
+ }
1524
+
1525
+ /**
1526
+ * Send mail via SMTP.
1527
+ * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
1528
+ * Uses the PHPMailerSMTP class by default.
1529
+ * @see PHPMailer::getSMTPInstance() to use a different class.
1530
+ * @param string $header The message headers
1531
+ * @param string $body The message body
1532
+ * @throws phpmailerException
1533
+ * @uses SMTP
1534
+ * @access protected
1535
+ * @return boolean
1536
+ */
1537
+ protected function smtpSend($header, $body)
1538
+ {
1539
+ $bad_rcpt = array();
1540
+ if (!$this->smtpConnect($this->SMTPOptions)) {
1541
+ throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
1542
+ }
1543
+ if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
1544
+ $smtp_from = $this->Sender;
1545
+ } else {
1546
+ $smtp_from = $this->From;
1547
+ }
1548
+ if (!$this->smtp->mail($smtp_from)) {
1549
+ $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
1550
+ throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
1551
+ }
1552
+
1553
+ // Attempt to send to all recipients
1554
+ foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
1555
+ foreach ($togroup as $to) {
1556
+ if (!$this->smtp->recipient($to[0])) {
1557
+ $error = $this->smtp->getError();
1558
+ $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
1559
+ $isSent = false;
1560
+ } else {
1561
+ $isSent = true;
1562
+ }
1563
+ $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
1564
+ }
1565
+ }
1566
+
1567
+ // Only send the DATA command if we have viable recipients
1568
+ if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
1569
+ throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
1570
+ }
1571
+ if ($this->SMTPKeepAlive) {
1572
+ $this->smtp->reset();
1573
+ } else {
1574
+ $this->smtp->quit();
1575
+ $this->smtp->close();
1576
+ }
1577
+ //Create error message for any bad addresses
1578
+ if (count($bad_rcpt) > 0) {
1579
+ $errstr = '';
1580
+ foreach ($bad_rcpt as $bad) {
1581
+ $errstr .= $bad['to'] . ': ' . $bad['error'];
1582
+ }
1583
+ throw new phpmailerException(
1584
+ $this->lang('recipients_failed') . $errstr,
1585
+ self::STOP_CONTINUE
1586
+ );
1587
+ }
1588
+ return true;
1589
+ }
1590
+
1591
+ /**
1592
+ * Initiate a connection to an SMTP server.
1593
+ * Returns false if the operation failed.
1594
+ * @param array $options An array of options compatible with stream_context_create()
1595
+ * @uses SMTP
1596
+ * @access public
1597
+ * @throws phpmailerException
1598
+ * @return boolean
1599
+ */
1600
+ public function smtpConnect($options = null)
1601
+ {
1602
+ if (is_null($this->smtp)) {
1603
+ $this->smtp = $this->getSMTPInstance();
1604
+ }
1605
+
1606
+ //If no options are provided, use whatever is set in the instance
1607
+ if (is_null($options)) {
1608
+ $options = $this->SMTPOptions;
1609
+ }
1610
+
1611
+ // Already connected?
1612
+ if ($this->smtp->connected()) {
1613
+ return true;
1614
+ }
1615
+
1616
+ $this->smtp->setTimeout($this->Timeout);
1617
+ $this->smtp->setDebugLevel($this->SMTPDebug);
1618
+ $this->smtp->setDebugOutput($this->Debugoutput);
1619
+ $this->smtp->setVerp($this->do_verp);
1620
+ $hosts = explode(';', $this->Host);
1621
+ $lastexception = null;
1622
+
1623
+ foreach ($hosts as $hostentry) {
1624
+ $hostinfo = array();
1625
+ if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
1626
+ // Not a valid host entry
1627
+ continue;
1628
+ }
1629
+ // $hostinfo[2]: optional ssl or tls prefix
1630
+ // $hostinfo[3]: the hostname
1631
+ // $hostinfo[4]: optional port number
1632
+ // The host string prefix can temporarily override the current setting for SMTPSecure
1633
+ // If it's not specified, the default value is used
1634
+ $prefix = '';
1635
+ $secure = $this->SMTPSecure;
1636
+ $tls = ($this->SMTPSecure == 'tls');
1637
+ if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
1638
+ $prefix = 'ssl://';
1639
+ $tls = false; // Can't have SSL and TLS at the same time
1640
+ $secure = 'ssl';
1641
+ } elseif ($hostinfo[2] == 'tls') {
1642
+ $tls = true;
1643
+ // tls doesn't use a prefix
1644
+ $secure = 'tls';
1645
+ }
1646
+ //Do we need the OpenSSL extension?
1647
+ $sslext = defined('OPENSSL_ALGO_SHA1');
1648
+ if ('tls' === $secure or 'ssl' === $secure) {
1649
+ //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
1650
+ if (!$sslext) {
1651
+ throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
1652
+ }
1653
+ }
1654
+ $host = $hostinfo[3];
1655
+ $port = $this->Port;
1656
+ $tport = (integer)$hostinfo[4];
1657
+ if ($tport > 0 and $tport < 65536) {
1658
+ $port = $tport;
1659
+ }
1660
+ if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
1661
+ try {
1662
+ if ($this->Helo) {
1663
+ $hello = $this->Helo;
1664
+ } else {
1665
+ $hello = $this->serverHostname();
1666
+ }
1667
+ $this->smtp->hello($hello);
1668
+ //Automatically enable TLS encryption if:
1669
+ // * it's not disabled
1670
+ // * we have openssl extension
1671
+ // * we are not already using SSL
1672
+ // * the server offers STARTTLS
1673
+ if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
1674
+ $tls = true;
1675
+ }
1676
+ if ($tls) {
1677
+ if (!$this->smtp->startTLS()) {
1678
+ throw new phpmailerException($this->lang('connect_host'));
1679
+ }
1680
+ // We must resend EHLO after TLS negotiation
1681
+ $this->smtp->hello($hello);
1682
+ }
1683
+ if ($this->SMTPAuth) {
1684
+ if (!$this->smtp->authenticate(
1685
+ $this->Username,
1686
+ $this->Password,
1687
+ $this->AuthType,
1688
+ $this->Realm,
1689
+ $this->Workstation
1690
+ )
1691
+ ) {
1692
+ throw new phpmailerException($this->lang('authenticate'));
1693
+ }
1694
+ }
1695
+ return true;
1696
+ } catch (phpmailerException $exc) {
1697
+ $lastexception = $exc;
1698
+ $this->edebug($exc->getMessage());
1699
+ // We must have connected, but then failed TLS or Auth, so close connection nicely
1700
+ $this->smtp->quit();
1701
+ }
1702
+ }
1703
+ }
1704
+ // If we get here, all connection attempts have failed, so close connection hard
1705
+ $this->smtp->close();
1706
+ // As we've caught all exceptions, just report whatever the last one was
1707
+ if ($this->exceptions and !is_null($lastexception)) {
1708
+ throw $lastexception;
1709
+ }
1710
+ return false;
1711
+ }
1712
+
1713
+ /**
1714
+ * Close the active SMTP session if one exists.
1715
+ * @return void
1716
+ */
1717
+ public function smtpClose()
1718
+ {
1719
+ if (is_a($this->smtp, 'SMTP')) {
1720
+ if ($this->smtp->connected()) {
1721
+ $this->smtp->quit();
1722
+ $this->smtp->close();
1723
+ }
1724
+ }
1725
+ }
1726
+
1727
+ /**
1728
+ * Set the language for error messages.
1729
+ * Returns false if it cannot load the language file.
1730
+ * The default language is English.
1731
+ * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
1732
+ * @param string $lang_path Path to the language file directory, with trailing separator (slash)
1733
+ * @return boolean
1734
+ * @access public
1735
+ */
1736
+ public function setLanguage($langcode = 'en', $lang_path = '')
1737
+ {
1738
+ // Backwards compatibility for renamed language codes
1739
+ $renamed_langcodes = array(
1740
+ 'br' => 'pt_br',
1741
+ 'cz' => 'cs',
1742
+ 'dk' => 'da',
1743
+ 'no' => 'nb',
1744
+ 'se' => 'sv',
1745
+ );
1746
+
1747
+ if (isset($renamed_langcodes[$langcode])) {
1748
+ $langcode = $renamed_langcodes[$langcode];
1749
+ }
1750
+
1751
+ // Define full set of translatable strings in English
1752
+ $PHPMAILER_LANG = array(
1753
+ 'authenticate' => 'SMTP Error: Could not authenticate.',
1754
+ 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
1755
+ 'data_not_accepted' => 'SMTP Error: data not accepted.',
1756
+ 'empty_message' => 'Message body empty',
1757
+ 'encoding' => 'Unknown encoding: ',
1758
+ 'execute' => 'Could not execute: ',
1759
+ 'file_access' => 'Could not access file: ',
1760
+ 'file_open' => 'File Error: Could not open file: ',
1761
+ 'from_failed' => 'The following From address failed: ',
1762
+ 'instantiate' => 'Could not instantiate mail function.',
1763
+ 'invalid_address' => 'Invalid address: ',
1764
+ 'mailer_not_supported' => ' mailer is not supported.',
1765
+ 'provide_address' => 'You must provide at least one recipient email address.',
1766
+ 'recipients_failed' => 'SMTP Error: The following recipients failed: ',
1767
+ 'signing' => 'Signing Error: ',
1768
+ 'smtp_connect_failed' => 'SMTP connect() failed.',
1769
+ 'smtp_error' => 'SMTP server error: ',
1770
+ 'variable_set' => 'Cannot set or reset variable: ',
1771
+ 'extension_missing' => 'Extension missing: '
1772
+ );
1773
+ if (empty($lang_path)) {
1774
+ // Calculate an absolute path so it can work if CWD is not here
1775
+ $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
1776
+ }
1777
+ //Validate $langcode
1778
+ if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
1779
+ $langcode = 'en';
1780
+ }
1781
+ $foundlang = true;
1782
+ $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
1783
+ // There is no English translation file
1784
+ if ($langcode != 'en') {
1785
+ // Make sure language file path is readable
1786
+ if (!is_readable($lang_file)) {
1787
+ $foundlang = false;
1788
+ } else {
1789
+ // Overwrite language-specific strings.
1790
+ // This way we'll never have missing translation keys.
1791
+ $foundlang = include $lang_file;
1792
+ }
1793
+ }
1794
+ $this->language = $PHPMAILER_LANG;
1795
+ return (boolean)$foundlang; // Returns false if language not found
1796
+ }
1797
+
1798
+ /**
1799
+ * Get the array of strings for the current language.
1800
+ * @return array
1801
+ */
1802
+ public function getTranslations()
1803
+ {
1804
+ return $this->language;
1805
+ }
1806
+
1807
+ /**
1808
+ * Create recipient headers.
1809
+ * @access public
1810
+ * @param string $type
1811
+ * @param array $addr An array of recipient,
1812
+ * where each recipient is a 2-element indexed array with element 0 containing an address
1813
+ * and element 1 containing a name, like:
1814
+ * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
1815
+ * @return string
1816
+ */
1817
+ public function addrAppend($type, $addr)
1818
+ {
1819
+ $addresses = array();
1820
+ foreach ($addr as $address) {
1821
+ $addresses[] = $this->addrFormat($address);
1822
+ }
1823
+ return $type . ': ' . implode(', ', $addresses) . $this->LE;
1824
+ }
1825
+
1826
+ /**
1827
+ * Format an address for use in a message header.
1828
+ * @access public
1829
+ * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
1830
+ * like array('joe@example.com', 'Joe User')
1831
+ * @return string
1832
+ */
1833
+ public function addrFormat($addr)
1834
+ {
1835
+ if (empty($addr[1])) { // No name provided
1836
+ return $this->secureHeader($addr[0]);
1837
+ } else {
1838
+ return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
1839
+ $addr[0]
1840
+ ) . '>';
1841
+ }
1842
+ }
1843
+
1844
+ /**
1845
+ * Word-wrap message.
1846
+ * For use with mailers that do not automatically perform wrapping
1847
+ * and for quoted-printable encoded messages.
1848
+ * Original written by philippe.
1849
+ * @param string $message The message to wrap
1850
+ * @param integer $length The line length to wrap to
1851
+ * @param boolean $qp_mode Whether to run in Quoted-Printable mode
1852
+ * @access public
1853
+ * @return string
1854
+ */
1855
+ public function wrapText($message, $length, $qp_mode = false)
1856
+ {
1857
+ if ($qp_mode) {
1858
+ $soft_break = sprintf(' =%s', $this->LE);
1859
+ } else {
1860
+ $soft_break = $this->LE;
1861
+ }
1862
+ // If utf-8 encoding is used, we will need to make sure we don't
1863
+ // split multibyte characters when we wrap
1864
+ $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
1865
+ $lelen = strlen($this->LE);
1866
+ $crlflen = strlen(self::CRLF);
1867
+
1868
+ $message = $this->fixEOL($message);
1869
+ //Remove a trailing line break
1870
+ if (substr($message, -$lelen) == $this->LE) {
1871
+ $message = substr($message, 0, -$lelen);
1872
+ }
1873
+
1874
+ //Split message into lines
1875
+ $lines = explode($this->LE, $message);
1876
+ //Message will be rebuilt in here
1877
+ $message = '';
1878
+ foreach ($lines as $line) {
1879
+ $words = explode(' ', $line);
1880
+ $buf = '';
1881
+ $firstword = true;
1882
+ foreach ($words as $word) {
1883
+ if ($qp_mode and (strlen($word) > $length)) {
1884
+ $space_left = $length - strlen($buf) - $crlflen;
1885
+ if (!$firstword) {
1886
+ if ($space_left > 20) {
1887
+ $len = $space_left;
1888
+ if ($is_utf8) {
1889
+ $len = $this->utf8CharBoundary($word, $len);
1890
+ } elseif (substr($word, $len - 1, 1) == '=') {
1891
+ $len--;
1892
+ } elseif (substr($word, $len - 2, 1) == '=') {
1893
+ $len -= 2;
1894
+ }
1895
+ $part = substr($word, 0, $len);
1896
+ $word = substr($word, $len);
1897
+ $buf .= ' ' . $part;
1898
+ $message .= $buf . sprintf('=%s', self::CRLF);
1899
+ } else {
1900
+ $message .= $buf . $soft_break;
1901
+ }
1902
+ $buf = '';
1903
+ }
1904
+ while (strlen($word) > 0) {
1905
+ if ($length <= 0) {
1906
+ break;
1907
+ }
1908
+ $len = $length;
1909
+ if ($is_utf8) {
1910
+ $len = $this->utf8CharBoundary($word, $len);
1911
+ } elseif (substr($word, $len - 1, 1) == '=') {
1912
+ $len--;
1913
+ } elseif (substr($word, $len - 2, 1) == '=') {
1914
+ $len -= 2;
1915
+ }
1916
+ $part = substr($word, 0, $len);
1917
+ $word = substr($word, $len);
1918
+
1919
+ if (strlen($word) > 0) {
1920
+ $message .= $part . sprintf('=%s', self::CRLF);
1921
+ } else {
1922
+ $buf = $part;
1923
+ }
1924
+ }
1925
+ } else {
1926
+ $buf_o = $buf;
1927
+ if (!$firstword) {
1928
+ $buf .= ' ';
1929
+ }
1930
+ $buf .= $word;
1931
+
1932
+ if (strlen($buf) > $length and $buf_o != '') {
1933
+ $message .= $buf_o . $soft_break;
1934
+ $buf = $word;
1935
+ }
1936
+ }
1937
+ $firstword = false;
1938
+ }
1939
+ $message .= $buf . self::CRLF;
1940
+ }
1941
+
1942
+ return $message;
1943
+ }
1944
+
1945
+ /**
1946
+ * Find the last character boundary prior to $maxLength in a utf-8
1947
+ * quoted-printable encoded string.
1948
+ * Original written by Colin Brown.
1949
+ * @access public
1950
+ * @param string $encodedText utf-8 QP text
1951
+ * @param integer $maxLength Find the last character boundary prior to this length
1952
+ * @return integer
1953
+ */
1954
+ public function utf8CharBoundary($encodedText, $maxLength)
1955
+ {
1956
+ $foundSplitPos = false;
1957
+ $lookBack = 3;
1958
+ while (!$foundSplitPos) {
1959
+ $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
1960
+ $encodedCharPos = strpos($lastChunk, '=');
1961
+ if (false !== $encodedCharPos) {
1962
+ // Found start of encoded character byte within $lookBack block.
1963
+ // Check the encoded byte value (the 2 chars after the '=')
1964
+ $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
1965
+ $dec = hexdec($hex);
1966
+ if ($dec < 128) {
1967
+ // Single byte character.
1968
+ // If the encoded char was found at pos 0, it will fit
1969
+ // otherwise reduce maxLength to start of the encoded char
1970
+ if ($encodedCharPos > 0) {
1971
+ $maxLength = $maxLength - ($lookBack - $encodedCharPos);
1972
+ }
1973
+ $foundSplitPos = true;
1974
+ } elseif ($dec >= 192) {
1975
+ // First byte of a multi byte character
1976
+ // Reduce maxLength to split at start of character
1977
+ $maxLength = $maxLength - ($lookBack - $encodedCharPos);
1978
+ $foundSplitPos = true;
1979
+ } elseif ($dec < 192) {
1980
+ // Middle byte of a multi byte character, look further back
1981
+ $lookBack += 3;
1982
+ }
1983
+ } else {
1984
+ // No encoded character found
1985
+ $foundSplitPos = true;
1986
+ }
1987
+ }
1988
+ return $maxLength;
1989
+ }
1990
+
1991
+ /**
1992
+ * Apply word wrapping to the message body.
1993
+ * Wraps the message body to the number of chars set in the WordWrap property.
1994
+ * You should only do this to plain-text bodies as wrapping HTML tags may break them.
1995
+ * This is called automatically by createBody(), so you don't need to call it yourself.
1996
+ * @access public
1997
+ * @return void
1998
+ */
1999
+ public function setWordWrap()
2000
+ {
2001
+ if ($this->WordWrap < 1) {
2002
+ return;
2003
+ }
2004
+
2005
+ switch ($this->message_type) {
2006
+ case 'alt':
2007
+ case 'alt_inline':
2008
+ case 'alt_attach':
2009
+ case 'alt_inline_attach':
2010
+ $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
2011
+ break;
2012
+ default:
2013
+ $this->Body = $this->wrapText($this->Body, $this->WordWrap);
2014
+ break;
2015
+ }
2016
+ }
2017
+
2018
+ /**
2019
+ * Assemble message headers.
2020
+ * @access public
2021
+ * @return string The assembled headers
2022
+ */
2023
+ public function createHeader()
2024
+ {
2025
+ $result = '';
2026
+
2027
+ if ($this->MessageDate == '') {
2028
+ $this->MessageDate = self::rfcDate();
2029
+ }
2030
+ $result .= $this->headerLine('Date', $this->MessageDate);
2031
+
2032
+ // To be created automatically by mail()
2033
+ if ($this->SingleTo) {
2034
+ if ($this->Mailer != 'mail') {
2035
+ foreach ($this->to as $toaddr) {
2036
+ $this->SingleToArray[] = $this->addrFormat($toaddr);
2037
+ }
2038
+ }
2039
+ } else {
2040
+ if (count($this->to) > 0) {
2041
+ if ($this->Mailer != 'mail') {
2042
+ $result .= $this->addrAppend('To', $this->to);
2043
+ }
2044
+ } elseif (count($this->cc) == 0) {
2045
+ $result .= $this->headerLine('To', 'undisclosed-recipients:;');
2046
+ }
2047
+ }
2048
+
2049
+ $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));
2050
+
2051
+ // sendmail and mail() extract Cc from the header before sending
2052
+ if (count($this->cc) > 0) {
2053
+ $result .= $this->addrAppend('Cc', $this->cc);
2054
+ }
2055
+
2056
+ // sendmail and mail() extract Bcc from the header before sending
2057
+ if ((
2058
+ $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
2059
+ )
2060
+ and count($this->bcc) > 0
2061
+ ) {
2062
+ $result .= $this->addrAppend('Bcc', $this->bcc);
2063
+ }
2064
+
2065
+ if (count($this->ReplyTo) > 0) {
2066
+ $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
2067
+ }
2068
+
2069
+ // mail() sets the subject itself
2070
+ if ($this->Mailer != 'mail') {
2071
+ $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
2072
+ }
2073
+
2074
+ // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
2075
+ // https://tools.ietf.org/html/rfc5322#section-3.6.4
2076
+ if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
2077
+ $this->lastMessageID = $this->MessageID;
2078
+ } else {
2079
+ $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
2080
+ }
2081
+ $result .= $this->headerLine('Message-ID', $this->lastMessageID);
2082
+ if (!is_null($this->Priority)) {
2083
+ $result .= $this->headerLine('X-Priority', $this->Priority);
2084
+ }
2085
+ if ($this->XMailer == '') {
2086
+ $result .= $this->headerLine(
2087
+ 'X-Mailer',
2088
+ 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
2089
+ );
2090
+ } else {
2091
+ $myXmailer = trim($this->XMailer);
2092
+ if ($myXmailer) {
2093
+ $result .= $this->headerLine('X-Mailer', $myXmailer);
2094
+ }
2095
+ }
2096
+
2097
+ if ($this->ConfirmReadingTo != '') {
2098
+ $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
2099
+ }
2100
+
2101
+ // Add custom headers
2102
+ foreach ($this->CustomHeader as $header) {
2103
+ $result .= $this->headerLine(
2104
+ trim($header[0]),
2105
+ $this->encodeHeader(trim($header[1]))
2106
+ );
2107
+ }
2108
+ if (!$this->sign_key_file) {
2109
+ $result .= $this->headerLine('MIME-Version', '1.0');
2110
+ $result .= $this->getMailMIME();
2111
+ }
2112
+
2113
+ return $result;
2114
+ }
2115
+
2116
+ /**
2117
+ * Get the message MIME type headers.
2118
+ * @access public
2119
+ * @return string
2120
+ */
2121
+ public function getMailMIME()
2122
+ {
2123
+ $result = '';
2124
+ $ismultipart = true;
2125
+ switch ($this->message_type) {
2126
+ case 'inline':
2127
+ $result .= $this->headerLine('Content-Type', 'multipart/related;');
2128
+ $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
2129
+ break;
2130
+ case 'attach':
2131
+ case 'inline_attach':
2132
+ case 'alt_attach':
2133
+ case 'alt_inline_attach':
2134
+ $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
2135
+ $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
2136
+ break;
2137
+ case 'alt':
2138
+ case 'alt_inline':
2139
+ $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
2140
+ $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
2141
+ break;
2142
+ default:
2143
+ // Catches case 'plain': and case '':
2144
+ $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
2145
+ $ismultipart = false;
2146
+ break;
2147
+ }
2148
+ // RFC1341 part 5 says 7bit is assumed if not specified
2149
+ if ($this->Encoding != '7bit') {
2150
+ // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
2151
+ if ($ismultipart) {
2152
+ if ($this->Encoding == '8bit') {
2153
+ $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
2154
+ }
2155
+ // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
2156
+ } else {
2157
+ $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
2158
+ }
2159
+ }
2160
+
2161
+ if ($this->Mailer != 'mail') {
2162
+ $result .= $this->LE;
2163
+ }
2164
+
2165
+ return $result;
2166
+ }
2167
+
2168
+ /**
2169
+ * Returns the whole MIME message.
2170
+ * Includes complete headers and body.
2171
+ * Only valid post preSend().
2172
+ * @see PHPMailer::preSend()
2173
+ * @access public
2174
+ * @return string
2175
+ */
2176
+ public function getSentMIMEMessage()
2177
+ {
2178
+ return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
2179
+ }
2180
+
2181
+ /**
2182
+ * Create unique ID
2183
+ * @return string
2184
+ */
2185
+ protected function generateId() {
2186
+ return md5(uniqid(time()));
2187
+ }
2188
+
2189
+ /**
2190
+ * Assemble the message body.
2191
+ * Returns an empty string on failure.
2192
+ * @access public
2193
+ * @throws phpmailerException
2194
+ * @return string The assembled message body
2195
+ */
2196
+ public function createBody()
2197
+ {
2198
+ $body = '';
2199
+ //Create unique IDs and preset boundaries
2200
+ $this->uniqueid = $this->generateId();
2201
+ $this->boundary[1] = 'b1_' . $this->uniqueid;
2202
+ $this->boundary[2] = 'b2_' . $this->uniqueid;
2203
+ $this->boundary[3] = 'b3_' . $this->uniqueid;
2204
+
2205
+ if ($this->sign_key_file) {
2206
+ $body .= $this->getMailMIME() . $this->LE;
2207
+ }
2208
+
2209
+ $this->setWordWrap();
2210
+
2211
+ $bodyEncoding = $this->Encoding;
2212
+ $bodyCharSet = $this->CharSet;
2213
+ //Can we do a 7-bit downgrade?
2214
+ if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
2215
+ $bodyEncoding = '7bit';
2216
+ //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
2217
+ $bodyCharSet = 'us-ascii';
2218
+ }
2219
+ //If lines are too long, and we're not already using an encoding that will shorten them,
2220
+ //change to quoted-printable transfer encoding for the body part only
2221
+ if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
2222
+ $bodyEncoding = 'quoted-printable';
2223
+ }
2224
+
2225
+ $altBodyEncoding = $this->Encoding;
2226
+ $altBodyCharSet = $this->CharSet;
2227
+ //Can we do a 7-bit downgrade?
2228
+ if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
2229
+ $altBodyEncoding = '7bit';
2230
+ //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
2231
+ $altBodyCharSet = 'us-ascii';
2232
+ }
2233
+ //If lines are too long, and we're not already using an encoding that will shorten them,
2234
+ //change to quoted-printable transfer encoding for the alt body part only
2235
+ if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
2236
+ $altBodyEncoding = 'quoted-printable';
2237
+ }
2238
+ //Use this as a preamble in all multipart message types
2239
+ $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
2240
+ switch ($this->message_type) {
2241
+ case 'inline':
2242
+ $body .= $mimepre;
2243
+ $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
2244
+ $body .= $this->encodeString($this->Body, $bodyEncoding);
2245
+ $body .= $this->LE . $this->LE;
2246
+ $body .= $this->attachAll('inline', $this->boundary[1]);
2247
+ break;
2248
+ case 'attach':
2249
+ $body .= $mimepre;
2250
+ $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
2251
+ $body .= $this->encodeString($this->Body, $bodyEncoding);
2252
+ $body .= $this->LE . $this->LE;
2253
+ $body .= $this->attachAll('attachment', $this->boundary[1]);
2254
+ break;
2255
+ case 'inline_attach':
2256
+ $body .= $mimepre;
2257
+ $body .= $this->textLine('--' . $this->boundary[1]);
2258
+ $body .= $this->headerLine('Content-Type', 'multipart/related;');
2259
+ $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
2260
+ $body .= $this->LE;
2261
+ $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
2262
+ $body .= $this->encodeString($this->Body, $bodyEncoding);
2263
+ $body .= $this->LE . $this->LE;
2264
+ $body .= $this->attachAll('inline', $this->boundary[2]);
2265
+ $body .= $this->LE;
2266
+ $body .= $this->attachAll('attachment', $this->boundary[1]);
2267
+ break;
2268
+ case 'alt':
2269
+ $body .= $mimepre;
2270
+ $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
2271
+ $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
2272
+ $body .= $this->LE . $this->LE;
2273
+ $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
2274
+ $body .= $this->encodeString($this->Body, $bodyEncoding);
2275
+ $body .= $this->LE . $this->LE;
2276
+ if (!empty($this->Ical)) {
2277
+ $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
2278
+ $body .= $this->encodeString($this->Ical, $this->Encoding);
2279
+ $body .= $this->LE . $this->LE;
2280
+ }
2281
+ $body .= $this->endBoundary($this->boundary[1]);
2282
+ break;
2283
+ case 'alt_inline':
2284
+ $body .= $mimepre;
2285
+ $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
2286
+ $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
2287
+ $body .= $this->LE . $this->LE;
2288
+ $body .= $this->textLine('--' . $this->boundary[1]);
2289
+ $body .= $this->headerLine('Content-Type', 'multipart/related;');
2290
+ $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
2291
+ $body .= $this->LE;
2292
+ $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
2293
+ $body .= $this->encodeString($this->Body, $bodyEncoding);
2294
+ $body .= $this->LE . $this->LE;
2295
+ $body .= $this->attachAll('inline', $this->boundary[2]);
2296
+ $body .= $this->LE;
2297
+ $body .= $this->endBoundary($this->boundary[1]);
2298
+ break;
2299
+ case 'alt_attach':
2300
+ $body .= $mimepre;
2301
+ $body .= $this->textLine('--' . $this->boundary[1]);
2302
+ $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
2303
+ $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
2304
+ $body .= $this->LE;
2305
+ $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
2306
+ $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
2307
+ $body .= $this->LE . $this->LE;
2308
+ $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
2309
+ $body .= $this->encodeString($this->Body, $bodyEncoding);
2310
+ $body .= $this->LE . $this->LE;
2311
+ $body .= $this->endBoundary($this->boundary[2]);
2312
+ $body .= $this->LE;
2313
+ $body .= $this->attachAll('attachment', $this->boundary[1]);
2314
+ break;
2315
+ case 'alt_inline_attach':
2316
+ $body .= $mimepre;
2317
+ $body .= $this->textLine('--' . $this->boundary[1]);
2318
+ $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
2319
+ $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
2320
+ $body .= $this->LE;
2321
+ $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
2322
+ $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
2323
+ $body .= $this->LE . $this->LE;
2324
+ $body .= $this->textLine('--' . $this->boundary[2]);
2325
+ $body .= $this->headerLine('Content-Type', 'multipart/related;');
2326
+ $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
2327
+ $body .= $this->LE;
2328
+ $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
2329
+ $body .= $this->encodeString($this->Body, $bodyEncoding);
2330
+ $body .= $this->LE . $this->LE;
2331
+ $body .= $this->attachAll('inline', $this->boundary[3]);
2332
+ $body .= $this->LE;
2333
+ $body .= $this->endBoundary($this->boundary[2]);
2334
+ $body .= $this->LE;
2335
+ $body .= $this->attachAll('attachment', $this->boundary[1]);
2336
+ break;
2337
+ default:
2338
+ // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
2339
+ //Reset the `Encoding` property in case we changed it for line length reasons
2340
+ $this->Encoding = $bodyEncoding;
2341
+ $body .= $this->encodeString($this->Body, $this->Encoding);
2342
+ break;
2343
+ }
2344
+
2345
+ if ($this->isError()) {
2346
+ $body = '';
2347
+ } elseif ($this->sign_key_file) {
2348
+ try {
2349
+ if (!defined('PKCS7_TEXT')) {
2350
+ throw new phpmailerException($this->lang('extension_missing') . 'openssl');
2351
+ }
2352
+ // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
2353
+ $file = tempnam(sys_get_temp_dir(), 'mail');
2354
+ if (false === file_put_contents($file, $body)) {
2355
+ throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
2356
+ }
2357
+ $signed = tempnam(sys_get_temp_dir(), 'signed');
2358
+ //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
2359
+ if (empty($this->sign_extracerts_file)) {
2360
+ $sign = @openssl_pkcs7_sign(
2361
+ $file,
2362
+ $signed,
2363
+ 'file://' . realpath($this->sign_cert_file),
2364
+ array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
2365
+ null
2366
+ );
2367
+ } else {
2368
+ $sign = @openssl_pkcs7_sign(
2369
+ $file,
2370
+ $signed,
2371
+ 'file://' . realpath($this->sign_cert_file),
2372
+ array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
2373
+ null,
2374
+ PKCS7_DETACHED,
2375
+ $this->sign_extracerts_file
2376
+ );
2377
+ }
2378
+ if ($sign) {
2379
+ @unlink($file);
2380
+ $body = file_get_contents($signed);
2381
+ @unlink($signed);
2382
+ //The message returned by openssl contains both headers and body, so need to split them up
2383
+ $parts = explode("\n\n", $body, 2);
2384
+ $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
2385
+ $body = $parts[1];
2386
+ } else {
2387
+ @unlink($file);
2388
+ @unlink($signed);
2389
+ throw new phpmailerException($this->lang('signing') . openssl_error_string());
2390
+ }
2391
+ } catch (phpmailerException $exc) {
2392
+ $body = '';
2393
+ if ($this->exceptions) {
2394
+ throw $exc;
2395
+ }
2396
+ }
2397
+ }
2398
+ return $body;
2399
+ }
2400
+
2401
+ /**
2402
+ * Return the start of a message boundary.
2403
+ * @access protected
2404
+ * @param string $boundary
2405
+ * @param string $charSet
2406
+ * @param string $contentType
2407
+ * @param string $encoding
2408
+ * @return string
2409
+ */
2410
+ protected function getBoundary($boundary, $charSet, $contentType, $encoding)
2411
+ {
2412
+ $result = '';
2413
+ if ($charSet == '') {
2414
+ $charSet = $this->CharSet;
2415
+ }
2416
+ if ($contentType == '') {
2417
+ $contentType = $this->ContentType;
2418
+ }
2419
+ if ($encoding == '') {
2420
+ $encoding = $this->Encoding;
2421
+ }
2422
+ $result .= $this->textLine('--' . $boundary);
2423
+ $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
2424
+ $result .= $this->LE;
2425
+ // RFC1341 part 5 says 7bit is assumed if not specified
2426
+ if ($encoding != '7bit') {
2427
+ $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
2428
+ }
2429
+ $result .= $this->LE;
2430
+
2431
+ return $result;
2432
+ }
2433
+
2434
+ /**
2435
+ * Return the end of a message boundary.
2436
+ * @access protected
2437
+ * @param string $boundary
2438
+ * @return string
2439
+ */
2440
+ protected function endBoundary($boundary)
2441
+ {
2442
+ return $this->LE . '--' . $boundary . '--' . $this->LE;
2443
+ }
2444
+
2445
+ /**
2446
+ * Set the message type.
2447
+ * PHPMailer only supports some preset message types, not arbitrary MIME structures.
2448
+ * @access protected
2449
+ * @return void
2450
+ */
2451
+ protected function setMessageType()
2452
+ {
2453
+ $type = array();
2454
+ if ($this->alternativeExists()) {
2455
+ $type[] = 'alt';
2456
+ }
2457
+ if ($this->inlineImageExists()) {
2458
+ $type[] = 'inline';
2459
+ }
2460
+ if ($this->attachmentExists()) {
2461
+ $type[] = 'attach';
2462
+ }
2463
+ $this->message_type = implode('_', $type);
2464
+ if ($this->message_type == '') {
2465
+ //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
2466
+ $this->message_type = 'plain';
2467
+ }
2468
+ }
2469
+
2470
+ /**
2471
+ * Format a header line.
2472
+ * @access public
2473
+ * @param string $name
2474
+ * @param string $value
2475
+ * @return string
2476
+ */
2477
+ public function headerLine($name, $value)
2478
+ {
2479
+ return $name . ': ' . $value . $this->LE;
2480
+ }
2481
+
2482
+ /**
2483
+ * Return a formatted mail line.
2484
+ * @access public
2485
+ * @param string $value
2486
+ * @return string
2487
+ */
2488
+ public function textLine($value)
2489
+ {
2490
+ return $value . $this->LE;
2491
+ }
2492
+
2493
+ /**
2494
+ * Add an attachment from a path on the filesystem.
2495
+ * Never use a user-supplied path to a file!
2496
+ * Returns false if the file could not be found or read.
2497
+ * @param string $path Path to the attachment.
2498
+ * @param string $name Overrides the attachment name.
2499
+ * @param string $encoding File encoding (see $Encoding).
2500
+ * @param string $type File extension (MIME) type.
2501
+ * @param string $disposition Disposition to use
2502
+ * @throws phpmailerException
2503
+ * @return boolean
2504
+ */
2505
+ public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
2506
+ {
2507
+ try {
2508
+ if (!@is_file($path)) {
2509
+ throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
2510
+ }
2511
+
2512
+ // If a MIME type is not specified, try to work it out from the file name
2513
+ if ($type == '') {
2514
+ $type = self::filenameToType($path);
2515
+ }
2516
+
2517
+ $filename = basename($path);
2518
+ if ($name == '') {
2519
+ $name = $filename;
2520
+ }
2521
+
2522
+ $this->attachment[] = array(
2523
+ 0 => $path,
2524
+ 1 => $filename,
2525
+ 2 => $name,
2526
+ 3 => $encoding,
2527
+ 4 => $type,
2528
+ 5 => false, // isStringAttachment
2529
+ 6 => $disposition,
2530
+ 7 => 0
2531
+ );
2532
+
2533
+ } catch (phpmailerException $exc) {
2534
+ $this->setError($exc->getMessage());
2535
+ $this->edebug($exc->getMessage());
2536
+ if ($this->exceptions) {
2537
+ throw $exc;
2538
+ }
2539
+ return false;
2540
+ }
2541
+ return true;
2542
+ }
2543
+
2544
+ /**
2545
+ * Return the array of attachments.
2546
+ * @return array
2547
+ */
2548
+ public function getAttachments()
2549
+ {
2550
+ return $this->attachment;
2551
+ }
2552
+
2553
+ /**
2554
+ * Attach all file, string, and binary attachments to the message.
2555
+ * Returns an empty string on failure.
2556
+ * @access protected
2557
+ * @param string $disposition_type
2558
+ * @param string $boundary
2559
+ * @return string
2560
+ */
2561
+ protected function attachAll($disposition_type, $boundary)
2562
+ {
2563
+ // Return text of body
2564
+ $mime = array();
2565
+ $cidUniq = array();
2566
+ $incl = array();
2567
+
2568
+ // Add all attachments
2569
+ foreach ($this->attachment as $attachment) {
2570
+ // Check if it is a valid disposition_filter
2571
+ if ($attachment[6] == $disposition_type) {
2572
+ // Check for string attachment
2573
+ $string = '';
2574
+ $path = '';
2575
+ $bString = $attachment[5];
2576
+ if ($bString) {
2577
+ $string = $attachment[0];
2578
+ } else {
2579
+ $path = $attachment[0];
2580
+ }
2581
+
2582
+ $inclhash = md5(serialize($attachment));
2583
+ if (in_array($inclhash, $incl)) {
2584
+ continue;
2585
+ }
2586
+ $incl[] = $inclhash;
2587
+ $name = $attachment[2];
2588
+ $encoding = $attachment[3];
2589
+ $type = $attachment[4];
2590
+ $disposition = $attachment[6];
2591
+ $cid = $attachment[7];
2592
+ if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
2593
+ continue;
2594
+ }
2595
+ $cidUniq[$cid] = true;
2596
+
2597
+ $mime[] = sprintf('--%s%s', $boundary, $this->LE);
2598
+ //Only include a filename property if we have one
2599
+ if (!empty($name)) {
2600
+ $mime[] = sprintf(
2601
+ 'Content-Type: %s; name="%s"%s',
2602
+ $type,
2603
+ $this->encodeHeader($this->secureHeader($name)),
2604
+ $this->LE
2605
+ );
2606
+ } else {
2607
+ $mime[] = sprintf(
2608
+ 'Content-Type: %s%s',
2609
+ $type,
2610
+ $this->LE
2611
+ );
2612
+ }
2613
+ // RFC1341 part 5 says 7bit is assumed if not specified
2614
+ if ($encoding != '7bit') {
2615
+ $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
2616
+ }
2617
+
2618
+ if ($disposition == 'inline') {
2619
+ $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
2620
+ }
2621
+
2622
+ // If a filename contains any of these chars, it should be quoted,
2623
+ // but not otherwise: RFC2183 & RFC2045 5.1
2624
+ // Fixes a warning in IETF's msglint MIME checker
2625
+ // Allow for bypassing the Content-Disposition header totally
2626
+ if (!(empty($disposition))) {
2627
+ $encoded_name = $this->encodeHeader($this->secureHeader($name));
2628
+ if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
2629
+ $mime[] = sprintf(
2630
+ 'Content-Disposition: %s; filename="%s"%s',
2631
+ $disposition,
2632
+ $encoded_name,
2633
+ $this->LE . $this->LE
2634
+ );
2635
+ } else {
2636
+ if (!empty($encoded_name)) {
2637
+ $mime[] = sprintf(
2638
+ 'Content-Disposition: %s; filename=%s%s',
2639
+ $disposition,
2640
+ $encoded_name,
2641
+ $this->LE . $this->LE
2642
+ );
2643
+ } else {
2644
+ $mime[] = sprintf(
2645
+ 'Content-Disposition: %s%s',
2646
+ $disposition,
2647
+ $this->LE . $this->LE
2648
+ );
2649
+ }
2650
+ }
2651
+ } else {
2652
+ $mime[] = $this->LE;
2653
+ }
2654
+
2655
+ // Encode as string attachment
2656
+ if ($bString) {
2657
+ $mime[] = $this->encodeString($string, $encoding);
2658
+ if ($this->isError()) {
2659
+ return '';
2660
+ }
2661
+ $mime[] = $this->LE . $this->LE;
2662
+ } else {
2663
+ $mime[] = $this->encodeFile($path, $encoding);
2664
+ if ($this->isError()) {
2665
+ return '';
2666
+ }
2667
+ $mime[] = $this->LE . $this->LE;
2668
+ }
2669
+ }
2670
+ }
2671
+
2672
+ $mime[] = sprintf('--%s--%s', $boundary, $this->LE);
2673
+
2674
+ return implode('', $mime);
2675
+ }
2676
+
2677
+ /**
2678
+ * Encode a file attachment in requested format.
2679
+ * Returns an empty string on failure.
2680
+ * @param string $path The full path to the file
2681
+ * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
2682
+ * @throws phpmailerException
2683
+ * @access protected
2684
+ * @return string
2685
+ */
2686
+ protected function encodeFile($path, $encoding = 'base64')
2687
+ {
2688
+ try {
2689
+ if (!is_readable($path)) {
2690
+ throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
2691
+ }
2692
+ $magic_quotes = get_magic_quotes_runtime();
2693
+ if ($magic_quotes) {
2694
+ if (version_compare(PHP_VERSION, '5.3.0', '<')) {
2695
+ set_magic_quotes_runtime(false);
2696
+ } else {
2697
+ //Doesn't exist in PHP 5.4, but we don't need to check because
2698
+ //get_magic_quotes_runtime always returns false in 5.4+
2699
+ //so it will never get here
2700
+ ini_set('magic_quotes_runtime', false);
2701
+ }
2702
+ }
2703
+ $file_buffer = file_get_contents($path);
2704
+ $file_buffer = $this->encodeString($file_buffer, $encoding);
2705
+ if ($magic_quotes) {
2706
+ if (version_compare(PHP_VERSION, '5.3.0', '<')) {
2707
+ set_magic_quotes_runtime($magic_quotes);
2708
+ } else {
2709
+ ini_set('magic_quotes_runtime', $magic_quotes);
2710
+ }
2711
+ }
2712
+ return $file_buffer;
2713
+ } catch (Exception $exc) {
2714
+ $this->setError($exc->getMessage());
2715
+ return '';
2716
+ }
2717
+ }
2718
+
2719
+ /**
2720
+ * Encode a string in requested format.
2721
+ * Returns an empty string on failure.
2722
+ * @param string $str The text to encode
2723
+ * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
2724
+ * @access public
2725
+ * @return string
2726
+ */
2727
+ public function encodeString($str, $encoding = 'base64')
2728
+ {
2729
+ $encoded = '';
2730
+ switch (strtolower($encoding)) {
2731
+ case 'base64':
2732
+ $encoded = chunk_split(base64_encode($str), 76, $this->LE);
2733
+ break;
2734
+ case '7bit':
2735
+ case '8bit':
2736
+ $encoded = $this->fixEOL($str);
2737
+ // Make sure it ends with a line break
2738
+ if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
2739
+ $encoded .= $this->LE;
2740
+ }
2741
+ break;
2742
+ case 'binary':
2743
+ $encoded = $str;
2744
+ break;
2745
+ case 'quoted-printable':
2746
+ $encoded = $this->encodeQP($str);
2747
+ break;
2748
+ default:
2749
+ $this->setError($this->lang('encoding') . $encoding);
2750
+ break;
2751
+ }
2752
+ return $encoded;
2753
+ }
2754
+
2755
+ /**
2756
+ * Encode a header string optimally.
2757
+ * Picks shortest of Q, B, quoted-printable or none.
2758
+ * @access public
2759
+ * @param string $str
2760
+ * @param string $position
2761
+ * @return string
2762
+ */
2763
+ public function encodeHeader($str, $position = 'text')
2764
+ {
2765
+ $matchcount = 0;
2766
+ switch (strtolower($position)) {
2767
+ case 'phrase':
2768
+ if (!preg_match('/[\200-\377]/', $str)) {
2769
+ // Can't use addslashes as we don't know the value of magic_quotes_sybase
2770
+ $encoded = addcslashes($str, "\0..\37\177\\\"");
2771
+ if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
2772
+ return ($encoded);
2773
+ } else {
2774
+ return ("\"$encoded\"");
2775
+ }
2776
+ }
2777
+ $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
2778
+ break;
2779
+ /** @noinspection PhpMissingBreakStatementInspection */
2780
+ case 'comment':
2781
+ $matchcount = preg_match_all('/[()"]/', $str, $matches);
2782
+ // Intentional fall-through
2783
+ case 'text':
2784
+ default:
2785
+ $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
2786
+ break;
2787
+ }
2788
+
2789
+ //There are no chars that need encoding
2790
+ if ($matchcount == 0) {
2791
+ return ($str);
2792
+ }
2793
+
2794
+ $maxlen = 75 - 7 - strlen($this->CharSet);
2795
+ // Try to select the encoding which should produce the shortest output
2796
+ if ($matchcount > strlen($str) / 3) {
2797
+ // More than a third of the content will need encoding, so B encoding will be most efficient
2798
+ $encoding = 'B';
2799
+ if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
2800
+ // Use a custom function which correctly encodes and wraps long
2801
+ // multibyte strings without breaking lines within a character
2802
+ $encoded = $this->base64EncodeWrapMB($str, "\n");
2803
+ } else {
2804
+ $encoded = base64_encode($str);
2805
+ $maxlen -= $maxlen % 4;
2806
+ $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
2807
+ }
2808
+ } else {
2809
+ $encoding = 'Q';
2810
+ $encoded = $this->encodeQ($str, $position);
2811
+ $encoded = $this->wrapText($encoded, $maxlen, true);
2812
+ $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
2813
+ }
2814
+
2815
+ $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
2816
+ $encoded = trim(str_replace("\n", $this->LE, $encoded));
2817
+
2818
+ return $encoded;
2819
+ }
2820
+
2821
+ /**
2822
+ * Check if a string contains multi-byte characters.
2823
+ * @access public
2824
+ * @param string $str multi-byte text to wrap encode
2825
+ * @return boolean
2826
+ */
2827
+ public function hasMultiBytes($str)
2828
+ {
2829
+ if (function_exists('mb_strlen')) {
2830
+ return (strlen($str) > mb_strlen($str, $this->CharSet));
2831
+ } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
2832
+ return false;
2833
+ }
2834
+ }
2835
+
2836
+ /**
2837
+ * Does a string contain any 8-bit chars (in any charset)?
2838
+ * @param string $text
2839
+ * @return boolean
2840
+ */
2841
+ public function has8bitChars($text)
2842
+ {
2843
+ return (boolean)preg_match('/[\x80-\xFF]/', $text);
2844
+ }
2845
+
2846
+ /**
2847
+ * Encode and wrap long multibyte strings for mail headers
2848
+ * without breaking lines within a character.
2849
+ * Adapted from a function by paravoid
2850
+ * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
2851
+ * @access public
2852
+ * @param string $str multi-byte text to wrap encode
2853
+ * @param string $linebreak string to use as linefeed/end-of-line
2854
+ * @return string
2855
+ */
2856
+ public function base64EncodeWrapMB($str, $linebreak = null)
2857
+ {
2858
+ $start = '=?' . $this->CharSet . '?B?';
2859
+ $end = '?=';
2860
+ $encoded = '';
2861
+ if ($linebreak === null) {
2862
+ $linebreak = $this->LE;
2863
+ }
2864
+
2865
+ $mb_length = mb_strlen($str, $this->CharSet);
2866
+ // Each line must have length <= 75, including $start and $end
2867
+ $length = 75 - strlen($start) - strlen($end);
2868
+ // Average multi-byte ratio
2869
+ $ratio = $mb_length / strlen($str);
2870
+ // Base64 has a 4:3 ratio
2871
+ $avgLength = floor($length * $ratio * .75);
2872
+
2873
+ for ($i = 0; $i < $mb_length; $i += $offset) {
2874
+ $lookBack = 0;
2875
+ do {
2876
+ $offset = $avgLength - $lookBack;
2877
+ $chunk = mb_substr($str, $i, $offset, $this->CharSet);
2878
+ $chunk = base64_encode($chunk);
2879
+ $lookBack++;
2880
+ } while (strlen($chunk) > $length);
2881
+ $encoded .= $chunk . $linebreak;
2882
+ }
2883
+
2884
+ // Chomp the last linefeed
2885
+ $encoded = substr($encoded, 0, -strlen($linebreak));
2886
+ return $encoded;
2887
+ }
2888
+
2889
+ /**
2890
+ * Encode a string in quoted-printable format.
2891
+ * According to RFC2045 section 6.7.
2892
+ * @access public
2893
+ * @param string $string The text to encode
2894
+ * @param integer $line_max Number of chars allowed on a line before wrapping
2895
+ * @return string
2896
+ * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
2897
+ */
2898
+ public function encodeQP($string, $line_max = 76)
2899
+ {
2900
+ // Use native function if it's available (>= PHP5.3)
2901
+ if (function_exists('quoted_printable_encode')) {
2902
+ return quoted_printable_encode($string);
2903
+ }
2904
+ // Fall back to a pure PHP implementation
2905
+ $string = str_replace(
2906
+ array('%20', '%0D%0A.', '%0D%0A', '%'),
2907
+ array(' ', "\r\n=2E", "\r\n", '='),
2908
+ rawurlencode($string)
2909
+ );
2910
+ return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
2911
+ }
2912
+
2913
+ /**
2914
+ * Backward compatibility wrapper for an old QP encoding function that was removed.
2915
+ * @see PHPMailer::encodeQP()
2916
+ * @access public
2917
+ * @param string $string
2918
+ * @param integer $line_max
2919
+ * @param boolean $space_conv
2920
+ * @return string
2921
+ * @deprecated Use encodeQP instead.
2922
+ */
2923
+ public function encodeQPphp(
2924
+ $string,
2925
+ $line_max = 76,
2926
+ /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
2927
+ ) {
2928
+ return $this->encodeQP($string, $line_max);
2929
+ }
2930
+
2931
+ /**
2932
+ * Encode a string using Q encoding.
2933
+ * @link http://tools.ietf.org/html/rfc2047
2934
+ * @param string $str the text to encode
2935
+ * @param string $position Where the text is going to be used, see the RFC for what that means
2936
+ * @access public
2937
+ * @return string
2938
+ */
2939
+ public function encodeQ($str, $position = 'text')
2940
+ {
2941
+ // There should not be any EOL in the string
2942
+ $pattern = '';
2943
+ $encoded = str_replace(array("\r", "\n"), '', $str);
2944
+ switch (strtolower($position)) {
2945
+ case 'phrase':
2946
+ // RFC 2047 section 5.3
2947
+ $pattern = '^A-Za-z0-9!*+\/ -';
2948
+ break;
2949
+ /** @noinspection PhpMissingBreakStatementInspection */
2950
+ case 'comment':
2951
+ // RFC 2047 section 5.2
2952
+ $pattern = '\(\)"';
2953
+ // intentional fall-through
2954
+ // for this reason we build the $pattern without including delimiters and []
2955
+ case 'text':
2956
+ default:
2957
+ // RFC 2047 section 5.1
2958
+ // Replace every high ascii, control, =, ? and _ characters
2959
+ $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
2960
+ break;
2961
+ }
2962
+ $matches = array();
2963
+ if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
2964
+ // If the string contains an '=', make sure it's the first thing we replace
2965
+ // so as to avoid double-encoding
2966
+ $eqkey = array_search('=', $matches[0]);
2967
+ if (false !== $eqkey) {
2968
+ unset($matches[0][$eqkey]);
2969
+ array_unshift($matches[0], '=');
2970
+ }
2971
+ foreach (array_unique($matches[0]) as $char) {
2972
+ $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
2973
+ }
2974
+ }
2975
+ // Replace every spaces to _ (more readable than =20)
2976
+ return str_replace(' ', '_', $encoded);
2977
+ }
2978
+
2979
+ /**
2980
+ * Add a string or binary attachment (non-filesystem).
2981
+ * This method can be used to attach ascii or binary data,
2982
+ * such as a BLOB record from a database.
2983
+ * @param string $string String attachment data.
2984
+ * @param string $filename Name of the attachment.
2985
+ * @param string $encoding File encoding (see $Encoding).
2986
+ * @param string $type File extension (MIME) type.
2987
+ * @param string $disposition Disposition to use
2988
+ * @return void
2989
+ */
2990
+ public function addStringAttachment(
2991
+ $string,
2992
+ $filename,
2993
+ $encoding = 'base64',
2994
+ $type = '',
2995
+ $disposition = 'attachment'
2996
+ ) {
2997
+ // If a MIME type is not specified, try to work it out from the file name
2998
+ if ($type == '') {
2999
+ $type = self::filenameToType($filename);
3000
+ }
3001
+ // Append to $attachment array
3002
+ $this->attachment[] = array(
3003
+ 0 => $string,
3004
+ 1 => $filename,
3005
+ 2 => basename($filename),
3006
+ 3 => $encoding,
3007
+ 4 => $type,
3008
+ 5 => true, // isStringAttachment
3009
+ 6 => $disposition,
3010
+ 7 => 0
3011
+ );
3012
+ }
3013
+
3014
+ /**
3015
+ * Add an embedded (inline) attachment from a file.
3016
+ * This can include images, sounds, and just about any other document type.
3017
+ * These differ from 'regular' attachments in that they are intended to be
3018
+ * displayed inline with the message, not just attached for download.
3019
+ * This is used in HTML messages that embed the images
3020
+ * the HTML refers to using the $cid value.
3021
+ * Never use a user-supplied path to a file!
3022
+ * @param string $path Path to the attachment.
3023
+ * @param string $cid Content ID of the attachment; Use this to reference
3024
+ * the content when using an embedded image in HTML.
3025
+ * @param string $name Overrides the attachment name.
3026
+ * @param string $encoding File encoding (see $Encoding).
3027
+ * @param string $type File MIME type.
3028
+ * @param string $disposition Disposition to use
3029
+ * @return boolean True on successfully adding an attachment
3030
+ */
3031
+ public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
3032
+ {
3033
+ if (!@is_file($path)) {
3034
+ $this->setError($this->lang('file_access') . $path);
3035
+ return false;
3036
+ }
3037
+
3038
+ // If a MIME type is not specified, try to work it out from the file name
3039
+ if ($type == '') {
3040
+ $type = self::filenameToType($path);
3041
+ }
3042
+
3043
+ $filename = basename($path);
3044
+ if ($name == '') {
3045
+ $name = $filename;
3046
+ }
3047
+
3048
+ // Append to $attachment array
3049
+ $this->attachment[] = array(
3050
+ 0 => $path,
3051
+ 1 => $filename,
3052
+ 2 => $name,
3053
+ 3 => $encoding,
3054
+ 4 => $type,
3055
+ 5 => false, // isStringAttachment
3056
+ 6 => $disposition,
3057
+ 7 => $cid
3058
+ );
3059
+ return true;
3060
+ }
3061
+
3062
+ /**
3063
+ * Add an embedded stringified attachment.
3064
+ * This can include images, sounds, and just about any other document type.
3065
+ * Be sure to set the $type to an image type for images:
3066
+ * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
3067
+ * @param string $string The attachment binary data.
3068
+ * @param string $cid Content ID of the attachment; Use this to reference
3069
+ * the content when using an embedded image in HTML.
3070
+ * @param string $name
3071
+ * @param string $encoding File encoding (see $Encoding).
3072
+ * @param string $type MIME type.
3073
+ * @param string $disposition Disposition to use
3074
+ * @return boolean True on successfully adding an attachment
3075
+ */
3076
+ public function addStringEmbeddedImage(
3077
+ $string,
3078
+ $cid,
3079
+ $name = '',
3080
+ $encoding = 'base64',
3081
+ $type = '',
3082
+ $disposition = 'inline'
3083
+ ) {
3084
+ // If a MIME type is not specified, try to work it out from the name
3085
+ if ($type == '' and !empty($name)) {
3086
+ $type = self::filenameToType($name);
3087
+ }
3088
+
3089
+ // Append to $attachment array
3090
+ $this->attachment[] = array(
3091
+ 0 => $string,
3092
+ 1 => $name,
3093
+ 2 => $name,
3094
+ 3 => $encoding,
3095
+ 4 => $type,
3096
+ 5 => true, // isStringAttachment
3097
+ 6 => $disposition,
3098
+ 7 => $cid
3099
+ );
3100
+ return true;
3101
+ }
3102
+
3103
+ /**
3104
+ * Check if an inline attachment is present.
3105
+ * @access public
3106
+ * @return boolean
3107
+ */
3108
+ public function inlineImageExists()
3109
+ {
3110
+ foreach ($this->attachment as $attachment) {
3111
+ if ($attachment[6] == 'inline') {
3112
+ return true;
3113
+ }
3114
+ }
3115
+ return false;
3116
+ }
3117
+
3118
+ /**
3119
+ * Check if an attachment (non-inline) is present.
3120
+ * @return boolean
3121
+ */
3122
+ public function attachmentExists()
3123
+ {
3124
+ foreach ($this->attachment as $attachment) {
3125
+ if ($attachment[6] == 'attachment') {
3126
+ return true;
3127
+ }
3128
+ }
3129
+ return false;
3130
+ }
3131
+
3132
+ /**
3133
+ * Check if this message has an alternative body set.
3134
+ * @return boolean
3135
+ */
3136
+ public function alternativeExists()
3137
+ {
3138
+ return !empty($this->AltBody);
3139
+ }
3140
+
3141
+ /**
3142
+ * Clear queued addresses of given kind.
3143
+ * @access protected
3144
+ * @param string $kind 'to', 'cc', or 'bcc'
3145
+ * @return void
3146
+ */
3147
+ public function clearQueuedAddresses($kind)
3148
+ {
3149
+ $RecipientsQueue = $this->RecipientsQueue;
3150
+ foreach ($RecipientsQueue as $address => $params) {
3151
+ if ($params[0] == $kind) {
3152
+ unset($this->RecipientsQueue[$address]);
3153
+ }
3154
+ }
3155
+ }
3156
+
3157
+ /**
3158
+ * Clear all To recipients.
3159
+ * @return void
3160
+ */
3161
+ public function clearAddresses()
3162
+ {
3163
+ foreach ($this->to as $to) {
3164
+ unset($this->all_recipients[strtolower($to[0])]);
3165
+ }
3166
+ $this->to = array();
3167
+ $this->clearQueuedAddresses('to');
3168
+ }
3169
+
3170
+ /**
3171
+ * Clear all CC recipients.
3172
+ * @return void
3173
+ */
3174
+ public function clearCCs()
3175
+ {
3176
+ foreach ($this->cc as $cc) {
3177
+ unset($this->all_recipients[strtolower($cc[0])]);
3178
+ }
3179
+ $this->cc = array();
3180
+ $this->clearQueuedAddresses('cc');
3181
+ }
3182
+
3183
+ /**
3184
+ * Clear all BCC recipients.
3185
+ * @return void
3186
+ */
3187
+ public function clearBCCs()
3188
+ {
3189
+ foreach ($this->bcc as $bcc) {
3190
+ unset($this->all_recipients[strtolower($bcc[0])]);
3191
+ }
3192
+ $this->bcc = array();
3193
+ $this->clearQueuedAddresses('bcc');
3194
+ }
3195
+
3196
+ /**
3197
+ * Clear all ReplyTo recipients.
3198
+ * @return void
3199
+ */
3200
+ public function clearReplyTos()
3201
+ {
3202
+ $this->ReplyTo = array();
3203
+ $this->ReplyToQueue = array();
3204
+ }
3205
+
3206
+ /**
3207
+ * Clear all recipient types.
3208
+ * @return void
3209
+ */
3210
+ public function clearAllRecipients()
3211
+ {
3212
+ $this->to = array();
3213
+ $this->cc = array();
3214
+ $this->bcc = array();
3215
+ $this->all_recipients = array();
3216
+ $this->RecipientsQueue = array();
3217
+ }
3218
+
3219
+ /**
3220
+ * Clear all filesystem, string, and binary attachments.
3221
+ * @return void
3222
+ */
3223
+ public function clearAttachments()
3224
+ {
3225
+ $this->attachment = array();
3226
+ }
3227
+
3228
+ /**
3229
+ * Clear all custom headers.
3230
+ * @return void
3231
+ */
3232
+ public function clearCustomHeaders()
3233
+ {
3234
+ $this->CustomHeader = array();
3235
+ }
3236
+
3237
+ /**
3238
+ * Add an error message to the error container.
3239
+ * @access protected
3240
+ * @param string $msg
3241
+ * @return void
3242
+ */
3243
+ protected function setError($msg)
3244
+ {
3245
+ $this->error_count++;
3246
+ if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
3247
+ $lasterror = $this->smtp->getError();
3248
+ if (!empty($lasterror['error'])) {
3249
+ $msg .= $this->lang('smtp_error') . $lasterror['error'];
3250
+ if (!empty($lasterror['detail'])) {
3251
+ $msg .= ' Detail: '. $lasterror['detail'];
3252
+ }
3253
+ if (!empty($lasterror['smtp_code'])) {
3254
+ $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
3255
+ }
3256
+ if (!empty($lasterror['smtp_code_ex'])) {
3257
+ $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
3258
+ }
3259
+ }
3260
+ }
3261
+ $this->ErrorInfo = $msg;
3262
+ }
3263
+
3264
+ /**
3265
+ * Return an RFC 822 formatted date.
3266
+ * @access public
3267
+ * @return string
3268
+ * @static
3269
+ */
3270
+ public static function rfcDate()
3271
+ {
3272
+ // Set the time zone to whatever the default is to avoid 500 errors
3273
+ // Will default to UTC if it's not set properly in php.ini
3274
+ date_default_timezone_set(@date_default_timezone_get());
3275
+ return date('D, j M Y H:i:s O');
3276
+ }
3277
+
3278
+ /**
3279
+ * Get the server hostname.
3280
+ * Returns 'localhost.localdomain' if unknown.
3281
+ * @access protected
3282
+ * @return string
3283
+ */
3284
+ protected function serverHostname()
3285
+ {
3286
+ $result = 'localhost.localdomain';
3287
+ if (!empty($this->Hostname)) {
3288
+ $result = $this->Hostname;
3289
+ } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
3290
+ $result = $_SERVER['SERVER_NAME'];
3291
+ } elseif (function_exists('gethostname') && gethostname() !== false) {
3292
+ $result = gethostname();
3293
+ } elseif (php_uname('n') !== false) {
3294
+ $result = php_uname('n');
3295
+ }
3296
+ return $result;
3297
+ }
3298
+
3299
+ /**
3300
+ * Get an error message in the current language.
3301
+ * @access protected
3302
+ * @param string $key
3303
+ * @return string
3304
+ */
3305
+ protected function lang($key)
3306
+ {
3307
+ if (count($this->language) < 1) {
3308
+ $this->setLanguage('en'); // set the default language
3309
+ }
3310
+
3311
+ if (array_key_exists($key, $this->language)) {
3312
+ if ($key == 'smtp_connect_failed') {
3313
+ //Include a link to troubleshooting docs on SMTP connection failure
3314
+ //this is by far the biggest cause of support questions
3315
+ //but it's usually not PHPMailer's fault.
3316
+ return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
3317
+ }
3318
+ return $this->language[$key];
3319
+ } else {
3320
+ //Return the key as a fallback
3321
+ return $key;
3322
+ }
3323
+ }
3324
+
3325
+ /**
3326
+ * Check if an error occurred.
3327
+ * @access public
3328
+ * @return boolean True if an error did occur.
3329
+ */
3330
+ public function isError()
3331
+ {
3332
+ return ($this->error_count > 0);
3333
+ }
3334
+
3335
+ /**
3336
+ * Ensure consistent line endings in a string.
3337
+ * Changes every end of line from CRLF, CR or LF to $this->LE.
3338
+ * @access public
3339
+ * @param string $str String to fixEOL
3340
+ * @return string
3341
+ */
3342
+ public function fixEOL($str)
3343
+ {
3344
+ // Normalise to \n
3345
+ $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
3346
+ // Now convert LE as needed
3347
+ if ($this->LE !== "\n") {
3348
+ $nstr = str_replace("\n", $this->LE, $nstr);
3349
+ }
3350
+ return $nstr;
3351
+ }
3352
+
3353
+ /**
3354
+ * Add a custom header.
3355
+ * $name value can be overloaded to contain
3356
+ * both header name and value (name:value)
3357
+ * @access public
3358
+ * @param string $name Custom header name
3359
+ * @param string $value Header value
3360
+ * @return void
3361
+ */
3362
+ public function addCustomHeader($name, $value = null)
3363
+ {
3364
+ if ($value === null) {
3365
+ // Value passed in as name:value
3366
+ $this->CustomHeader[] = explode(':', $name, 2);
3367
+ } else {
3368
+ $this->CustomHeader[] = array($name, $value);
3369
+ }
3370
+ }
3371
+
3372
+ /**
3373
+ * Returns all custom headers.
3374
+ * @return array
3375
+ */
3376
+ public function getCustomHeaders()
3377
+ {
3378
+ return $this->CustomHeader;
3379
+ }
3380
+
3381
+ /**
3382
+ * Create a message body from an HTML string.
3383
+ * Automatically inlines images and creates a plain-text version by converting the HTML,
3384
+ * overwriting any existing values in Body and AltBody.
3385
+ * Do not source $message content from user input!
3386
+ * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
3387
+ * will look for an image file in $basedir/images/a.png and convert it to inline.
3388
+ * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
3389
+ * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
3390
+ * @access public
3391
+ * @param string $message HTML message string
3392
+ * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
3393
+ * @param boolean|callable $advanced Whether to use the internal HTML to text converter
3394
+ * or your own custom converter @see PHPMailer::html2text()
3395
+ * @return string $message The transformed message Body
3396
+ */
3397
+ public function msgHTML($message, $basedir = '', $advanced = false)
3398
+ {
3399
+ preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
3400
+ if (array_key_exists(2, $images)) {
3401
+ if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
3402
+ // Ensure $basedir has a trailing /
3403
+ $basedir .= '/';
3404
+ }
3405
+ foreach ($images[2] as $imgindex => $url) {
3406
+ // Convert data URIs into embedded images
3407
+ if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
3408
+ $data = substr($url, strpos($url, ','));
3409
+ if ($match[2]) {
3410
+ $data = base64_decode($data);
3411
+ } else {
3412
+ $data = rawurldecode($data);
3413
+ }
3414
+ $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
3415
+ if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
3416
+ $message = str_replace(
3417
+ $images[0][$imgindex],
3418
+ $images[1][$imgindex] . '="cid:' . $cid . '"',
3419
+ $message
3420
+ );
3421
+ }
3422
+ continue;
3423
+ }
3424
+ if (
3425
+ // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
3426
+ !empty($basedir)
3427
+ // Ignore URLs containing parent dir traversal (..)
3428
+ && (strpos($url, '..') === false)
3429
+ // Do not change urls that are already inline images
3430
+ && substr($url, 0, 4) !== 'cid:'
3431
+ // Do not change absolute URLs, including anonymous protocol
3432
+ && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
3433
+ ) {
3434
+ $filename = basename($url);
3435
+ $directory = dirname($url);
3436
+ if ($directory == '.') {
3437
+ $directory = '';
3438
+ }
3439
+ $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
3440
+ if (strlen($directory) > 1 && substr($directory, -1) != '/') {
3441
+ $directory .= '/';
3442
+ }
3443
+ if ($this->addEmbeddedImage(
3444
+ $basedir . $directory . $filename,
3445
+ $cid,
3446
+ $filename,
3447
+ 'base64',
3448
+ self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
3449
+ )
3450
+ ) {
3451
+ $message = preg_replace(
3452
+ '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
3453
+ $images[1][$imgindex] . '="cid:' . $cid . '"',
3454
+ $message
3455
+ );
3456
+ }
3457
+ }
3458
+ }
3459
+ }
3460
+ $this->isHTML(true);
3461
+ // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
3462
+ $this->Body = $this->normalizeBreaks($message);
3463
+ $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
3464
+ if (!$this->alternativeExists()) {
3465
+ $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
3466
+ self::CRLF . self::CRLF;
3467
+ }
3468
+ return $this->Body;
3469
+ }
3470
+
3471
+ /**
3472
+ * Convert an HTML string into plain text.
3473
+ * This is used by msgHTML().
3474
+ * Note - older versions of this function used a bundled advanced converter
3475
+ * which was been removed for license reasons in #232.
3476
+ * Example usage:
3477
+ * <code>
3478
+ * // Use default conversion
3479
+ * $plain = $mail->html2text($html);
3480
+ * // Use your own custom converter
3481
+ * $plain = $mail->html2text($html, function($html) {
3482
+ * $converter = new MyHtml2text($html);
3483
+ * return $converter->get_text();
3484
+ * });
3485
+ * </code>
3486
+ * @param string $html The HTML text to convert
3487
+ * @param boolean|callable $advanced Any boolean value to use the internal converter,
3488
+ * or provide your own callable for custom conversion.
3489
+ * @return string
3490
+ */
3491
+ public function html2text($html, $advanced = false)
3492
+ {
3493
+ if (is_callable($advanced)) {
3494
+ return call_user_func($advanced, $html);
3495
+ }
3496
+ return html_entity_decode(
3497
+ trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
3498
+ ENT_QUOTES,
3499
+ $this->CharSet
3500
+ );
3501
+ }
3502
+
3503
+ /**
3504
+ * Get the MIME type for a file extension.
3505
+ * @param string $ext File extension
3506
+ * @access public
3507
+ * @return string MIME type of file.
3508
+ * @static
3509
+ */
3510
+ public static function _mime_types($ext = '')
3511
+ {
3512
+ $mimes = array(
3513
+ 'xl' => 'application/excel',
3514
+ 'js' => 'application/javascript',
3515
+ 'hqx' => 'application/mac-binhex40',
3516
+ 'cpt' => 'application/mac-compactpro',
3517
+ 'bin' => 'application/macbinary',
3518
+ 'doc' => 'application/msword',
3519
+ 'word' => 'application/msword',
3520
+ 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
3521
+ 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
3522
+ 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
3523
+ 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
3524
+ 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
3525
+ 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
3526
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
3527
+ 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
3528
+ 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
3529
+ 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
3530
+ 'class' => 'application/octet-stream',
3531
+ 'dll' => 'application/octet-stream',
3532
+ 'dms' => 'application/octet-stream',
3533
+ 'exe' => 'application/octet-stream',
3534
+ 'lha' => 'application/octet-stream',
3535
+ 'lzh' => 'application/octet-stream',
3536
+ 'psd' => 'application/octet-stream',
3537
+ 'sea' => 'application/octet-stream',
3538
+ 'so' => 'application/octet-stream',
3539
+ 'oda' => 'application/oda',
3540
+ 'pdf' => 'application/pdf',
3541
+ 'ai' => 'application/postscript',
3542
+ 'eps' => 'application/postscript',
3543
+ 'ps' => 'application/postscript',
3544
+ 'smi' => 'application/smil',
3545
+ 'smil' => 'application/smil',
3546
+ 'mif' => 'application/vnd.mif',
3547
+ 'xls' => 'application/vnd.ms-excel',
3548
+ 'ppt' => 'application/vnd.ms-powerpoint',
3549
+ 'wbxml' => 'application/vnd.wap.wbxml',
3550
+ 'wmlc' => 'application/vnd.wap.wmlc',
3551
+ 'dcr' => 'application/x-director',
3552
+ 'dir' => 'application/x-director',
3553
+ 'dxr' => 'application/x-director',
3554
+ 'dvi' => 'application/x-dvi',
3555
+ 'gtar' => 'application/x-gtar',
3556
+ 'php3' => 'application/x-httpd-php',
3557
+ 'php4' => 'application/x-httpd-php',
3558
+ 'php' => 'application/x-httpd-php',
3559
+ 'phtml' => 'application/x-httpd-php',
3560
+ 'phps' => 'application/x-httpd-php-source',
3561
+ 'swf' => 'application/x-shockwave-flash',
3562
+ 'sit' => 'application/x-stuffit',
3563
+ 'tar' => 'application/x-tar',
3564
+ 'tgz' => 'application/x-tar',
3565
+ 'xht' => 'application/xhtml+xml',
3566
+ 'xhtml' => 'application/xhtml+xml',
3567
+ 'zip' => 'application/zip',
3568
+ 'mid' => 'audio/midi',
3569
+ 'midi' => 'audio/midi',
3570
+ 'mp2' => 'audio/mpeg',
3571
+ 'mp3' => 'audio/mpeg',
3572
+ 'mpga' => 'audio/mpeg',
3573
+ 'aif' => 'audio/x-aiff',
3574
+ 'aifc' => 'audio/x-aiff',
3575
+ 'aiff' => 'audio/x-aiff',
3576
+ 'ram' => 'audio/x-pn-realaudio',
3577
+ 'rm' => 'audio/x-pn-realaudio',
3578
+ 'rpm' => 'audio/x-pn-realaudio-plugin',
3579
+ 'ra' => 'audio/x-realaudio',
3580
+ 'wav' => 'audio/x-wav',
3581
+ 'bmp' => 'image/bmp',
3582
+ 'gif' => 'image/gif',
3583
+ 'jpeg' => 'image/jpeg',
3584
+ 'jpe' => 'image/jpeg',
3585
+ 'jpg' => 'image/jpeg',
3586
+ 'png' => 'image/png',
3587
+ 'tiff' => 'image/tiff',
3588
+ 'tif' => 'image/tiff',
3589
+ 'eml' => 'message/rfc822',
3590
+ 'css' => 'text/css',
3591
+ 'html' => 'text/html',
3592
+ 'htm' => 'text/html',
3593
+ 'shtml' => 'text/html',
3594
+ 'log' => 'text/plain',
3595
+ 'text' => 'text/plain',
3596
+ 'txt' => 'text/plain',
3597
+ 'rtx' => 'text/richtext',
3598
+ 'rtf' => 'text/rtf',
3599
+ 'vcf' => 'text/vcard',
3600
+ 'vcard' => 'text/vcard',
3601
+ 'xml' => 'text/xml',
3602
+ 'xsl' => 'text/xml',
3603
+ 'mpeg' => 'video/mpeg',
3604
+ 'mpe' => 'video/mpeg',
3605
+ 'mpg' => 'video/mpeg',
3606
+ 'mov' => 'video/quicktime',
3607
+ 'qt' => 'video/quicktime',
3608
+ 'rv' => 'video/vnd.rn-realvideo',
3609
+ 'avi' => 'video/x-msvideo',
3610
+ 'movie' => 'video/x-sgi-movie'
3611
+ );
3612
+ if (array_key_exists(strtolower($ext), $mimes)) {
3613
+ return $mimes[strtolower($ext)];
3614
+ }
3615
+ return 'application/octet-stream';
3616
+ }
3617
+
3618
+ /**
3619
+ * Map a file name to a MIME type.
3620
+ * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
3621
+ * @param string $filename A file name or full path, does not need to exist as a file
3622
+ * @return string
3623
+ * @static
3624
+ */
3625
+ public static function filenameToType($filename)
3626
+ {
3627
+ // In case the path is a URL, strip any query string before getting extension
3628
+ $qpos = strpos($filename, '?');
3629
+ if (false !== $qpos) {
3630
+ $filename = substr($filename, 0, $qpos);
3631
+ }
3632
+ $pathinfo = self::mb_pathinfo($filename);
3633
+ return self::_mime_types($pathinfo['extension']);
3634
+ }
3635
+
3636
+ /**
3637
+ * Multi-byte-safe pathinfo replacement.
3638
+ * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
3639
+ * Works similarly to the one in PHP >= 5.2.0
3640
+ * @link http://www.php.net/manual/en/function.pathinfo.php#107461
3641
+ * @param string $path A filename or path, does not need to exist as a file
3642
+ * @param integer|string $options Either a PATHINFO_* constant,
3643
+ * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
3644
+ * @return string|array
3645
+ * @static
3646
+ */
3647
+ public static function mb_pathinfo($path, $options = null)
3648
+ {
3649
+ $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
3650
+ $pathinfo = array();
3651
+ if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
3652
+ if (array_key_exists(1, $pathinfo)) {
3653
+ $ret['dirname'] = $pathinfo[1];
3654
+ }
3655
+ if (array_key_exists(2, $pathinfo)) {
3656
+ $ret['basename'] = $pathinfo[2];
3657
+ }
3658
+ if (array_key_exists(5, $pathinfo)) {
3659
+ $ret['extension'] = $pathinfo[5];
3660
+ }
3661
+ if (array_key_exists(3, $pathinfo)) {
3662
+ $ret['filename'] = $pathinfo[3];
3663
+ }
3664
+ }
3665
+ switch ($options) {
3666
+ case PATHINFO_DIRNAME:
3667
+ case 'dirname':
3668
+ return $ret['dirname'];
3669
+ case PATHINFO_BASENAME:
3670
+ case 'basename':
3671
+ return $ret['basename'];
3672
+ case PATHINFO_EXTENSION:
3673
+ case 'extension':
3674
+ return $ret['extension'];
3675
+ case PATHINFO_FILENAME:
3676
+ case 'filename':
3677
+ return $ret['filename'];
3678
+ default:
3679
+ return $ret;
3680
+ }
3681
+ }
3682
+
3683
+ /**
3684
+ * Set or reset instance properties.
3685
+ * You should avoid this function - it's more verbose, less efficient, more error-prone and
3686
+ * harder to debug than setting properties directly.
3687
+ * Usage Example:
3688
+ * `$mail->set('SMTPSecure', 'tls');`
3689
+ * is the same as:
3690
+ * `$mail->SMTPSecure = 'tls';`
3691
+ * @access public
3692
+ * @param string $name The property name to set
3693
+ * @param mixed $value The value to set the property to
3694
+ * @return boolean
3695
+ * @TODO Should this not be using the __set() magic function?
3696
+ */
3697
+ public function set($name, $value = '')
3698
+ {
3699
+ if (property_exists($this, $name)) {
3700
+ $this->$name = $value;
3701
+ return true;
3702
+ } else {
3703
+ $this->setError($this->lang('variable_set') . $name);
3704
+ return false;
3705
+ }
3706
+ }
3707
+
3708
+ /**
3709
+ * Strip newlines to prevent header injection.
3710
+ * @access public
3711
+ * @param string $str
3712
+ * @return string
3713
+ */
3714
+ public function secureHeader($str)
3715
+ {
3716
+ return trim(str_replace(array("\r", "\n"), '', $str));
3717
+ }
3718
+
3719
+ /**
3720
+ * Normalize line breaks in a string.
3721
+ * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
3722
+ * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
3723
+ * @param string $text
3724
+ * @param string $breaktype What kind of line break to use, defaults to CRLF
3725
+ * @return string
3726
+ * @access public
3727
+ * @static
3728
+ */
3729
+ public static function normalizeBreaks($text, $breaktype = "\r\n")
3730
+ {
3731
+ return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
3732
+ }
3733
+
3734
+ /**
3735
+ * Set the public and private key files and password for S/MIME signing.
3736
+ * @access public
3737
+ * @param string $cert_filename
3738
+ * @param string $key_filename
3739
+ * @param string $key_pass Password for private key
3740
+ * @param string $extracerts_filename Optional path to chain certificate
3741
+ */
3742
+ public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
3743
+ {
3744
+ $this->sign_cert_file = $cert_filename;
3745
+ $this->sign_key_file = $key_filename;
3746
+ $this->sign_key_pass = $key_pass;
3747
+ $this->sign_extracerts_file = $extracerts_filename;
3748
+ }
3749
+
3750
+ /**
3751
+ * Quoted-Printable-encode a DKIM header.
3752
+ * @access public
3753
+ * @param string $txt
3754
+ * @return string
3755
+ */
3756
+ public function DKIM_QP($txt)
3757
+ {
3758
+ $line = '';
3759
+ for ($i = 0; $i < strlen($txt); $i++) {
3760
+ $ord = ord($txt[$i]);
3761
+ if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
3762
+ $line .= $txt[$i];
3763
+ } else {
3764
+ $line .= '=' . sprintf('%02X', $ord);
3765
+ }
3766
+ }
3767
+ return $line;
3768
+ }
3769
+
3770
+ /**
3771
+ * Generate a DKIM signature.
3772
+ * @access public
3773
+ * @param string $signHeader
3774
+ * @throws phpmailerException
3775
+ * @return string The DKIM signature value
3776
+ */
3777
+ public function DKIM_Sign($signHeader)
3778
+ {
3779
+ if (!defined('PKCS7_TEXT')) {
3780
+ if ($this->exceptions) {
3781
+ throw new phpmailerException($this->lang('extension_missing') . 'openssl');
3782
+ }
3783
+ return '';
3784
+ }
3785
+ $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
3786
+ if ('' != $this->DKIM_passphrase) {
3787
+ $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
3788
+ } else {
3789
+ $privKey = openssl_pkey_get_private($privKeyStr);
3790
+ }
3791
+ //Workaround for missing digest algorithms in old PHP & OpenSSL versions
3792
+ //@link http://stackoverflow.com/a/11117338/333340
3793
+ if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
3794
+ in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
3795
+ if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
3796
+ openssl_pkey_free($privKey);
3797
+ return base64_encode($signature);
3798
+ }
3799
+ } else {
3800
+ $pinfo = openssl_pkey_get_details($privKey);
3801
+ $hash = hash('sha256', $signHeader);
3802
+ //'Magic' constant for SHA256 from RFC3447
3803
+ //@link https://tools.ietf.org/html/rfc3447#page-43
3804
+ $t = '3031300d060960864801650304020105000420' . $hash;
3805
+ $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
3806
+ $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);
3807
+
3808
+ if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
3809
+ openssl_pkey_free($privKey);
3810
+ return base64_encode($signature);
3811
+ }
3812
+ }
3813
+ openssl_pkey_free($privKey);
3814
+ return '';
3815
+ }
3816
+
3817
+ /**
3818
+ * Generate a DKIM canonicalization header.
3819
+ * @access public
3820
+ * @param string $signHeader Header
3821
+ * @return string
3822
+ */
3823
+ public function DKIM_HeaderC($signHeader)
3824
+ {
3825
+ $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
3826
+ $lines = explode("\r\n", $signHeader);
3827
+ foreach ($lines as $key => $line) {
3828
+ list($heading, $value) = explode(':', $line, 2);
3829
+ $heading = strtolower($heading);
3830
+ $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
3831
+ $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
3832
+ }
3833
+ $signHeader = implode("\r\n", $lines);
3834
+ return $signHeader;
3835
+ }
3836
+
3837
+ /**
3838
+ * Generate a DKIM canonicalization body.
3839
+ * @access public
3840
+ * @param string $body Message Body
3841
+ * @return string
3842
+ */
3843
+ public function DKIM_BodyC($body)
3844
+ {
3845
+ if ($body == '') {
3846
+ return "\r\n";
3847
+ }
3848
+ // stabilize line endings
3849
+ $body = str_replace("\r\n", "\n", $body);
3850
+ $body = str_replace("\n", "\r\n", $body);
3851
+ // END stabilize line endings
3852
+ while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
3853
+ $body = substr($body, 0, strlen($body) - 2);
3854
+ }
3855
+ return $body;
3856
+ }
3857
+
3858
+ /**
3859
+ * Create the DKIM header and body in a new message header.
3860
+ * @access public
3861
+ * @param string $headers_line Header lines
3862
+ * @param string $subject Subject
3863
+ * @param string $body Body
3864
+ * @return string
3865
+ */
3866
+ public function DKIM_Add($headers_line, $subject, $body)
3867
+ {
3868
+ $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
3869
+ $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
3870
+ $DKIMquery = 'dns/txt'; // Query method
3871
+ $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
3872
+ $subject_header = "Subject: $subject";
3873
+ $headers = explode($this->LE, $headers_line);
3874
+ $from_header = '';
3875
+ $to_header = '';
3876
+ $date_header = '';
3877
+ $current = '';
3878
+ foreach ($headers as $header) {
3879
+ if (strpos($header, 'From:') === 0) {
3880
+ $from_header = $header;
3881
+ $current = 'from_header';
3882
+ } elseif (strpos($header, 'To:') === 0) {
3883
+ $to_header = $header;
3884
+ $current = 'to_header';
3885
+ } elseif (strpos($header, 'Date:') === 0) {
3886
+ $date_header = $header;
3887
+ $current = 'date_header';
3888
+ } else {
3889
+ if (!empty($$current) && strpos($header, ' =?') === 0) {
3890
+ $$current .= $header;
3891
+ } else {
3892
+ $current = '';
3893
+ }
3894
+ }
3895
+ }
3896
+ $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
3897
+ $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
3898
+ $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
3899
+ $subject = str_replace(
3900
+ '|',
3901
+ '=7C',
3902
+ $this->DKIM_QP($subject_header)
3903
+ ); // Copied header fields (dkim-quoted-printable)
3904
+ $body = $this->DKIM_BodyC($body);
3905
+ $DKIMlen = strlen($body); // Length of body
3906
+ $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
3907
+ if ('' == $this->DKIM_identity) {
3908
+ $ident = '';
3909
+ } else {
3910
+ $ident = ' i=' . $this->DKIM_identity . ';';
3911
+ }
3912
+ $dkimhdrs = 'DKIM-Signature: v=1; a=' .
3913
+ $DKIMsignatureType . '; q=' .
3914
+ $DKIMquery . '; l=' .
3915
+ $DKIMlen . '; s=' .
3916
+ $this->DKIM_selector .
3917
+ ";\r\n" .
3918
+ "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
3919
+ "\th=From:To:Date:Subject;\r\n" .
3920
+ "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
3921
+ "\tz=$from\r\n" .
3922
+ "\t|$to\r\n" .
3923
+ "\t|$date\r\n" .
3924
+ "\t|$subject;\r\n" .
3925
+ "\tbh=" . $DKIMb64 . ";\r\n" .
3926
+ "\tb=";
3927
+ $toSign = $this->DKIM_HeaderC(
3928
+ $from_header . "\r\n" .
3929
+ $to_header . "\r\n" .
3930
+ $date_header . "\r\n" .
3931
+ $subject_header . "\r\n" .
3932
+ $dkimhdrs
3933
+ );
3934
+ $signed = $this->DKIM_Sign($toSign);
3935
+ return $dkimhdrs . $signed . "\r\n";
3936
+ }
3937
+
3938
+ /**
3939
+ * Detect if a string contains a line longer than the maximum line length allowed.
3940
+ * @param string $str
3941
+ * @return boolean
3942
+ * @static
3943
+ */
3944
+ public static function hasLineLongerThanMax($str)
3945
+ {
3946
+ //+2 to include CRLF line break for a 1000 total
3947
+ return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
3948
+ }
3949
+
3950
+ /**
3951
+ * Allows for public read access to 'to' property.
3952
+ * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
3953
+ * @access public
3954
+ * @return array
3955
+ */
3956
+ public function getToAddresses()
3957
+ {
3958
+ return $this->to;
3959
+ }
3960
+
3961
+ /**
3962
+ * Allows for public read access to 'cc' property.
3963
+ * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
3964
+ * @access public
3965
+ * @return array
3966
+ */
3967
+ public function getCcAddresses()
3968
+ {
3969
+ return $this->cc;
3970
+ }
3971
+
3972
+ /**
3973
+ * Allows for public read access to 'bcc' property.
3974
+ * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
3975
+ * @access public
3976
+ * @return array
3977
+ */
3978
+ public function getBccAddresses()
3979
+ {
3980
+ return $this->bcc;
3981
+ }
3982
+
3983
+ /**
3984
+ * Allows for public read access to 'ReplyTo' property.
3985
+ * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
3986
+ * @access public
3987
+ * @return array
3988
+ */
3989
+ public function getReplyToAddresses()
3990
+ {
3991
+ return $this->ReplyTo;
3992
+ }
3993
+
3994
+ /**
3995
+ * Allows for public read access to 'all_recipients' property.
3996
+ * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
3997
+ * @access public
3998
+ * @return array
3999
+ */
4000
+ public function getAllRecipientAddresses()
4001
+ {
4002
+ return $this->all_recipients;
4003
+ }
4004
+
4005
+ /**
4006
+ * Perform a callback.
4007
+ * @param boolean $isSent
4008
+ * @param array $to
4009
+ * @param array $cc
4010
+ * @param array $bcc
4011
+ * @param string $subject
4012
+ * @param string $body
4013
+ * @param string $from
4014
+ */
4015
+ protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
4016
+ {
4017
+ if (!empty($this->action_function) && is_callable($this->action_function)) {
4018
+ $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
4019
+ call_user_func_array($this->action_function, $params);
4020
+ }
4021
+ }
4022
+ }
4023
+
4024
+ /**
4025
+ * PHPMailer exception handler
4026
+ * @package PHPMailer
4027
+ */
4028
+ class phpmailerException extends Exception
4029
+ {
4030
+ /**
4031
+ * Prettify error message output
4032
+ * @return string
4033
+ */
4034
+ public function errorMessage()
4035
+ {
4036
+ $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";
4037
+ return $errorMsg;
4038
+ }
4039
+ }
modules/mail/engines/class.phpmaileroauth.php CHANGED
@@ -1,197 +1,197 @@
1
- <?php
2
- /**
3
- * PHPMailer - PHP email creation and transport class.
4
- * PHP Version 5.4
5
- * @package PHPMailer
6
- * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
7
- * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
- * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
- * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
- * @author Brent R. Matzelle (original founder)
11
- * @copyright 2012 - 2014 Marcus Bointon
12
- * @copyright 2010 - 2012 Jim Jagielski
13
- * @copyright 2004 - 2009 Andy Prevost
14
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
- * @note This program is distributed in the hope that it will be useful - WITHOUT
16
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
- * FITNESS FOR A PARTICULAR PURPOSE.
18
- */
19
-
20
- /**
21
- * PHPMailerOAuth - PHPMailer subclass adding OAuth support.
22
- * @package PHPMailer
23
- * @author @sherryl4george
24
- * @author Marcus Bointon (@Synchro) <phpmailer@synchromedia.co.uk>
25
- */
26
- class PHPMailerOAuth extends PHPMailer
27
- {
28
- /**
29
- * The OAuth user's email address
30
- * @var string
31
- */
32
- public $oauthUserEmail = '';
33
-
34
- /**
35
- * The OAuth refresh token
36
- * @var string
37
- */
38
- public $oauthRefreshToken = '';
39
-
40
- /**
41
- * The OAuth client ID
42
- * @var string
43
- */
44
- public $oauthClientId = '';
45
-
46
- /**
47
- * The OAuth client secret
48
- * @var string
49
- */
50
- public $oauthClientSecret = '';
51
-
52
- /**
53
- * An instance of the PHPMailerOAuthGoogle class.
54
- * @var PHPMailerOAuthGoogle
55
- * @access protected
56
- */
57
- protected $oauth = null;
58
-
59
- /**
60
- * Get a PHPMailerOAuthGoogle instance to use.
61
- * @return PHPMailerOAuthGoogle
62
- */
63
- public function getOAUTHInstance()
64
- {
65
- if (!is_object($this->oauth)) {
66
- $this->oauth = new PHPMailerOAuthGoogle(
67
- $this->oauthUserEmail,
68
- $this->oauthClientSecret,
69
- $this->oauthClientId,
70
- $this->oauthRefreshToken
71
- );
72
- }
73
- return $this->oauth;
74
- }
75
-
76
- /**
77
- * Initiate a connection to an SMTP server.
78
- * Overrides the original smtpConnect method to add support for OAuth.
79
- * @param array $options An array of options compatible with stream_context_create()
80
- * @uses SMTP
81
- * @access public
82
- * @return bool
83
- * @throws phpmailerException
84
- */
85
- public function smtpConnect($options = array())
86
- {
87
- if (is_null($this->smtp)) {
88
- $this->smtp = $this->getSMTPInstance();
89
- }
90
-
91
- if (is_null($this->oauth)) {
92
- $this->oauth = $this->getOAUTHInstance();
93
- }
94
-
95
- // Already connected?
96
- if ($this->smtp->connected()) {
97
- return true;
98
- }
99
-
100
- $this->smtp->setTimeout($this->Timeout);
101
- $this->smtp->setDebugLevel($this->SMTPDebug);
102
- $this->smtp->setDebugOutput($this->Debugoutput);
103
- $this->smtp->setVerp($this->do_verp);
104
- $hosts = explode(';', $this->Host);
105
- $lastexception = null;
106
-
107
- foreach ($hosts as $hostentry) {
108
- $hostinfo = array();
109
- if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
110
- // Not a valid host entry
111
- continue;
112
- }
113
- // $hostinfo[2]: optional ssl or tls prefix
114
- // $hostinfo[3]: the hostname
115
- // $hostinfo[4]: optional port number
116
- // The host string prefix can temporarily override the current setting for SMTPSecure
117
- // If it's not specified, the default value is used
118
- $prefix = '';
119
- $secure = $this->SMTPSecure;
120
- $tls = ($this->SMTPSecure == 'tls');
121
- if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
122
- $prefix = 'ssl://';
123
- $tls = false; // Can't have SSL and TLS at the same time
124
- $secure = 'ssl';
125
- } elseif ($hostinfo[2] == 'tls') {
126
- $tls = true;
127
- // tls doesn't use a prefix
128
- $secure = 'tls';
129
- }
130
- //Do we need the OpenSSL extension?
131
- $sslext = defined('OPENSSL_ALGO_SHA1');
132
- if ('tls' === $secure or 'ssl' === $secure) {
133
- //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
134
- if (!$sslext) {
135
- throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
136
- }
137
- }
138
- $host = $hostinfo[3];
139
- $port = $this->Port;
140
- $tport = (integer)$hostinfo[4];
141
- if ($tport > 0 and $tport < 65536) {
142
- $port = $tport;
143
- }
144
- if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
145
- try {
146
- if ($this->Helo) {
147
- $hello = $this->Helo;
148
- } else {
149
- $hello = $this->serverHostname();
150
- }
151
- $this->smtp->hello($hello);
152
- //Automatically enable TLS encryption if:
153
- // * it's not disabled
154
- // * we have openssl extension
155
- // * we are not already using SSL
156
- // * the server offers STARTTLS
157
- if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
158
- $tls = true;
159
- }
160
- if ($tls) {
161
- if (!$this->smtp->startTLS()) {
162
- throw new phpmailerException($this->lang('connect_host'));
163
- }
164
- // We must resend HELO after tls negotiation
165
- $this->smtp->hello($hello);
166
- }
167
- if ($this->SMTPAuth) {
168
- if (!$this->smtp->authenticate(
169
- $this->Username,
170
- $this->Password,
171
- $this->AuthType,
172
- $this->Realm,
173
- $this->Workstation,
174
- $this->oauth
175
- )
176
- ) {
177
- throw new phpmailerException($this->lang('authenticate'));
178
- }
179
- }
180
- return true;
181
- } catch (phpmailerException $exc) {
182
- $lastexception = $exc;
183
- $this->edebug($exc->getMessage());
184
- // We must have connected, but then failed TLS or Auth, so close connection nicely
185
- $this->smtp->quit();
186
- }
187
- }
188
- }
189
- // If we get here, all connection attempts have failed, so close connection hard
190
- $this->smtp->close();
191
- // As we've caught all exceptions, just report whatever the last one was
192
- if ($this->exceptions and !is_null($lastexception)) {
193
- throw $lastexception;
194
- }
195
- return false;
196
- }
197
- }
1
+ <?php
2
+ /**
3
+ * PHPMailer - PHP email creation and transport class.
4
+ * PHP Version 5.4
5
+ * @package PHPMailer
6
+ * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
7
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
+ * @author Brent R. Matzelle (original founder)
11
+ * @copyright 2012 - 2014 Marcus Bointon
12
+ * @copyright 2010 - 2012 Jim Jagielski
13
+ * @copyright 2004 - 2009 Andy Prevost
14
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
16
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
+ * FITNESS FOR A PARTICULAR PURPOSE.
18
+ */
19
+
20
+ /**
21
+ * PHPMailerOAuth - PHPMailer subclass adding OAuth support.
22
+ * @package PHPMailer
23
+ * @author @sherryl4george
24
+ * @author Marcus Bointon (@Synchro) <phpmailer@synchromedia.co.uk>
25
+ */
26
+ class PHPMailerOAuth extends PHPMailer
27
+ {
28
+ /**
29
+ * The OAuth user's email address
30
+ * @var string
31
+ */
32
+ public $oauthUserEmail = '';
33
+
34
+ /**
35
+ * The OAuth refresh token
36
+ * @var string
37
+ */
38
+ public $oauthRefreshToken = '';
39
+
40
+ /**
41
+ * The OAuth client ID
42
+ * @var string
43
+ */
44
+ public $oauthClientId = '';
45
+
46
+ /**
47
+ * The OAuth client secret
48
+ * @var string
49
+ */
50
+ public $oauthClientSecret = '';
51
+
52
+ /**
53
+ * An instance of the PHPMailerOAuthGoogle class.
54
+ * @var PHPMailerOAuthGoogle
55
+ * @access protected
56
+ */
57
+ protected $oauth = null;
58
+
59
+ /**
60
+ * Get a PHPMailerOAuthGoogle instance to use.
61
+ * @return PHPMailerOAuthGoogle
62
+ */
63
+ public function getOAUTHInstance()
64
+ {
65
+ if (!is_object($this->oauth)) {
66
+ $this->oauth = new PHPMailerOAuthGoogle(
67
+ $this->oauthUserEmail,
68
+ $this->oauthClientSecret,
69
+ $this->oauthClientId,
70
+ $this->oauthRefreshToken
71
+ );
72
+ }
73
+ return $this->oauth;
74
+ }
75
+
76
+ /**
77
+ * Initiate a connection to an SMTP server.
78
+ * Overrides the original smtpConnect method to add support for OAuth.
79
+ * @param array $options An array of options compatible with stream_context_create()
80
+ * @uses SMTP
81
+ * @access public
82
+ * @return bool
83
+ * @throws phpmailerException
84
+ */
85
+ public function smtpConnect($options = array())
86
+ {
87
+ if (is_null($this->smtp)) {
88
+ $this->smtp = $this->getSMTPInstance();
89
+ }
90
+
91
+ if (is_null($this->oauth)) {
92
+ $this->oauth = $this->getOAUTHInstance();
93
+ }
94
+
95
+ // Already connected?
96
+ if ($this->smtp->connected()) {
97
+ return true;
98
+ }
99
+
100
+ $this->smtp->setTimeout($this->Timeout);
101
+ $this->smtp->setDebugLevel($this->SMTPDebug);
102
+ $this->smtp->setDebugOutput($this->Debugoutput);
103
+ $this->smtp->setVerp($this->do_verp);
104
+ $hosts = explode(';', $this->Host);
105
+ $lastexception = null;
106
+
107
+ foreach ($hosts as $hostentry) {
108
+ $hostinfo = array();
109
+ if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
110
+ // Not a valid host entry
111
+ continue;
112
+ }
113
+ // $hostinfo[2]: optional ssl or tls prefix
114
+ // $hostinfo[3]: the hostname
115
+ // $hostinfo[4]: optional port number
116
+ // The host string prefix can temporarily override the current setting for SMTPSecure
117
+ // If it's not specified, the default value is used
118
+ $prefix = '';
119
+ $secure = $this->SMTPSecure;
120
+ $tls = ($this->SMTPSecure == 'tls');
121
+ if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
122
+ $prefix = 'ssl://';
123
+ $tls = false; // Can't have SSL and TLS at the same time
124
+ $secure = 'ssl';
125
+ } elseif ($hostinfo[2] == 'tls') {
126
+ $tls = true;
127
+ // tls doesn't use a prefix
128
+ $secure = 'tls';
129
+ }
130
+ //Do we need the OpenSSL extension?
131
+ $sslext = defined('OPENSSL_ALGO_SHA1');
132
+ if ('tls' === $secure or 'ssl' === $secure) {
133
+ //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
134
+ if (!$sslext) {
135
+ throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
136
+ }
137
+ }
138
+ $host = $hostinfo[3];
139
+ $port = $this->Port;
140
+ $tport = (integer)$hostinfo[4];
141
+ if ($tport > 0 and $tport < 65536) {
142
+ $port = $tport;
143
+ }
144
+ if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
145
+ try {
146
+ if ($this->Helo) {
147
+ $hello = $this->Helo;
148
+ } else {
149
+ $hello = $this->serverHostname();
150
+ }
151
+ $this->smtp->hello($hello);
152
+ //Automatically enable TLS encryption if:
153
+ // * it's not disabled
154
+ // * we have openssl extension
155
+ // * we are not already using SSL
156
+ // * the server offers STARTTLS
157
+ if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
158
+ $tls = true;
159
+ }
160
+ if ($tls) {
161
+ if (!$this->smtp->startTLS()) {
162
+ throw new phpmailerException($this->lang('connect_host'));
163
+ }
164
+ // We must resend HELO after tls negotiation
165
+ $this->smtp->hello($hello);
166
+ }
167
+ if ($this->SMTPAuth) {
168
+ if (!$this->smtp->authenticate(
169
+ $this->Username,
170
+ $this->Password,
171
+ $this->AuthType,
172
+ $this->Realm,
173
+ $this->Workstation,
174
+ $this->oauth
175
+ )
176
+ ) {
177
+ throw new phpmailerException($this->lang('authenticate'));
178
+ }
179
+ }
180
+ return true;
181
+ } catch (phpmailerException $exc) {
182
+ $lastexception = $exc;
183
+ $this->edebug($exc->getMessage());
184
+ // We must have connected, but then failed TLS or Auth, so close connection nicely
185
+ $this->smtp->quit();
186
+ }
187
+ }
188
+ }
189
+ // If we get here, all connection attempts have failed, so close connection hard
190
+ $this->smtp->close();
191
+ // As we've caught all exceptions, just report whatever the last one was
192
+ if ($this->exceptions and !is_null($lastexception)) {
193
+ throw $lastexception;
194
+ }
195
+ return false;
196
+ }
197
+ }
modules/mail/engines/class.phpmaileroauthgoogle.php CHANGED
@@ -1,77 +1,77 @@
1
- <?php
2
- /**
3
- * PHPMailer - PHP email creation and transport class.
4
- * PHP Version 5.4
5
- * @package PHPMailer
6
- * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
7
- * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
- * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
- * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
- * @author Brent R. Matzelle (original founder)
11
- * @copyright 2012 - 2014 Marcus Bointon
12
- * @copyright 2010 - 2012 Jim Jagielski
13
- * @copyright 2004 - 2009 Andy Prevost
14
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
- * @note This program is distributed in the hope that it will be useful - WITHOUT
16
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
- * FITNESS FOR A PARTICULAR PURPOSE.
18
- */
19
-
20
- /**
21
- * PHPMailerOAuthGoogle - Wrapper for League OAuth2 Google provider.
22
- * @package PHPMailer
23
- * @author @sherryl4george
24
- * @author Marcus Bointon (@Synchro) <phpmailer@synchromedia.co.uk>
25
- * @link https://github.com/thephpleague/oauth2-client
26
- */
27
- class PHPMailerOAuthGoogle
28
- {
29
- private $oauthUserEmail = '';
30
- private $oauthRefreshToken = '';
31
- private $oauthClientId = '';
32
- private $oauthClientSecret = '';
33
-
34
- /**
35
- * @param string $UserEmail
36
- * @param string $ClientSecret
37
- * @param string $ClientId
38
- * @param string $RefreshToken
39
- */
40
- public function __construct(
41
- $UserEmail,
42
- $ClientSecret,
43
- $ClientId,
44
- $RefreshToken
45
- ) {
46
- $this->oauthClientId = $ClientId;
47
- $this->oauthClientSecret = $ClientSecret;
48
- $this->oauthRefreshToken = $RefreshToken;
49
- $this->oauthUserEmail = $UserEmail;
50
- }
51
-
52
- private function getProvider()
53
- {
54
- return new League\OAuth2\Client\Provider\Google([
55
- 'clientId' => $this->oauthClientId,
56
- 'clientSecret' => $this->oauthClientSecret
57
- ]);
58
- }
59
-
60
- private function getGrant()
61
- {
62
- return new \League\OAuth2\Client\Grant\RefreshToken();
63
- }
64
-
65
- private function getToken()
66
- {
67
- $provider = $this->getProvider();
68
- $grant = $this->getGrant();
69
- return $provider->getAccessToken($grant, ['refresh_token' => $this->oauthRefreshToken]);
70
- }
71
-
72
- public function getOauth64()
73
- {
74
- $token = $this->getToken();
75
- return base64_encode("user=" . $this->oauthUserEmail . "\001auth=Bearer " . $token . "\001\001");
76
- }
77
- }
1
+ <?php
2
+ /**
3
+ * PHPMailer - PHP email creation and transport class.
4
+ * PHP Version 5.4
5
+ * @package PHPMailer
6
+ * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
7
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
+ * @author Brent R. Matzelle (original founder)
11
+ * @copyright 2012 - 2014 Marcus Bointon
12
+ * @copyright 2010 - 2012 Jim Jagielski
13
+ * @copyright 2004 - 2009 Andy Prevost
14
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
16
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
+ * FITNESS FOR A PARTICULAR PURPOSE.
18
+ */
19
+
20
+ /**
21
+ * PHPMailerOAuthGoogle - Wrapper for League OAuth2 Google provider.
22
+ * @package PHPMailer
23
+ * @author @sherryl4george
24
+ * @author Marcus Bointon (@Synchro) <phpmailer@synchromedia.co.uk>
25
+ * @link https://github.com/thephpleague/oauth2-client
26
+ */
27
+ class PHPMailerOAuthGoogle
28
+ {
29
+ private $oauthUserEmail = '';
30
+ private $oauthRefreshToken = '';
31
+ private $oauthClientId = '';
32
+ private $oauthClientSecret = '';
33
+
34
+ /**
35
+ * @param string $UserEmail
36
+ * @param string $ClientSecret
37
+ * @param string $ClientId
38
+ * @param string $RefreshToken
39
+ */
40
+ public function __construct(
41
+ $UserEmail,
42
+ $ClientSecret,
43
+ $ClientId,
44
+ $RefreshToken
45
+ ) {
46
+ $this->oauthClientId = $ClientId;
47
+ $this->oauthClientSecret = $ClientSecret;
48
+ $this->oauthRefreshToken = $RefreshToken;
49
+ $this->oauthUserEmail = $UserEmail;
50
+ }
51
+
52
+ private function getProvider()
53
+ {
54
+ return new League\OAuth2\Client\Provider\Google([
55
+ 'clientId' => $this->oauthClientId,
56
+ 'clientSecret' => $this->oauthClientSecret
57
+ ]);
58
+ }
59
+
60
+ private function getGrant()
61
+ {
62
+ return new \League\OAuth2\Client\Grant\RefreshToken();
63
+ }
64
+
65
+ private function getToken()
66
+ {
67
+ $provider = $this->getProvider();
68
+ $grant = $this->getGrant();
69
+ return $provider->getAccessToken($grant, ['refresh_token' => $this->oauthRefreshToken]);
70
+ }
71
+
72
+ public function getOauth64()
73
+ {
74
+ $token = $this->getToken();
75
+ return base64_encode("user=" . $this->oauthUserEmail . "\001auth=Bearer " . $token . "\001\001");
76
+ }
77
+ }
modules/mail/engines/class.pop3.php CHANGED
@@ -1,407 +1,407 @@
1
- <?php
2
- /**
3
- * PHPMailer POP-Before-SMTP Authentication Class.
4
- * PHP Version 5
5
- * @package PHPMailer
6
- * @link https://github.com/PHPMailer/PHPMailer/
7
- * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
- * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
- * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
- * @author Brent R. Matzelle (original founder)
11
- * @copyright 2012 - 2014 Marcus Bointon
12
- * @copyright 2010 - 2012 Jim Jagielski
13
- * @copyright 2004 - 2009 Andy Prevost
14
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
- * @note This program is distributed in the hope that it will be useful - WITHOUT
16
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
- * FITNESS FOR A PARTICULAR PURPOSE.
18
- */
19
-
20
- /**
21
- * PHPMailer POP-Before-SMTP Authentication Class.
22
- * Specifically for PHPMailer to use for RFC1939 POP-before-SMTP authentication.
23
- * Does not support APOP.
24
- * @package PHPMailer
25
- * @author Richard Davey (original author) <rich@corephp.co.uk>
26
- * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
27
- * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
28
- * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
29
- */
30
- class POP3
31
- {
32
- /**
33
- * The POP3 PHPMailer Version number.
34
- * @var string
35
- * @access public
36
- */
37
- public $Version = '5.2.17';
38
-
39
- /**
40
- * Default POP3 port number.
41
- * @var integer
42
- * @access public
43
- */
44
- public $POP3_PORT = 110;
45
-
46
- /**
47
- * Default timeout in seconds.
48
- * @var integer
49
- * @access public
50
- */
51
- public $POP3_TIMEOUT = 30;
52
-
53
- /**
54
- * POP3 Carriage Return + Line Feed.
55
- * @var string
56
- * @access public
57
- * @deprecated Use the constant instead
58
- */
59
- public $CRLF = "\r\n";
60
-
61
- /**
62
- * Debug display level.
63
- * Options: 0 = no, 1+ = yes
64
- * @var integer
65
- * @access public
66
- */
67
- public $do_debug = 0;
68
-
69
- /**
70
- * POP3 mail server hostname.
71
- * @var string
72
- * @access public
73
- */
74
- public $host;
75
-
76
- /**
77
- * POP3 port number.
78
- * @var integer
79
- * @access public
80
- */
81
- public $port;
82
-
83
- /**
84
- * POP3 Timeout Value in seconds.
85
- * @var integer
86
- * @access public
87
- */
88
- public $tval;
89
-
90
- /**
91
- * POP3 username
92
- * @var string
93
- * @access public
94
- */
95
- public $username;
96
-
97
- /**
98
- * POP3 password.
99
- * @var string
100
- * @access public
101
- */
102
- public $password;
103
-
104
- /**
105
- * Resource handle for the POP3 connection socket.
106
- * @var resource
107
- * @access protected
108
- */
109
- protected $pop_conn;
110
-
111
- /**
112
- * Are we connected?
113
- * @var boolean
114
- * @access protected
115
- */
116
- protected $connected = false;
117
-
118
- /**
119
- * Error container.
120
- * @var array
121
- * @access protected
122
- */
123
- protected $errors = array();
124
-
125
- /**
126
- * Line break constant
127
- */
128
- const CRLF = "\r\n";
129
-
130
- /**
131
- * Simple static wrapper for all-in-one POP before SMTP
132
- * @param $host
133
- * @param integer|boolean $port The port number to connect to
134
- * @param integer|boolean $timeout The timeout value
135
- * @param string $username
136
- * @param string $password
137
- * @param integer $debug_level
138
- * @return boolean
139
- */
140
- public static function popBeforeSmtp(
141
- $host,
142
- $port = false,
143
- $timeout = false,
144
- $username = '',
145
- $password = '',
146
- $debug_level = 0
147
- ) {
148
- $pop = new POP3;
149
- return $pop->authorise($host, $port, $timeout, $username, $password, $debug_level);
150
- }
151
-
152
- /**
153
- * Authenticate with a POP3 server.
154
- * A connect, login, disconnect sequence
155
- * appropriate for POP-before SMTP authorisation.
156
- * @access public
157
- * @param string $host The hostname to connect to
158
- * @param integer|boolean $port The port number to connect to
159
- * @param integer|boolean $timeout The timeout value
160
- * @param string $username
161
- * @param string $password
162
- * @param integer $debug_level
163
- * @return boolean
164
- */
165
- public function authorise($host, $port = false, $timeout = false, $username = '', $password = '', $debug_level = 0)
166
- {
167
- $this->host = $host;
168
- // If no port value provided, use default
169
- if (false === $port) {
170
- $this->port = $this->POP3_PORT;
171
- } else {
172
- $this->port = (integer)$port;
173
- }
174
- // If no timeout value provided, use default
175
- if (false === $timeout) {
176
- $this->tval = $this->POP3_TIMEOUT;
177
- } else {
178
- $this->tval = (integer)$timeout;
179
- }
180
- $this->do_debug = $debug_level;
181
- $this->username = $username;
182
- $this->password = $password;
183
- // Reset the error log
184
- $this->errors = array();
185
- // connect
186
- $result = $this->connect($this->host, $this->port, $this->tval);
187
- if ($result) {
188
- $login_result = $this->login($this->username, $this->password);
189
- if ($login_result) {
190
- $this->disconnect();
191
- return true;
192
- }
193
- }
194
- // We need to disconnect regardless of whether the login succeeded
195
- $this->disconnect();
196
- return false;
197
- }
198
-
199
- /**
200
- * Connect to a POP3 server.
201
- * @access public
202
- * @param string $host
203
- * @param integer|boolean $port
204
- * @param integer $tval
205
- * @return boolean
206
- */
207
- public function connect($host, $port = false, $tval = 30)
208
- {
209
- // Are we already connected?
210
- if ($this->connected) {
211
- return true;
212
- }
213
-
214
- //On Windows this will raise a PHP Warning error if the hostname doesn't exist.
215
- //Rather than suppress it with @fsockopen, capture it cleanly instead
216
- set_error_handler(array($this, 'catchWarning'));
217
-
218
- if (false === $port) {
219
- $port = $this->POP3_PORT;
220
- }
221
-
222
- // connect to the POP3 server
223
- $this->pop_conn = fsockopen(
224
- $host, // POP3 Host
225
- $port, // Port #
226
- $errno, // Error Number
227
- $errstr, // Error Message
228
- $tval
229
- ); // Timeout (seconds)
230
- // Restore the error handler
231
- restore_error_handler();
232
-
233
- // Did we connect?
234
- if (false === $this->pop_conn) {
235
- // It would appear not...
236
- $this->setError(array(
237
- 'error' => "Failed to connect to server $host on port $port",
238
- 'errno' => $errno,
239
- 'errstr' => $errstr
240
- ));
241
- return false;
242
- }
243
-
244
- // Increase the stream time-out
245
- stream_set_timeout($this->pop_conn, $tval, 0);
246
-
247
- // Get the POP3 server response
248
- $pop3_response = $this->getResponse();
249
- // Check for the +OK
250
- if ($this->checkResponse($pop3_response)) {
251
- // The connection is established and the POP3 server is talking
252
- $this->connected = true;
253
- return true;
254
- }
255
- return false;
256
- }
257
-
258
- /**
259
- * Log in to the POP3 server.
260
- * Does not support APOP (RFC 2828, 4949).
261
- * @access public
262
- * @param string $username
263
- * @param string $password
264
- * @return boolean
265
- */
266
- public function login($username = '', $password = '')
267
- {
268
- if (!$this->connected) {
269
- $this->setError('Not connected to POP3 server');
270
- }
271
- if (empty($username)) {
272
- $username = $this->username;
273
- }
274
- if (empty($password)) {
275
- $password = $this->password;
276
- }
277
-
278
- // Send the Username
279
- $this->sendString("USER $username" . self::CRLF);
280
- $pop3_response = $this->getResponse();
281
- if ($this->checkResponse($pop3_response)) {
282
- // Send the Password
283
- $this->sendString("PASS $password" . self::CRLF);
284
- $pop3_response = $this->getResponse();
285
- if ($this->checkResponse($pop3_response)) {
286
- return true;
287
- }
288
- }
289
- return false;
290
- }
291
-
292
- /**
293
- * Disconnect from the POP3 server.
294
- * @access public
295
- */
296
- public function disconnect()
297
- {
298
- $this->sendString('QUIT');
299
- //The QUIT command may cause the daemon to exit, which will kill our connection
300
- //So ignore errors here
301
- try {
302
- @fclose($this->pop_conn);
303
- } catch (Exception $e) {
304
- //Do nothing
305
- };
306
- }
307
-
308
- /**
309
- * Get a response from the POP3 server.
310
- * $size is the maximum number of bytes to retrieve
311
- * @param integer $size
312
- * @return string
313
- * @access protected
314
- */
315
- protected function getResponse($size = 128)
316
- {
317
- $response = fgets($this->pop_conn, $size);
318
- if ($this->do_debug >= 1) {
319
- echo "Server -> Client: $response";
320
- }
321
- return $response;
322
- }
323
-
324
- /**
325
- * Send raw data to the POP3 server.
326
- * @param string $string
327
- * @return integer
328
- * @access protected
329
- */
330
- protected function sendString($string)
331
- {
332
- if ($this->pop_conn) {
333
- if ($this->do_debug >= 2) { //Show client messages when debug >= 2
334
- echo "Client -> Server: $string";
335
- }
336
- return fwrite($this->pop_conn, $string, strlen($string));
337
- }
338
- return 0;
339
- }
340
-
341
- /**
342
- * Checks the POP3 server response.
343
- * Looks for for +OK or -ERR.
344
- * @param string $string
345
- * @return boolean
346
- * @access protected
347
- */
348
- protected function checkResponse($string)
349
- {
350
- if (substr($string, 0, 3) !== '+OK') {
351
- $this->setError(array(
352
- 'error' => "Server reported an error: $string",
353
- 'errno' => 0,
354
- 'errstr' => ''
355
- ));
356
- return false;
357
- } else {
358
- return true;
359
- }
360
- }
361
-
362
- /**
363
- * Add an error to the internal error store.
364
- * Also display debug output if it's enabled.
365
- * @param $error
366
- * @access protected
367
- */
368
- protected function setError($error)
369
- {
370
- $this->errors[] = $error;
371
- if ($this->do_debug >= 1) {
372
- echo '<pre>';
373
- foreach ($this->errors as $error) {
374
- print_r($error);
375
- }
376
- echo '</pre>';
377
- }
378
- }
379
-
380
- /**
381
- * Get an array of error messages, if any.
382
- * @return array
383
- */
384
- public function getErrors()
385
- {
386
- return $this->errors;
387
- }
388
-
389
- /**
390
- * POP3 connection error handler.
391
- * @param integer $errno
392
- * @param string $errstr
393
- * @param string $errfile
394
- * @param integer $errline
395
- * @access protected
396
- */
397
- protected function catchWarning($errno, $errstr, $errfile, $errline)
398
- {
399
- $this->setError(array(
400
- 'error' => "Connecting to the POP3 server raised a PHP warning: ",
401
- 'errno' => $errno,
402
- 'errstr' => $errstr,
403
- 'errfile' => $errfile,
404
- 'errline' => $errline
405
- ));
406
- }
407
- }
1
+ <?php
2
+ /**
3
+ * PHPMailer POP-Before-SMTP Authentication Class.
4
+ * PHP Version 5
5
+ * @package PHPMailer
6
+ * @link https://github.com/PHPMailer/PHPMailer/
7
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
+ * @author Brent R. Matzelle (original founder)
11
+ * @copyright 2012 - 2014 Marcus Bointon
12
+ * @copyright 2010 - 2012 Jim Jagielski
13
+ * @copyright 2004 - 2009 Andy Prevost
14
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
16
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
+ * FITNESS FOR A PARTICULAR PURPOSE.
18
+ */
19
+
20
+ /**
21
+ * PHPMailer POP-Before-SMTP Authentication Class.
22
+ * Specifically for PHPMailer to use for RFC1939 POP-before-SMTP authentication.
23
+ * Does not support APOP.
24
+ * @package PHPMailer
25
+ * @author Richard Davey (original author) <rich@corephp.co.uk>
26
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
27
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
28
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
29
+ */
30
+ class POP3
31
+ {
32
+ /**
33
+ * The POP3 PHPMailer Version number.
34
+ * @var string
35
+ * @access public
36
+ */
37
+ public $Version = '5.2.17';
38
+
39
+ /**
40
+ * Default POP3 port number.
41
+ * @var integer
42
+ * @access public
43
+ */
44
+ public $POP3_PORT = 110;
45
+
46
+ /**
47
+ * Default timeout in seconds.
48
+ * @var integer
49
+ * @access public
50
+ */
51
+ public $POP3_TIMEOUT = 30;
52
+
53
+ /**
54
+ * POP3 Carriage Return + Line Feed.
55
+ * @var string
56
+ * @access public
57
+ * @deprecated Use the constant instead
58
+ */
59
+ public $CRLF = "\r\n";
60
+
61
+ /**
62
+ * Debug display level.
63
+ * Options: 0 = no, 1+ = yes
64
+ * @var integer
65
+ * @access public
66
+ */
67
+ public $do_debug = 0;
68
+
69
+ /**
70
+ * POP3 mail server hostname.
71
+ * @var string
72
+ * @access public
73
+ */
74
+ public $host;
75
+
76
+ /**
77
+ * POP3 port number.
78
+ * @var integer
79
+ * @access public
80
+ */
81
+ public $port;
82
+
83
+ /**
84
+ * POP3 Timeout Value in seconds.
85
+ * @var integer
86
+ * @access public
87
+ */
88
+ public $tval;
89
+
90
+ /**
91
+ * POP3 username
92
+ * @var string
93
+ * @access public
94
+ */
95
+ public $username;
96
+
97
+ /**
98
+ * POP3 password.
99
+ * @var string
100
+ * @access public
101
+ */
102
+ public $password;
103
+
104
+ /**
105
+ * Resource handle for the POP3 connection socket.
106
+ * @var resource
107
+ * @access protected
108
+ */
109
+ protected $pop_conn;
110
+
111
+ /**
112
+ * Are we connected?
113
+ * @var boolean
114
+ * @access protected
115
+ */
116
+ protected $connected = false;
117
+
118
+ /**
119
+ * Error container.
120
+ * @var array
121
+ * @access protected
122
+ */
123
+ protected $errors = array();
124
+
125
+ /**
126
+ * Line break constant
127
+ */
128
+ const CRLF = "\r\n";
129
+
130
+ /**
131
+ * Simple static wrapper for all-in-one POP before SMTP
132
+ * @param $host
133
+ * @param integer|boolean $port The port number to connect to
134
+ * @param integer|boolean $timeout The timeout value
135
+ * @param string $username
136
+ * @param string $password
137
+ * @param integer $debug_level
138
+ * @return boolean
139
+ */
140
+ public static function popBeforeSmtp(
141
+ $host,
142
+ $port = false,
143
+ $timeout = false,
144
+ $username = '',
145
+ $password = '',
146
+ $debug_level = 0
147
+ ) {
148
+ $pop = new POP3;
149
+ return $pop->authorise($host, $port, $timeout, $username, $password, $debug_level);
150
+ }
151
+
152
+ /**
153
+ * Authenticate with a POP3 server.
154
+ * A connect, login, disconnect sequence
155
+ * appropriate for POP-before SMTP authorisation.
156
+ * @access public
157
+ * @param string $host The hostname to connect to
158
+ * @param integer|boolean $port The port number to connect to
159
+ * @param integer|boolean $timeout The timeout value
160
+ * @param string $username
161
+ * @param string $password
162
+ * @param integer $debug_level
163
+ * @return boolean
164
+ */
165
+ public function authorise($host, $port = false, $timeout = false, $username = '', $password = '', $debug_level = 0)
166
+ {
167
+ $this->host = $host;
168
+ // If no port value provided, use default
169
+ if (false === $port) {
170
+ $this->port = $this->POP3_PORT;
171
+ } else {
172
+ $this->port = (integer)$port;
173
+ }
174
+ // If no timeout value provided, use default
175
+ if (false === $timeout) {
176
+ $this->tval = $this->POP3_TIMEOUT;
177
+ } else {
178
+ $this->tval = (integer)$timeout;
179
+ }
180
+ $this->do_debug = $debug_level;
181
+ $this->username = $username;
182
+ $this->password = $password;
183
+ // Reset the error log
184
+ $this->errors = array();
185
+ // connect
186
+ $result = $this->connect($this->host, $this->port, $this->tval);
187
+ if ($result) {
188
+ $login_result = $this->login($this->username, $this->password);
189
+ if ($login_result) {
190
+ $this->disconnect();
191
+ return true;
192
+ }
193
+ }
194
+ // We need to disconnect regardless of whether the login succeeded
195
+ $this->disconnect();
196
+ return false;
197
+ }
198
+
199
+ /**
200
+ * Connect to a POP3 server.
201
+ * @access public
202
+ * @param string $host
203
+ * @param integer|boolean $port
204
+ * @param integer $tval
205
+ * @return boolean
206
+ */
207
+ public function connect($host, $port = false, $tval = 30)
208
+ {
209
+ // Are we already connected?
210
+ if ($this->connected) {
211
+ return true;
212
+ }
213
+
214
+ //On Windows this will raise a PHP Warning error if the hostname doesn't exist.
215
+ //Rather than suppress it with @fsockopen, capture it cleanly instead
216
+ set_error_handler(array($this, 'catchWarning'));
217
+
218
+ if (false === $port) {
219
+ $port = $this->POP3_PORT;
220
+ }
221
+
222
+ // connect to the POP3 server
223
+ $this->pop_conn = fsockopen(
224
+ $host, // POP3 Host
225
+ $port, // Port #
226
+ $errno, // Error Number
227
+ $errstr, // Error Message
228
+ $tval
229
+ ); // Timeout (seconds)
230
+ // Restore the error handler
231
+ restore_error_handler();
232
+
233
+ // Did we connect?
234
+ if (false === $this->pop_conn) {
235
+ // It would appear not...
236
+ $this->setError(array(
237
+ 'error' => "Failed to connect to server $host on port $port",
238
+ 'errno' => $errno,
239
+ 'errstr' => $errstr
240
+ ));
241
+ return false;
242
+ }
243
+
244
+ // Increase the stream time-out
245
+ stream_set_timeout($this->pop_conn, $tval, 0);
246
+
247
+ // Get the POP3 server response
248
+ $pop3_response = $this->getResponse();
249
+ // Check for the +OK
250
+ if ($this->checkResponse($pop3_response)) {
251
+ // The connection is established and the POP3 server is talking
252
+ $this->connected = true;
253
+ return true;
254
+ }
255
+ return false;
256
+ }
257
+
258
+ /**
259
+ * Log in to the POP3 server.
260
+ * Does not support APOP (RFC 2828, 4949).
261
+ * @access public
262
+ * @param string $username
263
+ * @param string $password
264
+ * @return boolean
265
+ */
266
+ public function login($username = '', $password = '')
267
+ {
268
+ if (!$this->connected) {
269
+ $this->setError('Not connected to POP3 server');
270
+ }
271
+ if (empty($username)) {
272
+ $username = $this->username;
273
+ }
274
+ if (empty($password)) {
275
+ $password = $this->password;
276
+ }
277
+
278
+ // Send the Username
279
+ $this->sendString("USER $username" . self::CRLF);
280
+ $pop3_response = $this->getResponse();
281
+ if ($this->checkResponse($pop3_response)) {
282
+ // Send the Password
283
+ $this->sendString("PASS $password" . self::CRLF);
284
+ $pop3_response = $this->getResponse();
285
+ if ($this->checkResponse($pop3_response)) {
286
+ return true;
287
+ }
288
+ }
289
+ return false;
290
+ }
291
+
292
+ /**
293
+ * Disconnect from the POP3 server.
294
+ * @access public
295
+ */
296
+ public function disconnect()
297
+ {
298
+ $this->sendString('QUIT');
299
+ //The QUIT command may cause the daemon to exit, which will kill our connection
300
+ //So ignore errors here
301
+ try {
302
+ @fclose($this->pop_conn);
303
+ } catch (Exception $e) {
304
+ //Do nothing
305
+ };
306
+ }
307
+
308
+ /**
309
+ * Get a response from the POP3 server.
310
+ * $size is the maximum number of bytes to retrieve
311
+ * @param integer $size
312
+ * @return string
313
+ * @access protected
314
+ */
315
+ protected function getResponse($size = 128)
316
+ {
317
+ $response = fgets($this->pop_conn, $size);
318
+ if ($this->do_debug >= 1) {
319
+ echo "Server -> Client: $response";
320
+ }
321
+ return $response;
322
+ }
323
+
324
+ /**
325
+ * Send raw data to the POP3 server.
326
+ * @param string $string
327
+ * @return integer
328
+ * @access protected
329
+ */
330
+ protected function sendString($string)
331
+ {
332
+ if ($this->pop_conn) {
333
+ if ($this->do_debug >= 2) { //Show client messages when debug >= 2
334
+ echo "Client -> Server: $string";
335
+ }
336
+ return fwrite($this->pop_conn, $string, strlen($string));
337
+ }
338
+ return 0;
339
+ }
340
+
341
+ /**
342
+ * Checks the POP3 server response.
343
+ * Looks for for +OK or -ERR.
344
+ * @param string $string
345
+ * @return boolean
346
+ * @access protected
347
+ */
348
+ protected function checkResponse($string)
349
+ {
350
+ if (substr($string, 0, 3) !== '+OK') {
351
+ $this->setError(array(
352
+ 'error' => "Server reported an error: $string",
353
+ 'errno' => 0,
354
+ 'errstr' => ''
355
+ ));
356
+ return false;
357
+ } else {
358
+ return true;
359
+ }
360
+ }
361
+
362
+ /**
363
+ * Add an error to the internal error store.
364
+ * Also display debug output if it's enabled.
365
+ * @param $error
366
+ * @access protected
367
+ */
368
+ protected function setError($error)
369
+ {
370
+ $this->errors[] = $error;
371
+ if ($this->do_debug >= 1) {
372
+ echo '<pre>';
373
+ foreach ($this->errors as $error) {
374
+ print_r($error);
375
+ }
376
+ echo '</pre>';
377
+ }
378
+ }
379
+
380
+ /**
381
+ * Get an array of error messages, if any.
382
+ * @return array
383
+ */
384
+ public function getErrors()
385
+ {
386
+ return $this->errors;
387
+ }
388
+
389
+ /**
390
+ * POP3 connection error handler.
391
+ * @param integer $errno
392
+ * @param string $errstr
393
+ * @param string $errfile
394
+ * @param integer $errline
395
+ * @access protected
396
+ */
397
+ protected function catchWarning($errno, $errstr, $errfile, $errline)
398
+ {
399
+ $this->setError(array(
400
+ 'error' => "Connecting to the POP3 server raised a PHP warning: ",
401
+ 'errno' => $errno,
402
+ 'errstr' => $errstr,
403
+ 'errfile' => $errfile,
404
+ 'errline' => $errline
405
+ ));
406
+ }
407
+ }
modules/mail/engines/class.smtp.php CHANGED
@@ -1,1249 +1,1249 @@
1
- <?php
2
- /**
3
- * PHPMailer RFC821 SMTP email transport class.
4
- * PHP Version 5
5
- * @package PHPMailer
6
- * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
7
- * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
- * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
- * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
- * @author Brent R. Matzelle (original founder)
11
- * @copyright 2014 Marcus Bointon
12
- * @copyright 2010 - 2012 Jim Jagielski
13
- * @copyright 2004 - 2009 Andy Prevost
14
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
- * @note This program is distributed in the hope that it will be useful - WITHOUT
16
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
- * FITNESS FOR A PARTICULAR PURPOSE.
18
- */
19
-
20
- /**
21
- * PHPMailer RFC821 SMTP email transport class.
22
- * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.
23
- * @package PHPMailer
24
- * @author Chris Ryan
25
- * @author Marcus Bointon <phpmailer@synchromedia.co.uk>
26
- */
27
- class SMTP
28
- {
29
- /**
30
- * The PHPMailer SMTP version number.
31
- * @var string
32
- */
33
- const VERSION = '5.2.17';
34
-
35
- /**
36
- * SMTP line break constant.
37
- * @var string
38
- */
39
- const CRLF = "\r\n";
40
-
41
- /**
42
- * The SMTP port to use if one is not specified.
43
- * @var integer
44
- */
45
- const DEFAULT_SMTP_PORT = 25;
46
-
47
- /**
48
- * The maximum line length allowed by RFC 2822 section 2.1.1
49
- * @var integer
50
- */
51
- const MAX_LINE_LENGTH = 998;
52
-
53
- /**
54
- * Debug level for no output
55
- */
56
- const DEBUG_OFF = 0;
57
-
58
- /**
59
- * Debug level to show client -> server messages
60
- */
61
- const DEBUG_CLIENT = 1;
62
-
63
- /**
64
- * Debug level to show client -> server and server -> client messages
65
- */
66
- const DEBUG_SERVER = 2;
67
-
68
- /**
69
- * Debug level to show connection status, client -> server and server -> client messages
70
- */
71
- const DEBUG_CONNECTION = 3;
72
-
73
- /**
74
- * Debug level to show all messages
75
- */
76
- const DEBUG_LOWLEVEL = 4;
77
-
78
- /**
79
- * The PHPMailer SMTP Version number.
80
- * @var string
81
- * @deprecated Use the `VERSION` constant instead
82
- * @see SMTP::VERSION
83
- */
84
- public $Version = '5.2.17';
85
-
86
- /**
87
- * SMTP server port number.
88
- * @var integer
89
- * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead
90
- * @see SMTP::DEFAULT_SMTP_PORT
91
- */
92
- public $SMTP_PORT = 25;
93
-
94
- /**
95
- * SMTP reply line ending.
96
- * @var string
97
- * @deprecated Use the `CRLF` constant instead
98
- * @see SMTP::CRLF
99
- */
100
- public $CRLF = "\r\n";
101
-
102
- /**
103
- * Debug output level.
104
- * Options:
105
- * * self::DEBUG_OFF (`0`) No debug output, default
106
- * * self::DEBUG_CLIENT (`1`) Client commands
107
- * * self::DEBUG_SERVER (`2`) Client commands and server responses
108
- * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
109
- * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages
110
- * @var integer
111
- */
112
- public $do_debug = self::DEBUG_OFF;
113
-
114
- /**
115
- * How to handle debug output.
116
- * Options:
117
- * * `echo` Output plain-text as-is, appropriate for CLI
118
- * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
119
- * * `error_log` Output to error log as configured in php.ini
120
- *
121
- * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
122
- * <code>
123
- * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
124
- * </code>
125
- * @var string|callable
126
- */
127
- public $Debugoutput = 'echo';
128
-
129
- /**
130
- * Whether to use VERP.
131
- * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
132
- * @link http://www.postfix.org/VERP_README.html Info on VERP
133
- * @var boolean
134
- */
135
- public $do_verp = false;
136
-
137
- /**
138
- * The timeout value for connection, in seconds.
139
- * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
140
- * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
141
- * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2
142
- * @var integer
143
- */
144
- public $Timeout = 300;
145
-
146
- /**
147
- * How long to wait for commands to complete, in seconds.
148
- * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
149
- * @var integer
150
- */
151
- public $Timelimit = 300;
152
-
153
- /**
154
- * @var array patterns to extract smtp transaction id from smtp reply
155
- * Only first capture group will be use, use non-capturing group to deal with it
156
- * Extend this class to override this property to fulfil your needs.
157
- */
158
- protected $smtp_transaction_id_patterns = array(
159
- 'exim' => '/[0-9]{3} OK id=(.*)/',
160
- 'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/',
161
- 'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/'
162
- );
163
-
164
- /**
165
- * The socket for the server connection.
166
- * @var resource
167
- */
168
- protected $smtp_conn;
169
-
170
- /**
171
- * Error information, if any, for the last SMTP command.
172
- * @var array
173
- */
174
- protected $error = array(
175
- 'error' => '',
176
- 'detail' => '',
177
- 'smtp_code' => '',
178
- 'smtp_code_ex' => ''
179
- );
180
-
181
- /**
182
- * The reply the server sent to us for HELO.
183
- * If null, no HELO string has yet been received.
184
- * @var string|null
185
- */
186
- protected $helo_rply = null;
187
-
188
- /**
189
- * The set of SMTP extensions sent in reply to EHLO command.
190
- * Indexes of the array are extension names.
191
- * Value at index 'HELO' or 'EHLO' (according to command that was sent)
192
- * represents the server name. In case of HELO it is the only element of the array.
193
- * Other values can be boolean TRUE or an array containing extension options.
194
- * If null, no HELO/EHLO string has yet been received.
195
- * @var array|null
196
- */
197
- protected $server_caps = null;
198
-
199
- /**
200
- * The most recent reply received from the server.
201
- * @var string
202
- */
203
- protected $last_reply = '';
204
-
205
- /**
206
- * Output debugging info via a user-selected method.
207
- * @see SMTP::$Debugoutput
208
- * @see SMTP::$do_debug
209
- * @param string $str Debug string to output
210
- * @param integer $level The debug level of this message; see DEBUG_* constants
211
- * @return void
212
- */
213
- protected function edebug($str, $level = 0)
214
- {
215
- if ($level > $this->do_debug) {
216
- return;
217
- }
218
- //Avoid clash with built-in function names
219
- if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
220
- call_user_func($this->Debugoutput, $str, $level);
221
- return;
222
- }
223
- switch ($this->Debugoutput) {
224
- case 'error_log':
225
- //Don't output, just log
226
- error_log($str);
227
- break;
228
- case 'html':
229
- //Cleans up output a bit for a better looking, HTML-safe output
230
- echo htmlentities(
231
- preg_replace('/[\r\n]+/', '', $str),
232
- ENT_QUOTES,
233
- 'UTF-8'
234
- )
235
- . "<br>\n";
236
- break;
237
- case 'echo':
238
- default:
239
- //Normalize line breaks
240
- $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
241
- echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
242
- "\n",
243
- "\n \t ",
244
- trim($str)
245
- )."\n";
246
- }
247
- }
248
-
249
- /**
250
- * Connect to an SMTP server.
251
- * @param string $host SMTP server IP or host name
252
- * @param integer $port The port number to connect to
253
- * @param integer $timeout How long to wait for the connection to open
254
- * @param array $options An array of options for stream_context_create()
255
- * @access public
256
- * @return boolean
257
- */
258
- public function connect($host, $port = null, $timeout = 30, $options = array())
259
- {
260
- static $streamok;
261
- //This is enabled by default since 5.0.0 but some providers disable it
262
- //Check this once and cache the result
263
- if (is_null($streamok)) {
264
- $streamok = function_exists('stream_socket_client');
265
- }
266
- // Clear errors to avoid confusion
267
- $this->setError('');
268
- // Make sure we are __not__ connected
269
- if ($this->connected()) {
270
- // Already connected, generate error
271
- $this->setError('Already connected to a server');
272
- return false;
273
- }
274
- if (empty($port)) {
275
- $port = self::DEFAULT_SMTP_PORT;
276
- }
277
- // Connect to the SMTP server
278
- $this->edebug(
279
- "Connection: opening to $host:$port, timeout=$timeout, options=".var_export($options, true),
280
- self::DEBUG_CONNECTION
281
- );
282
- $errno = 0;
283
- $errstr = '';
284
- if ($streamok) {
285
- $socket_context = stream_context_create($options);
286
- set_error_handler(array($this, 'errorHandler'));
287
- $this->smtp_conn = stream_socket_client(
288
- $host . ":" . $port,
289
- $errno,
290
- $errstr,
291
- $timeout,
292
- STREAM_CLIENT_CONNECT,
293
- $socket_context
294
- );
295
- restore_error_handler();
296
- } else {
297
- //Fall back to fsockopen which should work in more places, but is missing some features
298
- $this->edebug(
299
- "Connection: stream_socket_client not available, falling back to fsockopen",
300
- self::DEBUG_CONNECTION
301
- );
302
- set_error_handler(array($this, 'errorHandler'));
303
- $this->smtp_conn = fsockopen(
304
- $host,
305
- $port,
306
- $errno,
307
- $errstr,
308
- $timeout
309
- );
310
- restore_error_handler();
311
- }
312
- // Verify we connected properly
313
- if (!is_resource($this->smtp_conn)) {
314
- $this->setError(
315
- 'Failed to connect to server',
316
- $errno,
317
- $errstr
318
- );
319
- $this->edebug(
320
- 'SMTP ERROR: ' . $this->error['error']
321
- . ": $errstr ($errno)",
322
- self::DEBUG_CLIENT
323
- );
324
- return false;
325
- }
326
- $this->edebug('Connection: opened', self::DEBUG_CONNECTION);
327
- // SMTP server can take longer to respond, give longer timeout for first read
328
- // Windows does not have support for this timeout function
329
- if (substr(PHP_OS, 0, 3) != 'WIN') {
330
- $max = ini_get('max_execution_time');
331
- // Don't bother if unlimited
332
- if ($max != 0 && $timeout > $max) {
333
- @set_time_limit($timeout);
334
- }
335
- stream_set_timeout($this->smtp_conn, $timeout, 0);
336
- }
337
- // Get any announcement
338
- $announce = $this->get_lines();
339
- $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
340
- return true;
341
- }
342
-
343
- /**
344
- * Initiate a TLS (encrypted) session.
345
- * @access public
346
- * @return boolean
347
- */
348
- public function startTLS()
349
- {
350
- if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
351
- return false;
352
- }
353
-
354
- //Allow the best TLS version(s) we can
355
- $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;
356
-
357
- //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT
358
- //so add them back in manually if we can
359
- if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
360
- $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
361
- $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
362
- }
363
-
364
- // Begin encrypted connection
365
- if (!stream_socket_enable_crypto(
366
- $this->smtp_conn,
367
- true,
368
- $crypto_method
369
- )) {
370
- return false;
371
- }
372
- return true;
373
- }
374
-
375
- /**
376
- * Perform SMTP authentication.
377
- * Must be run after hello().
378
- * @see hello()
379
- * @param string $username The user name
380
- * @param string $password The password
381
- * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5, XOAUTH2)
382
- * @param string $realm The auth realm for NTLM
383
- * @param string $workstation The auth workstation for NTLM
384
- * @param null|OAuth $OAuth An optional OAuth instance (@see PHPMailerOAuth)
385
- * @return bool True if successfully authenticated.* @access public
386
- */
387
- public function authenticate(
388
- $username,
389
- $password,
390
- $authtype = null,
391
- $realm = '',
392
- $workstation = '',
393
- $OAuth = null
394
- ) {
395
- if (!$this->server_caps) {
396
- $this->setError('Authentication is not allowed before HELO/EHLO');
397
- return false;
398
- }
399
-
400
- if (array_key_exists('EHLO', $this->server_caps)) {
401
- // SMTP extensions are available. Let's try to find a proper authentication method
402
-
403
- if (!array_key_exists('AUTH', $this->server_caps)) {
404
- $this->setError('Authentication is not allowed at this stage');
405
- // 'at this stage' means that auth may be allowed after the stage changes
406
- // e.g. after STARTTLS
407
- return false;
408
- }
409
-
410
- self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
411
- self::edebug(
412
- 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
413
- self::DEBUG_LOWLEVEL
414
- );
415
-
416
- if (empty($authtype)) {
417
- foreach (array('CRAM-MD5', 'LOGIN', 'PLAIN', 'NTLM', 'XOAUTH2') as $method) {
418
- if (in_array($method, $this->server_caps['AUTH'])) {
419
- $authtype = $method;
420
- break;
421
- }
422
- }
423
- if (empty($authtype)) {
424
- $this->setError('No supported authentication methods found');
425
- return false;
426
- }
427
- self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL);
428
- }
429
-
430
- if (!in_array($authtype, $this->server_caps['AUTH'])) {
431
- $this->setError("The requested authentication method \"$authtype\" is not supported by the server");
432
- return false;
433
- }
434
- } elseif (empty($authtype)) {
435
- $authtype = 'LOGIN';
436
- }
437
- switch ($authtype) {
438
- case 'PLAIN':
439
- // Start authentication
440
- if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
441
- return false;
442
- }
443
- // Send encoded username and password
444
- if (!$this->sendCommand(
445
- 'User & Password',
446
- base64_encode("\0" . $username . "\0" . $password),
447
- 235
448
- )
449
- ) {
450
- return false;
451
- }
452
- break;
453
- case 'LOGIN':
454
- // Start authentication
455
- if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
456
- return false;
457
- }
458
- if (!$this->sendCommand("Username", base64_encode($username), 334)) {
459
- return false;
460
- }
461
- if (!$this->sendCommand("Password", base64_encode($password), 235)) {
462
- return false;
463
- }
464
- break;
465
- case 'XOAUTH2':
466
- //If the OAuth Instance is not set. Can be a case when PHPMailer is used
467
- //instead of PHPMailerOAuth
468
- if (is_null($OAuth)) {
469
- return false;
470
- }
471
- $oauth = $OAuth->getOauth64();
472
-
473
- // Start authentication
474
- if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth, 235)) {
475
- return false;
476
- }
477
- break;
478
- case 'NTLM':
479
- /*
480
- * ntlm_sasl_client.php
481
- * Bundled with Permission
482
- *
483
- * How to telnet in windows:
484
- * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx
485
- * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication
486
- */
487
- require_once 'extras/ntlm_sasl_client.php';
488
- $temp = new stdClass;
489
- $ntlm_client = new ntlm_sasl_client_class;
490
- //Check that functions are available
491
- if (!$ntlm_client->initialize($temp)) {
492
- $this->setError($temp->error);
493
- $this->edebug(
494
- 'You need to enable some modules in your php.ini file: '
495
- . $this->error['error'],
496
- self::DEBUG_CLIENT
497
- );
498
- return false;
499
- }
500
- //msg1
501
- $msg1 = $ntlm_client->typeMsg1($realm, $workstation); //msg1
502
-
503
- if (!$this->sendCommand(
504
- 'AUTH NTLM',
505
- 'AUTH NTLM ' . base64_encode($msg1),
506
- 334
507
- )
508
- ) {
509
- return false;
510
- }
511
- //Though 0 based, there is a white space after the 3 digit number
512
- //msg2
513
- $challenge = substr($this->last_reply, 3);
514
- $challenge = base64_decode($challenge);
515
- $ntlm_res = $ntlm_client->NTLMResponse(
516
- substr($challenge, 24, 8),
517
- $password
518
- );
519
- //msg3
520
- $msg3 = $ntlm_client->typeMsg3(
521
- $ntlm_res,
522
- $username,
523
- $realm,
524
- $workstation
525
- );
526
- // send encoded username
527
- return $this->sendCommand('Username', base64_encode($msg3), 235);
528
- case 'CRAM-MD5':
529
- // Start authentication
530
- if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
531
- return false;
532
- }
533
- // Get the challenge
534
- $challenge = base64_decode(substr($this->last_reply, 4));
535
-
536
- // Build the response
537
- $response = $username . ' ' . $this->hmac($challenge, $password);
538
-
539
- // send encoded credentials
540
- return $this->sendCommand('Username', base64_encode($response), 235);
541
- default:
542
- $this->setError("Authentication method \"$authtype\" is not supported");
543
- return false;
544
- }
545
- return true;
546
- }
547
-
548
- /**
549
- * Calculate an MD5 HMAC hash.
550
- * Works like hash_hmac('md5', $data, $key)
551
- * in case that function is not available
552
- * @param string $data The data to hash
553
- * @param string $key The key to hash with
554
- * @access protected
555
- * @return string
556
- */
557
- protected function hmac($data, $key)
558
- {
559
- if (function_exists('hash_hmac')) {
560
- return hash_hmac('md5', $data, $key);
561
- }
562
-
563
- // The following borrowed from
564
- // http://php.net/manual/en/function.mhash.php#27225
565
-
566
- // RFC 2104 HMAC implementation for php.
567
- // Creates an md5 HMAC.
568
- // Eliminates the need to install mhash to compute a HMAC
569
- // by Lance Rushing
570
-
571
- $bytelen = 64; // byte length for md5
572
- if (strlen($key) > $bytelen) {
573
- $key = pack('H*', md5($key));
574
- }
575
- $key = str_pad($key, $bytelen, chr(0x00));
576
- $ipad = str_pad('', $bytelen, chr(0x36));
577
- $opad = str_pad('', $bytelen, chr(0x5c));
578
- $k_ipad = $key ^ $ipad;
579
- $k_opad = $key ^ $opad;
580
-
581
- return md5($k_opad . pack('H*', md5($k_ipad . $data)));
582
- }
583
-
584
- /**
585
- * Check connection state.
586
- * @access public
587
- * @return boolean True if connected.
588
- */
589
- public function connected()
590
- {
591
- if (is_resource($this->smtp_conn)) {
592
- $sock_status = stream_get_meta_data($this->smtp_conn);
593
- if ($sock_status['eof']) {
594
- // The socket is valid but we are not connected
595
- $this->edebug(
596
- 'SMTP NOTICE: EOF caught while checking if connected',
597
- self::DEBUG_CLIENT
598
- );
599
- $this->close();
600
- return false;
601
- }
602
- return true; // everything looks good
603
- }
604
- return false;
605
- }
606
-
607
- /**
608
- * Close the socket and clean up the state of the class.
609
- * Don't use this function without first trying to use QUIT.
610
- * @see quit()
611
- * @access public
612
- * @return void
613
- */
614
- public function close()
615
- {
616
- $this->setError('');
617
- $this->server_caps = null;
618
- $this->helo_rply = null;
619
- if (is_resource($this->smtp_conn)) {
620
- // close the connection and cleanup
621
- fclose($this->smtp_conn);
622
- $this->smtp_conn = null; //Makes for cleaner serialization
623
- $this->edebug('Connection: closed', self::DEBUG_CONNECTION);
624
- }
625
- }
626
-
627
- /**
628
- * Send an SMTP DATA command.
629
- * Issues a data command and sends the msg_data to the server,
630
- * finializing the mail transaction. $msg_data is the message
631
- * that is to be send with the headers. Each header needs to be
632
- * on a single line followed by a <CRLF> with the message headers
633
- * and the message body being separated by and additional <CRLF>.
634
- * Implements rfc 821: DATA <CRLF>
635
- * @param string $msg_data Message data to send
636
- * @access public
637
- * @return boolean
638
- */
639
- public function data($msg_data)
640
- {
641
- //This will use the standard timelimit
642
- if (!$this->sendCommand('DATA', 'DATA', 354)) {
643
- return false;
644
- }
645
-
646
- /* The server is ready to accept data!
647
- * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)
648
- * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into
649
- * smaller lines to fit within the limit.
650
- * We will also look for lines that start with a '.' and prepend an additional '.'.
651
- * NOTE: this does not count towards line-length limit.
652
- */
653
-
654
- // Normalize line breaks before exploding
655
- $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data));
656
-
657
- /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
658
- * of the first line (':' separated) does not contain a space then it _should_ be a header and we will
659
- * process all lines before a blank line as headers.
660
- */
661
-
662
- $field = substr($lines[0], 0, strpos($lines[0], ':'));
663
- $in_headers = false;
664
- if (!empty($field) && strpos($field, ' ') === false) {
665
- $in_headers = true;
666
- }
667
-
668
- foreach ($lines as $line) {
669
- $lines_out = array();
670
- if ($in_headers and $line == '') {
671
- $in_headers = false;
672
- }
673
- //Break this line up into several smaller lines if it's too long
674
- //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len),
675
- while (isset($line[self::MAX_LINE_LENGTH])) {
676
- //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on
677
- //so as to avoid breaking in the middle of a word
678
- $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');
679
- //Deliberately matches both false and 0
680
- if (!$pos) {
681
- //No nice break found, add a hard break
682
- $pos = self::MAX_LINE_LENGTH - 1;
683
- $lines_out[] = substr($line, 0, $pos);
684
- $line = substr($line, $pos);
685
- } else {
686
- //Break at the found point
687
- $lines_out[] = substr($line, 0, $pos);
688
- //Move along by the amount we dealt with
689
- $line = substr($line, $pos + 1);
690
- }
691
- //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1
692
- if ($in_headers) {
693
- $line = "\t" . $line;
694
- }
695
- }
696
- $lines_out[] = $line;
697
-
698
- //Send the lines to the server
699
- foreach ($lines_out as $line_out) {
700
- //RFC2821 section 4.5.2
701
- if (!empty($line_out) and $line_out[0] == '.') {
702
- $line_out = '.' . $line_out;
703
- }
704
- $this->client_send($line_out . self::CRLF);
705
- }
706
- }
707
-
708
- //Message data has been sent, complete the command
709
- //Increase timelimit for end of DATA command
710
- $savetimelimit = $this->Timelimit;
711
- $this->Timelimit = $this->Timelimit * 2;
712
- $result = $this->sendCommand('DATA END', '.', 250);
713
- //Restore timelimit
714
- $this->Timelimit = $savetimelimit;
715
- return $result;
716
- }
717
-
718
- /**
719
- * Send an SMTP HELO or EHLO command.
720
- * Used to identify the sending server to the receiving server.
721
- * This makes sure that client and server are in a known state.
722
- * Implements RFC 821: HELO <SP> <domain> <CRLF>
723
- * and RFC 2821 EHLO.
724
- * @param string $host The host name or IP to connect to
725
- * @access public
726
- * @return boolean
727
- */
728
- public function hello($host = '')
729
- {
730
- //Try extended hello first (RFC 2821)
731
- return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));
732
- }
733
-
734
- /**
735
- * Send an SMTP HELO or EHLO command.
736
- * Low-level implementation used by hello()
737
- * @see hello()
738
- * @param string $hello The HELO string
739
- * @param string $host The hostname to say we are
740
- * @access protected
741
- * @return boolean
742
- */
743
- protected function sendHello($hello, $host)
744
- {
745
- $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);
746
- $this->helo_rply = $this->last_reply;
747
- if ($noerror) {
748
- $this->parseHelloFields($hello);
749
- } else {
750
- $this->server_caps = null;
751
- }
752
- return $noerror;
753
- }
754
-
755
- /**
756
- * Parse a reply to HELO/EHLO command to discover server extensions.
757
- * In case of HELO, the only parameter that can be discovered is a server name.
758
- * @access protected
759
- * @param string $type - 'HELO' or 'EHLO'
760
- */
761
- protected function parseHelloFields($type)
762
- {
763
- $this->server_caps = array();
764
- $lines = explode("\n", $this->helo_rply);
765
-
766
- foreach ($lines as $n => $s) {
767
- //First 4 chars contain response code followed by - or space
768
- $s = trim(substr($s, 4));
769
- if (empty($s)) {
770
- continue;
771
- }
772
- $fields = explode(' ', $s);
773
- if (!empty($fields)) {
774
- if (!$n) {
775
- $name = $type;
776
- $fields = $fields[0];
777
- } else {
778
- $name = array_shift($fields);
779
- switch ($name) {
780
- case 'SIZE':
781
- $fields = ($fields ? $fields[0] : 0);
782
- break;
783
- case 'AUTH':
784
- if (!is_array($fields)) {
785
- $fields = array();
786
- }
787
- break;
788
- default:
789
- $fields = true;
790
- }
791
- }
792
- $this->server_caps[$name] = $fields;
793
- }
794
- }
795
- }
796
-
797
- /**
798
- * Send an SMTP MAIL command.
799
- * Starts a mail transaction from the email address specified in
800
- * $from. Returns true if successful or false otherwise. If True
801
- * the mail transaction is started and then one or more recipient
802
- * commands may be called followed by a data command.
803
- * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
804
- * @param string $from Source address of this message
805
- * @access public
806
- * @return boolean
807
- */
808
- public function mail($from)
809
- {
810
- $useVerp = ($this->do_verp ? ' XVERP' : '');
811
- return $this->sendCommand(
812
- 'MAIL FROM',
813
- 'MAIL FROM:<' . $from . '>' . $useVerp,
814
- 250
815
- );
816
- }
817
-
818
- /**
819
- * Send an SMTP QUIT command.
820
- * Closes the socket if there is no error or the $close_on_error argument is true.
821
- * Implements from rfc 821: QUIT <CRLF>
822
- * @param boolean $close_on_error Should the connection close if an error occurs?
823
- * @access public
824
- * @return boolean
825
- */
826
- public function quit($close_on_error = true)
827
- {
828
- $noerror = $this->sendCommand('QUIT', 'QUIT', 221);
829
- $err = $this->error; //Save any error
830
- if ($noerror or $close_on_error) {
831
- $this->close();
832
- $this->error = $err; //Restore any error from the quit command
833
- }
834
- return $noerror;
835
- }
836
-
837
- /**
838
- * Send an SMTP RCPT command.
839
- * Sets the TO argument to $toaddr.
840
- * Returns true if the recipient was accepted false if it was rejected.
841
- * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
842
- * @param string $address The address the message is being sent to
843
- * @access public
844
- * @return boolean
845
- */
846
- public function recipient($address)
847
- {
848
- return $this->sendCommand(
849
- 'RCPT TO',
850
- 'RCPT TO:<' . $address . '>',
851
- array(250, 251)
852
- );
853
- }
854
-
855
- /**
856
- * Send an SMTP RSET command.
857
- * Abort any transaction that is currently in progress.
858
- * Implements rfc 821: RSET <CRLF>
859
- * @access public
860
- * @return boolean True on success.
861
- */
862
- public function reset()
863
- {
864
- return $this->sendCommand('RSET', 'RSET', 250);
865
- }
866
-
867
- /**
868
- * Send a command to an SMTP server and check its return code.
869
- * @param string $command The command name - not sent to the server
870
- * @param string $commandstring The actual command to send
871
- * @param integer|array $expect One or more expected integer success codes
872
- * @access protected
873
- * @return boolean True on success.
874
- */
875
- protected function sendCommand($command, $commandstring, $expect)
876
- {
877
- if (!$this->connected()) {
878
- $this->setError("Called $command without being connected");
879
- return false;
880
- }
881
- //Reject line breaks in all commands
882
- if (strpos($commandstring, "\n") !== false or strpos($commandstring, "\r") !== false) {
883
- $this->setError("Command '$command' contained line breaks");
884
- return false;
885
- }
886
- $this->client_send($commandstring . self::CRLF);
887
-
888
- $this->last_reply = $this->get_lines();
889
- // Fetch SMTP code and possible error code explanation
890
- $matches = array();
891
- if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) {
892
- $code = $matches[1];
893
- $code_ex = (count($matches) > 2 ? $matches[2] : null);
894
- // Cut off error code from each response line
895
- $detail = preg_replace(
896
- "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m",
897
- '',
898
- $this->last_reply
899
- );
900
- } else {
901
- // Fall back to simple parsing if regex fails
902
- $code = substr($this->last_reply, 0, 3);
903
- $code_ex = null;
904
- $detail = substr($this->last_reply, 4);
905
- }
906
-
907
- $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
908
-
909
- if (!in_array($code, (array)$expect)) {
910
- $this->setError(
911
- "$command command failed",
912
- $detail,
913
- $code,
914
- $code_ex
915
- );
916
- $this->edebug(
917
- 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,
918
- self::DEBUG_CLIENT
919
- );
920
- return false;
921
- }
922
-
923
- $this->setError('');
924
- return true;
925
- }
926
-
927
- /**
928
- * Send an SMTP SAML command.
929
- * Starts a mail transaction from the email address specified in $from.
930
- * Returns true if successful or false otherwise. If True
931
- * the mail transaction is started and then one or more recipient
932
- * commands may be called followed by a data command. This command
933
- * will send the message to the users terminal if they are logged
934
- * in and send them an email.
935
- * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
936
- * @param string $from The address the message is from
937
- * @access public
938
- * @return boolean
939
- */
940
- public function sendAndMail($from)
941
- {
942
- return $this->sendCommand('SAML', "SAML FROM:$from", 250);
943
- }
944
-
945
- /**
946
- * Send an SMTP VRFY command.
947
- * @param string $name The name to verify
948
- * @access public
949
- * @return boolean
950
- */
951
- public function verify($name)
952
- {
953
- return $this->sendCommand('VRFY', "VRFY $name", array(250, 251));
954
- }
955
-
956
- /**
957
- * Send an SMTP NOOP command.
958
- * Used to keep keep-alives alive, doesn't actually do anything
959
- * @access public
960
- * @return boolean
961
- */
962
- public function noop()
963
- {
964
- return $this->sendCommand('NOOP', 'NOOP', 250);
965
- }
966
-
967
- /**
968
- * Send an SMTP TURN command.
969
- * This is an optional command for SMTP that this class does not support.
970
- * This method is here to make the RFC821 Definition complete for this class
971
- * and _may_ be implemented in future
972
- * Implements from rfc 821: TURN <CRLF>
973
- * @access public
974
- * @return boolean
975
- */
976
- public function turn()
977
- {
978
- $this->setError('The SMTP TURN command is not implemented');
979
- $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
980
- return false;
981
- }
982
-
983
- /**
984
- * Send raw data to the server.
985
- * @param string $data The data to send
986
- * @access public
987
- * @return integer|boolean The number of bytes sent to the server or false on error
988
- */
989
- public function client_send($data)
990
- {
991
- $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT);
992
- return fwrite($this->smtp_conn, $data);
993
- }
994
-
995
- /**
996
- * Get the latest error.
997
- * @access public
998
- * @return array
999
- */
1000
- public function getError()
1001
- {
1002
- return $this->error;
1003
- }
1004
-
1005
- /**
1006
- * Get SMTP extensions available on the server
1007
- * @access public
1008
- * @return array|null
1009
- */
1010
- public function getServerExtList()
1011
- {
1012
- return $this->server_caps;
1013
- }
1014
-
1015
- /**
1016
- * A multipurpose method
1017
- * The method works in three ways, dependent on argument value and current state
1018
- * 1. HELO/EHLO was not sent - returns null and set up $this->error
1019
- * 2. HELO was sent
1020
- * $name = 'HELO': returns server name
1021
- * $name = 'EHLO': returns boolean false
1022
- * $name = any string: returns null and set up $this->error
1023
- * 3. EHLO was sent
1024
- * $name = 'HELO'|'EHLO': returns server name
1025
- * $name = any string: if extension $name exists, returns boolean True
1026
- * or its options. Otherwise returns boolean False
1027
- * In other words, one can use this method to detect 3 conditions:
1028
- * - null returned: handshake was not or we don't know about ext (refer to $this->error)
1029
- * - false returned: the requested feature exactly not exists
1030
- * - positive value returned: the requested feature exists
1031
- * @param string $name Name of SMTP extension or 'HELO'|'EHLO'
1032
- * @return mixed
1033
- */
1034
- public function getServerExt($name)
1035
- {
1036
- if (!$this->server_caps) {
1037
- $this->setError('No HELO/EHLO was sent');
1038
- return null;
1039
- }
1040
-
1041
- // the tight logic knot ;)
1042
- if (!array_key_exists($name, $this->server_caps)) {
1043
- if ($name == 'HELO') {
1044
- return $this->server_caps['EHLO'];
1045
- }
1046
- if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
1047
- return false;
1048
- }
1049
- $this->setError('HELO handshake was used. Client knows nothing about server extensions');
1050
- return null;
1051
- }
1052
-
1053
- return $this->server_caps[$name];
1054
- }
1055
-
1056
- /**
1057
- * Get the last reply from the server.
1058
- * @access public
1059
- * @return string
1060
- */
1061
- public function getLastReply()
1062
- {
1063
- return $this->last_reply;
1064
- }
1065
-
1066
- /**
1067
- * Read the SMTP server's response.
1068
- * Either before eof or socket timeout occurs on the operation.
1069
- * With SMTP we can tell if we have more lines to read if the
1070
- * 4th character is '-' symbol. If it is a space then we don't
1071
- * need to read anything else.
1072
- * @access protected
1073
- * @return string
1074
- */
1075
- protected function get_lines()
1076
- {
1077
- // If the connection is bad, give up straight away
1078
- if (!is_resource($this->smtp_conn)) {
1079
- return '';
1080
- }
1081
- $data = '';
1082
- $endtime = 0;
1083
- stream_set_timeout($this->smtp_conn, $this->Timeout);
1084
- if ($this->Timelimit > 0) {
1085
- $endtime = time() + $this->Timelimit;
1086
- }
1087
- while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
1088
- $str = @fgets($this->smtp_conn, 515);
1089
- $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
1090
- $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL);
1091
- $data .= $str;
1092
- // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen
1093
- if ((isset($str[3]) and $str[3] == ' ')) {
1094
- break;
1095
- }
1096
- // Timed-out? Log and break
1097
- $info = stream_get_meta_data($this->smtp_conn);
1098
- if ($info['timed_out']) {
1099
- $this->edebug(
1100
- 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
1101
- self::DEBUG_LOWLEVEL
1102
- );
1103
- break;
1104
- }
1105
- // Now check if reads took too long
1106
- if ($endtime and time() > $endtime) {
1107
- $this->edebug(
1108
- 'SMTP -> get_lines(): timelimit reached ('.
1109
- $this->Timelimit . ' sec)',
1110
- self::DEBUG_LOWLEVEL
1111
- );
1112
- break;
1113
- }
1114
- }
1115
- return $data;
1116
- }
1117
-
1118
- /**
1119
- * Enable or disable VERP address generation.
1120
- * @param boolean $enabled
1121
- */
1122
- public function setVerp($enabled = false)
1123
- {
1124
- $this->do_verp = $enabled;
1125
- }
1126
-
1127
- /**
1128
- * Get VERP address generation mode.
1129
- * @return boolean
1130
- */
1131
- public function getVerp()
1132
- {
1133
- return $this->do_verp;
1134
- }
1135
-
1136
- /**
1137
- * Set error messages and codes.
1138
- * @param string $message The error message
1139
- * @param string $detail Further detail on the error
1140
- * @param string $smtp_code An associated SMTP error code
1141
- * @param string $smtp_code_ex Extended SMTP code
1142
- */
1143
- protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '')
1144
- {
1145
- $this->error = array(
1146
- 'error' => $message,
1147
- 'detail' => $detail,
1148
- 'smtp_code' => $smtp_code,
1149
- 'smtp_code_ex' => $smtp_code_ex
1150
- );
1151
- }
1152
-
1153
- /**
1154
- * Set debug output method.
1155
- * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.
1156
- */
1157
- public function setDebugOutput($method = 'echo')
1158
- {
1159
- $this->Debugoutput = $method;
1160
- }
1161
-
1162
- /**
1163
- * Get debug output method.
1164
- * @return string
1165
- */
1166
- public function getDebugOutput()
1167
- {
1168
- return $this->Debugoutput;
1169
- }
1170
-
1171
- /**
1172
- * Set debug output level.
1173
- * @param integer $level
1174
- */
1175
- public function setDebugLevel($level = 0)
1176
- {
1177
- $this->do_debug = $level;
1178
- }
1179
-
1180
- /**
1181
- * Get debug output level.
1182
- * @return integer
1183
- */
1184
- public function getDebugLevel()
1185
- {
1186
- return $this->do_debug;
1187
- }
1188
-
1189
- /**
1190
- * Set SMTP timeout.
1191
- * @param integer $timeout
1192
- */
1193
- public function setTimeout($timeout = 0)
1194
- {
1195
- $this->Timeout = $timeout;
1196
- }
1197
-
1198
- /**
1199
- * Get SMTP timeout.
1200
- * @return integer
1201
- */
1202
- public function getTimeout()
1203
- {
1204
- return $this->Timeout;
1205
- }
1206
-
1207
- /**
1208
- * Reports an error number and string.
1209
- * @param integer $errno The error number returned by PHP.
1210
- * @param string $errmsg The error message returned by PHP.
1211
- */
1212
- protected function errorHandler($errno, $errmsg)
1213
- {
1214
- $notice = 'Connection: Failed to connect to server.';
1215
- $this->setError(
1216
- $notice,
1217
- $errno,
1218
- $errmsg
1219
- );
1220
- $this->edebug(
1221
- $notice . ' Error number ' . $errno . '. "Error notice: ' . $errmsg,
1222
- self::DEBUG_CONNECTION
1223
- );
1224
- }
1225
-
1226
- /**
1227
- * Will return the ID of the last smtp transaction based on a list of patterns provided
1228
- * in SMTP::$smtp_transaction_id_patterns.
1229
- * If no reply has been received yet, it will return null.
1230
- * If no pattern has been matched, it will return false.
1231
- * @return bool|null|string
1232
- */
1233
- public function getLastTransactionID()
1234
- {
1235
- $reply = $this->getLastReply();
1236
-
1237
- if (empty($reply)) {
1238
- return null;
1239
- }
1240
-
1241
- foreach($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) {
1242
- if(preg_match($smtp_transaction_id_pattern, $reply, $matches)) {
1243
- return $matches[1];
1244
- }
1245
- }
1246
-
1247
- return false;
1248
- }
1249
- }
1
+ <?php
2
+ /**
3
+ * PHPMailer RFC821 SMTP email transport class.
4
+ * PHP Version 5
5
+ * @package PHPMailer
6
+ * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
7
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
8
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
9
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
10
+ * @author Brent R. Matzelle (original founder)
11
+ * @copyright 2014 Marcus Bointon
12
+ * @copyright 2010 - 2012 Jim Jagielski
13
+ * @copyright 2004 - 2009 Andy Prevost
14
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
15
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
16
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
+ * FITNESS FOR A PARTICULAR PURPOSE.
18
+ */
19
+
20
+ /**
21
+ * PHPMailer RFC821 SMTP email transport class.
22
+ * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.
23
+ * @package PHPMailer
24
+ * @author Chris Ryan
25
+ * @author Marcus Bointon <phpmailer@synchromedia.co.uk>
26
+ */
27
+ class SMTP
28
+ {
29
+ /**
30
+ * The PHPMailer SMTP version number.
31
+ * @var string
32
+ */
33
+ const VERSION = '5.2.17';
34
+
35
+ /**
36
+ * SMTP line break constant.
37
+ * @var string
38
+ */
39
+ const CRLF = "\r\n";
40
+
41
+ /**
42
+ * The SMTP port to use if one is not specified.
43
+ * @var integer
44
+ */
45
+ const DEFAULT_SMTP_PORT = 25;
46
+
47
+ /**
48
+ * The maximum line length allowed by RFC 2822 section 2.1.1
49
+ * @var integer
50
+ */
51
+ const MAX_LINE_LENGTH = 998;
52
+
53
+ /**
54
+ * Debug level for no output
55
+ */
56
+ const DEBUG_OFF = 0;
57
+
58
+ /**
59
+ * Debug level to show client -> server messages
60
+ */
61
+ const DEBUG_CLIENT = 1;
62
+
63
+ /**
64
+ * Debug level to show client -> server and server -> client messages
65
+ */
66
+ const DEBUG_SERVER = 2;
67
+
68
+ /**
69
+ * Debug level to show connection status, client -> server and server -> client messages
70
+ */
71
+ const DEBUG_CONNECTION = 3;
72
+
73
+ /**
74
+ * Debug level to show all messages
75
+ */
76
+ const DEBUG_LOWLEVEL = 4;
77
+
78
+ /**
79
+ * The PHPMailer SMTP Version number.
80
+ * @var string
81
+ * @deprecated Use the `VERSION` constant instead
82
+ * @see SMTP::VERSION
83
+ */
84
+ public $Version = '5.2.17';
85
+
86
+ /**
87
+ * SMTP server port number.
88
+ * @var integer
89
+ * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead
90
+ * @see SMTP::DEFAULT_SMTP_PORT
91
+ */
92
+ public $SMTP_PORT = 25;
93
+
94
+ /**
95
+ * SMTP reply line ending.
96
+ * @var string
97
+ * @deprecated Use the `CRLF` constant instead
98
+ * @see SMTP::CRLF
99
+ */
100
+ public $CRLF = "\r\n";
101
+
102
+ /**
103
+ * Debug output level.
104
+ * Options:
105
+ * * self::DEBUG_OFF (`0`) No debug output, default
106
+ * * self::DEBUG_CLIENT (`1`) Client commands
107
+ * * self::DEBUG_SERVER (`2`) Client commands and server responses
108
+ * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
109
+ * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages
110
+ * @var integer
111
+ */
112
+ public $do_debug = self::DEBUG_OFF;
113
+
114
+ /**
115
+ * How to handle debug output.
116
+ * Options:
117
+ * * `echo` Output plain-text as-is, appropriate for CLI
118
+ * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
119
+ * * `error_log` Output to error log as configured in php.ini
120
+ *
121
+ * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
122
+ * <code>
123
+ * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
124
+ * </code>
125
+ * @var string|callable
126
+ */
127
+ public $Debugoutput = 'echo';
128
+
129
+ /**
130
+ * Whether to use VERP.
131
+ * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
132
+ * @link http://www.postfix.org/VERP_README.html Info on VERP
133
+ * @var boolean
134
+ */
135
+ public $do_verp = false;
136
+
137
+ /**
138
+ * The timeout value for connection, in seconds.
139
+ * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
140
+ * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
141
+ * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2
142
+ * @var integer
143
+ */
144
+ public $Timeout = 300;
145
+
146
+ /**
147
+ * How long to wait for commands to complete, in seconds.
148
+ * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
149
+ * @var integer
150
+ */
151
+ public $Timelimit = 300;
152
+
153
+ /**
154
+ * @var array patterns to extract smtp transaction id from smtp reply
155
+ * Only first capture group will be use, use non-capturing group to deal with it
156
+ * Extend this class to override this property to fulfil your needs.
157
+ */
158
+ protected $smtp_transaction_id_patterns = array(
159
+ 'exim' => '/[0-9]{3} OK id=(.*)/',
160
+ 'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/',
161
+ 'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/'
162
+ );
163
+
164
+ /**
165
+ * The socket for the server connection.
166
+ * @var resource
167
+ */
168
+ protected $smtp_conn;
169
+
170
+ /**
171
+ * Error information, if any, for the last SMTP command.
172
+ * @var array
173
+ */
174
+ protected $error = array(
175
+ 'error' => '',
176
+ 'detail' => '',
177
+ 'smtp_code' => '',
178
+ 'smtp_code_ex' => ''
179
+ );
180
+
181
+ /**
182
+ * The reply the server sent to us for HELO.
183
+ * If null, no HELO string has yet been received.
184
+ * @var string|null
185
+ */
186
+ protected $helo_rply = null;
187
+
188
+ /**
189
+ * The set of SMTP extensions sent in reply to EHLO command.
190
+ * Indexes of the array are extension names.
191
+ * Value at index 'HELO' or 'EHLO' (according to command that was sent)
192
+ * represents the server name. In case of HELO it is the only element of the array.
193
+ * Other values can be boolean TRUE or an array containing extension options.
194
+ * If null, no HELO/EHLO string has yet been received.
195
+ * @var array|null
196
+ */
197
+ protected $server_caps = null;
198
+
199
+ /**
200
+ * The most recent reply received from the server.
201
+ * @var string
202
+ */
203
+ protected $last_reply = '';
204
+
205
+ /**
206
+ * Output debugging info via a user-selected method.
207
+ * @see SMTP::$Debugoutput
208
+ * @see SMTP::$do_debug
209
+ * @param string $str Debug string to output
210
+ * @param integer $level The debug level of this message; see DEBUG_* constants
211
+ * @return void
212
+ */
213
+ protected function edebug($str, $level = 0)
214
+ {
215
+ if ($level > $this->do_debug) {
216
+ return;
217
+ }
218
+ //Avoid clash with built-in function names
219
+ if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
220
+ call_user_func($this->Debugoutput, $str, $level);
221
+ return;
222
+ }
223
+ switch ($this->Debugoutput) {
224
+ case 'error_log':
225
+ //Don't output, just log
226
+ error_log($str);
227
+ break;
228
+ case 'html':
229
+ //Cleans up output a bit for a better looking, HTML-safe output
230
+ echo htmlentities(
231
+ preg_replace('/[\r\n]+/', '', $str),
232
+ ENT_QUOTES,
233
+ 'UTF-8'
234
+ )
235
+ . "<br>\n";
236
+ break;
237
+ case 'echo':
238
+ default:
239
+ //Normalize line breaks
240
+ $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
241
+ echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
242
+ "\n",
243
+ "\n \t ",
244
+ trim($str)
245
+ )."\n";
246
+ }
247
+ }
248
+
249
+ /**
250
+ * Connect to an SMTP server.
251
+ * @param string $host SMTP server IP or host name
252
+ * @param integer $port The port number to connect to
253
+ * @param integer $timeout How long to wait for the connection to open
254
+ * @param array $options An array of options for stream_context_create()
255
+ * @access public
256
+ * @return boolean
257
+ */
258
+ public function connect($host, $port = null, $timeout = 30, $options = array())
259
+ {
260
+ static $streamok;
261
+ //This is enabled by default since 5.0.0 but some providers disable it
262
+ //Check this once and cache the result
263
+ if (is_null($streamok)) {
264
+ $streamok = function_exists('stream_socket_client');
265
+ }
266
+ // Clear errors to avoid confusion
267
+ $this->setError('');
268
+ // Make sure we are __not__ connected
269
+ if ($this->connected()) {
270
+ // Already connected, generate error
271
+ $this->setError('Already connected to a server');
272
+ return false;
273
+ }
274
+ if (empty($port)) {
275
+ $port = self::DEFAULT_SMTP_PORT;
276
+ }
277
+ // Connect to the SMTP server
278
+ $this->edebug(
279
+ "Connection: opening to $host:$port, timeout=$timeout, options=".var_export($options, true),
280
+ self::DEBUG_CONNECTION
281
+ );
282
+ $errno = 0;
283
+ $errstr = '';
284
+ if ($streamok) {
285
+ $socket_context = stream_context_create($options);
286
+ set_error_handler(array($this, 'errorHandler'));
287
+ $this->smtp_conn = stream_socket_client(
288
+ $host . ":" . $port,
289
+ $errno,
290
+ $errstr,
291
+ $timeout,
292
+ STREAM_CLIENT_CONNECT,
293
+ $socket_context
294
+ );
295
+ restore_error_handler();
296
+ } else {
297
+ //Fall back to fsockopen which should work in more places, but is missing some features
298
+ $this->edebug(
299
+ "Connection: stream_socket_client not available, falling back to fsockopen",
300
+ self::DEBUG_CONNECTION
301
+ );
302
+ set_error_handler(array($this, 'errorHandler'));
303
+ $this->smtp_conn = fsockopen(
304
+ $host,
305
+ $port,
306
+ $errno,
307
+ $errstr,
308
+ $timeout
309
+ );
310
+ restore_error_handler();
311
+ }
312
+ // Verify we connected properly
313
+ if (!is_resource($this->smtp_conn)) {
314
+ $this->setError(
315
+ 'Failed to connect to server',
316
+ $errno,
317
+ $errstr
318
+ );
319
+ $this->edebug(
320
+ 'SMTP ERROR: ' . $this->error['error']
321
+ . ": $errstr ($errno)",
322
+ self::DEBUG_CLIENT
323
+ );
324
+ return false;
325
+ }
326
+ $this->edebug('Connection: opened', self::DEBUG_CONNECTION);
327
+ // SMTP server can take longer to respond, give longer timeout for first read
328
+ // Windows does not have support for this timeout function
329
+ if (substr(PHP_OS, 0, 3) != 'WIN') {
330
+ $max = ini_get('max_execution_time');
331
+ // Don't bother if unlimited
332
+ if ($max != 0 && $timeout > $max) {
333
+ @set_time_limit($timeout);
334
+ }
335
+ stream_set_timeout($this->smtp_conn, $timeout, 0);
336
+ }
337
+ // Get any announcement
338
+ $announce = $this->get_lines();
339
+ $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
340
+ return true;
341
+ }
342
+
343
+ /**
344
+ * Initiate a TLS (encrypted) session.
345
+ * @access public
346
+ * @return boolean
347
+ */
348
+ public function startTLS()
349
+ {
350
+ if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
351
+ return false;
352
+ }
353
+
354
+ //Allow the best TLS version(s) we can
355
+ $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;
356
+
357
+ //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT
358
+ //so add them back in manually if we can
359
+ if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
360
+ $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
361
+ $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
362
+ }
363
+
364
+ // Begin encrypted connection
365
+ if (!stream_socket_enable_crypto(
366
+ $this->smtp_conn,
367
+ true,
368
+ $crypto_method
369
+ )) {
370
+ return false;
371
+ }
372
+ return true;
373
+ }
374
+
375
+ /**
376
+ * Perform SMTP authentication.
377
+ * Must be run after hello().
378
+ * @see hello()
379
+ * @param string $username The user name
380
+ * @param string $password The password
381
+ * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5, XOAUTH2)
382
+ * @param string $realm The auth realm for NTLM
383
+ * @param string $workstation The auth workstation for NTLM
384
+ * @param null|OAuth $OAuth An optional OAuth instance (@see PHPMailerOAuth)
385
+ * @return bool True if successfully authenticated.* @access public
386
+ */
387
+ public function authenticate(
388
+ $username,
389
+ $password,
390
+ $authtype = null,
391
+ $realm = '',
392
+ $workstation = '',
393
+ $OAuth = null
394
+ ) {
395
+ if (!$this->server_caps) {
396
+ $this->setError('Authentication is not allowed before HELO/EHLO');
397
+ return false;
398
+ }
399
+
400
+ if (array_key_exists('EHLO', $this->server_caps)) {
401
+ // SMTP extensions are available. Let's try to find a proper authentication method
402
+
403
+ if (!array_key_exists('AUTH', $this->server_caps)) {
404
+ $this->setError('Authentication is not allowed at this stage');
405
+ // 'at this stage' means that auth may be allowed after the stage changes
406
+ // e.g. after STARTTLS
407
+ return false;
408
+ }
409
+
410
+ self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
411
+ self::edebug(
412
+ 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
413
+ self::DEBUG_LOWLEVEL
414
+ );
415
+
416
+ if (empty($authtype)) {
417
+ foreach (array('CRAM-MD5', 'LOGIN', 'PLAIN', 'NTLM', 'XOAUTH2') as $method) {
418
+ if (in_array($method, $this->server_caps['AUTH'])) {
419
+ $authtype = $method;
420
+ break;
421
+ }
422
+ }
423
+ if (empty($authtype)) {
424
+ $this->setError('No supported authentication methods found');
425
+ return false;
426
+ }
427
+ self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL);
428
+ }
429
+
430
+ if (!in_array($authtype, $this->server_caps['AUTH'])) {
431
+ $this->setError("The requested authentication method \"$authtype\" is not supported by the server");
432
+ return false;
433
+ }
434
+ } elseif (empty($authtype)) {
435
+ $authtype = 'LOGIN';
436
+ }
437
+ switch ($authtype) {
438
+ case 'PLAIN':
439
+ // Start authentication
440
+ if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
441
+ return false;
442
+ }
443
+ // Send encoded username and password
444
+ if (!$this->sendCommand(
445
+ 'User & Password',
446
+ base64_encode("\0" . $username . "\0" . $password),
447
+ 235
448
+ )
449
+ ) {
450
+ return false;
451
+ }
452
+ break;
453
+ case 'LOGIN':
454
+ // Start authentication
455
+ if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
456
+ return false;
457
+ }
458
+ if (!$this->sendCommand("Username", base64_encode($username), 334)) {
459
+ return false;
460
+ }
461
+ if (!$this->sendCommand("Password", base64_encode($password), 235)) {
462
+ return false;
463
+ }
464
+ break;
465
+ case 'XOAUTH2':
466
+ //If the OAuth Instance is not set. Can be a case when PHPMailer is used
467
+ //instead of PHPMailerOAuth
468
+ if (is_null($OAuth)) {
469
+ return false;
470
+ }
471
+ $oauth = $OAuth->getOauth64();
472
+
473
+ // Start authentication
474
+ if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth, 235)) {
475
+ return false;
476
+ }
477
+ break;
478
+ case 'NTLM':
479
+ /*
480
+ * ntlm_sasl_client.php
481
+ * Bundled with Permission
482
+ *
483
+ * How to telnet in windows:
484
+ * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx
485
+ * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication
486
+ */
487
+ require_once 'extras/ntlm_sasl_client.php';
488
+ $temp = new stdClass;
489
+ $ntlm_client = new ntlm_sasl_client_class;
490
+ //Check that functions are available
491
+ if (!$ntlm_client->initialize($temp)) {
492
+ $this->setError($temp->error);
493
+ $this->edebug(
494
+ 'You need to enable some modules in your php.ini file: '
495
+ . $this->error['error'],
496
+ self::DEBUG_CLIENT
497
+ );
498
+ return false;
499
+ }
500
+ //msg1
501
+ $msg1 = $ntlm_client->typeMsg1($realm, $workstation); //msg1
502
+
503
+ if (!$this->sendCommand(
504
+ 'AUTH NTLM',
505
+ 'AUTH NTLM ' . base64_encode($msg1),
506
+ 334
507
+ )
508
+ ) {
509
+ return false;
510
+ }
511
+ //Though 0 based, there is a white space after the 3 digit number
512
+ //msg2
513
+ $challenge = substr($this->last_reply, 3);
514
+ $challenge = base64_decode($challenge);
515
+ $ntlm_res = $ntlm_client->NTLMResponse(
516
+ substr($challenge, 24, 8),
517
+ $password
518
+ );
519
+ //msg3
520
+ $msg3 = $ntlm_client->typeMsg3(
521
+ $ntlm_res,
522
+ $username,
523
+ $realm,
524
+ $workstation
525
+ );
526
+ // send encoded username
527
+ return $this->sendCommand('Username', base64_encode($msg3), 235);
528
+ case 'CRAM-MD5':
529
+ // Start authentication
530
+ if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
531
+ return false;
532
+ }
533
+ // Get the challenge
534
+ $challenge = base64_decode(substr($this->last_reply, 4));
535
+
536
+ // Build the response
537
+ $response = $username . ' ' . $this->hmac($challenge, $password);
538
+
539
+ // send encoded credentials
540
+ return $this->sendCommand('Username', base64_encode($response), 235);
541
+ default:
542
+ $this->setError("Authentication method \"$authtype\" is not supported");
543
+ return false;
544
+ }
545
+ return true;
546
+ }
547
+
548
+ /**
549
+ * Calculate an MD5 HMAC hash.
550
+ * Works like hash_hmac('md5', $data, $key)
551
+ * in case that function is not available
552
+ * @param string $data The data to hash
553
+ * @param string $key The key to hash with
554
+ * @access protected
555
+ * @return string
556
+ */
557
+ protected function hmac($data, $key)
558
+ {
559
+ if (function_exists('hash_hmac')) {
560
+ return hash_hmac('md5', $data, $key);
561
+ }
562
+
563
+ // The following borrowed from
564
+ // http://php.net/manual/en/function.mhash.php#27225
565
+
566
+ // RFC 2104 HMAC implementation for php.
567
+ // Creates an md5 HMAC.
568
+ // Eliminates the need to install mhash to compute a HMAC
569
+ // by Lance Rushing
570
+
571
+ $bytelen = 64; // byte length for md5
572
+ if (strlen($key) > $bytelen) {
573
+ $key = pack('H*', md5($key));
574
+ }
575
+ $key = str_pad($key, $bytelen, chr(0x00));
576
+ $ipad = str_pad('', $bytelen, chr(0x36));
577
+ $opad = str_pad('', $bytelen, chr(0x5c));
578
+ $k_ipad = $key ^ $ipad;
579
+ $k_opad = $key ^ $opad;
580
+
581
+ return md5($k_opad . pack('H*', md5($k_ipad . $data)));
582
+ }
583
+
584
+ /**
585
+ * Check connection state.
586
+ * @access public
587
+ * @return boolean True if connected.
588
+ */
589
+ public function connected()
590
+ {
591
+ if (is_resource($this->smtp_conn)) {
592
+ $sock_status = stream_get_meta_data($this->smtp_conn);
593
+ if ($sock_status['eof']) {
594
+ // The socket is valid but we are not connected
595
+ $this->edebug(
596
+ 'SMTP NOTICE: EOF caught while checking if connected',
597
+ self::DEBUG_CLIENT
598
+ );
599
+ $this->close();
600
+ return false;
601
+ }
602
+ return true; // everything looks good
603
+ }
604
+ return false;
605
+ }
606
+
607
+ /**
608
+ * Close the socket and clean up the state of the class.
609
+ * Don't use this function without first trying to use QUIT.
610
+ * @see quit()
611
+ * @access public
612
+ * @return void
613
+ */
614
+ public function close()
615
+ {
616
+ $this->setError('');
617
+ $this->server_caps = null;
618
+ $this->helo_rply = null;
619
+ if (is_resource($this->smtp_conn)) {
620
+ // close the connection and cleanup
621
+ fclose($this->smtp_conn);
622
+ $this->smtp_conn = null; //Makes for cleaner serialization
623
+ $this->edebug('Connection: closed', self::DEBUG_CONNECTION);
624
+ }
625
+ }
626
+
627
+ /**
628
+ * Send an SMTP DATA command.
629
+ * Issues a data command and sends the msg_data to the server,
630
+ * finializing the mail transaction. $msg_data is the message
631
+ * that is to be send with the headers. Each header needs to be
632
+ * on a single line followed by a <CRLF> with the message headers
633
+ * and the message body being separated by and additional <CRLF>.
634
+ * Implements rfc 821: DATA <CRLF>
635
+ * @param string $msg_data Message data to send
636
+ * @access public
637
+ * @return boolean
638
+ */
639
+ public function data($msg_data)
640
+ {
641
+ //This will use the standard timelimit
642
+ if (!$this->sendCommand('DATA', 'DATA', 354)) {
643
+ return false;
644
+ }
645
+
646
+ /* The server is ready to accept data!
647
+ * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)
648
+ * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into
649
+ * smaller lines to fit within the limit.
650
+ * We will also look for lines that start with a '.' and prepend an additional '.'.
651
+ * NOTE: this does not count towards line-length limit.
652
+ */
653
+
654
+ // Normalize line breaks before exploding
655
+ $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data));
656
+
657
+ /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
658
+ * of the first line (':' separated) does not contain a space then it _should_ be a header and we will
659
+ * process all lines before a blank line as headers.
660
+ */
661
+
662
+ $field = substr($lines[0], 0, strpos($lines[0], ':'));
663
+ $in_headers = false;
664
+ if (!empty($field) && strpos($field, ' ') === false) {
665
+ $in_headers = true;
666
+ }
667
+
668
+ foreach ($lines as $line) {
669
+ $lines_out = array();
670
+ if ($in_headers and $line == '') {
671
+ $in_headers = false;
672
+ }
673
+ //Break this line up into several smaller lines if it's too long
674
+ //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len),
675
+ while (isset($line[self::MAX_LINE_LENGTH])) {
676
+ //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on
677
+ //so as to avoid breaking in the middle of a word
678
+ $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');
679
+ //Deliberately matches both false and 0
680
+ if (!$pos) {
681
+ //No nice break found, add a hard break
682
+ $pos = self::MAX_LINE_LENGTH - 1;
683
+ $lines_out[] = substr($line, 0, $pos);
684
+ $line = substr($line, $pos);
685
+ } else {
686
+ //Break at the found point
687
+ $lines_out[] = substr($line, 0, $pos);
688
+ //Move along by the amount we dealt with
689
+ $line = substr($line, $pos + 1);
690
+ }
691
+ //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1
692
+ if ($in_headers) {
693
+ $line = "\t" . $line;
694
+ }
695
+ }
696
+ $lines_out[] = $line;
697
+
698
+ //Send the lines to the server
699
+ foreach ($lines_out as $line_out) {
700
+ //RFC2821 section 4.5.2
701
+ if (!empty($line_out) and $line_out[0] == '.') {
702
+ $line_out = '.' . $line_out;
703
+ }
704
+ $this->client_send($line_out . self::CRLF);
705
+ }
706
+ }
707
+
708
+ //Message data has been sent, complete the command
709
+ //Increase timelimit for end of DATA command
710
+ $savetimelimit = $this->Timelimit;
711
+ $this->Timelimit = $this->Timelimit * 2;
712
+ $result = $this->sendCommand('DATA END', '.', 250);
713
+ //Restore timelimit
714
+ $this->Timelimit = $savetimelimit;
715
+ return $result;
716
+ }
717
+
718
+ /**
719
+ * Send an SMTP HELO or EHLO command.
720
+ * Used to identify the sending server to the receiving server.
721
+ * This makes sure that client and server are in a known state.
722
+ * Implements RFC 821: HELO <SP> <domain> <CRLF>
723
+ * and RFC 2821 EHLO.
724
+ * @param string $host The host name or IP to connect to
725
+ * @access public
726
+ * @return boolean
727
+ */
728
+ public function hello($host = '')
729
+ {
730
+ //Try extended hello first (RFC 2821)
731
+ return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));
732
+ }
733
+
734
+ /**
735
+ * Send an SMTP HELO or EHLO command.
736
+ * Low-level implementation used by hello()
737
+ * @see hello()
738
+ * @param string $hello The HELO string
739
+ * @param string $host The hostname to say we are
740
+ * @access protected
741
+ * @return boolean
742
+ */
743
+ protected function sendHello($hello, $host)
744
+ {
745
+ $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);
746
+ $this->helo_rply = $this->last_reply;
747
+ if ($noerror) {
748
+ $this->parseHelloFields($hello);
749
+ } else {
750
+ $this->server_caps = null;
751
+ }
752
+ return $noerror;
753
+ }
754
+
755
+ /**
756
+ * Parse a reply to HELO/EHLO command to discover server extensions.
757
+ * In case of HELO, the only parameter that can be discovered is a server name.
758
+ * @access protected
759
+ * @param string $type - 'HELO' or 'EHLO'
760
+ */
761
+ protected function parseHelloFields($type)
762
+ {
763
+ $this->server_caps = array();
764
+ $lines = explode("\n", $this->helo_rply);
765
+
766
+ foreach ($lines as $n => $s) {
767
+ //First 4 chars contain response code followed by - or space
768
+ $s = trim(substr($s, 4));
769
+ if (empty($s)) {
770
+ continue;
771
+ }
772
+ $fields = explode(' ', $s);
773
+ if (!empty($fields)) {
774
+ if (!$n) {
775
+ $name = $type;
776
+ $fields = $fields[0];
777
+ } else {
778
+ $name = array_shift($fields);
779
+ switch ($name) {
780
+ case 'SIZE':
781
+ $fields = ($fields ? $fields[0] : 0);
782
+ break;
783
+ case 'AUTH':
784
+ if (!is_array($fields)) {
785
+ $fields = array();
786
+ }
787
+ break;
788
+ default:
789
+ $fields = true;
790
+ }
791
+ }
792
+ $this->server_caps[$name] = $fields;
793
+ }
794
+ }
795
+ }
796
+
797
+ /**
798
+ * Send an SMTP MAIL command.
799
+ * Starts a mail transaction from the email address specified in
800
+ * $from. Returns true if successful or false otherwise. If True
801
+ * the mail transaction is started and then one or more recipient
802
+ * commands may be called followed by a data command.
803
+ * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
804
+ * @param string $from Source address of this message
805
+ * @access public
806
+ * @return boolean
807
+ */
808
+ public function mail($from)
809
+ {
810
+ $useVerp = ($this->do_verp ? ' XVERP' : '');
811
+ return $this->sendCommand(
812
+ 'MAIL FROM',
813
+ 'MAIL FROM:<' . $from . '>' . $useVerp,
814
+ 250
815
+ );
816
+ }
817
+
818
+ /**
819
+ * Send an SMTP QUIT command.
820
+ * Closes the socket if there is no error or the $close_on_error argument is true.
821
+ * Implements from rfc 821: QUIT <CRLF>
822
+ * @param boolean $close_on_error Should the connection close if an error occurs?
823
+ * @access public
824
+ * @return boolean
825
+ */
826
+ public function quit($close_on_error = true)
827
+ {
828
+ $noerror = $this->sendCommand('QUIT', 'QUIT', 221);
829
+ $err = $this->error; //Save any error
830
+ if ($noerror or $close_on_error) {
831
+ $this->close();
832
+ $this->error = $err; //Restore any error from the quit command
833
+ }
834
+ return $noerror;
835
+ }
836
+
837
+ /**
838
+ * Send an SMTP RCPT command.
839
+ * Sets the TO argument to $toaddr.
840
+ * Returns true if the recipient was accepted false if it was rejected.
841
+ * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
842
+ * @param string $address The address the message is being sent to
843
+ * @access public
844
+ * @return boolean
845
+ */
846
+ public function recipient($address)
847
+ {
848
+ return $this->sendCommand(
849
+ 'RCPT TO',
850
+ 'RCPT TO:<' . $address . '>',
851
+ array(250, 251)
852
+ );
853
+ }
854
+
855
+ /**
856
+ * Send an SMTP RSET command.
857
+ * Abort any transaction that is currently in progress.
858
+ * Implements rfc 821: RSET <CRLF>
859
+ * @access public
860
+ * @return boolean True on success.
861
+ */
862
+ public function reset()
863
+ {
864
+ return $this->sendCommand('RSET', 'RSET', 250);
865
+ }
866
+
867
+ /**
868
+ * Send a command to an SMTP server and check its return code.
869
+ * @param string $command The command name - not sent to the server
870
+ * @param string $commandstring The actual command to send
871
+ * @param integer|array $expect One or more expected integer success codes
872
+ * @access protected
873
+ * @return boolean True on success.
874
+ */
875
+ protected function sendCommand($command, $commandstring, $expect)
876
+ {
877
+ if (!$this->connected()) {
878
+ $this->setError("Called $command without being connected");
879
+ return false;
880
+ }
881
+ //Reject line breaks in all commands
882
+ if (strpos($commandstring, "\n") !== false or strpos($commandstring, "\r") !== false) {
883
+ $this->setError("Command '$command' contained line breaks");
884
+ return false;
885
+ }
886
+ $this->client_send($commandstring . self::CRLF);
887
+
888
+ $this->last_reply = $this->get_lines();
889
+ // Fetch SMTP code and possible error code explanation
890
+ $matches = array();
891
+ if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) {
892
+ $code = $matches[1];
893
+ $code_ex = (count($matches) > 2 ? $matches[2] : null);
894
+ // Cut off error code from each response line
895
+ $detail = preg_replace(
896
+ "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m",
897
+ '',
898
+ $this->last_reply
899
+ );
900
+ } else {
901
+ // Fall back to simple parsing if regex fails
902
+ $code = substr($this->last_reply, 0, 3);
903
+ $code_ex = null;
904
+ $detail = substr($this->last_reply, 4);
905
+ }
906
+
907
+ $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
908
+
909
+ if (!in_array($code, (array)$expect)) {
910
+ $this->setError(
911
+ "$command command failed",
912
+ $detail,
913
+ $code,
914
+ $code_ex
915
+ );
916
+ $this->edebug(
917
+ 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,
918
+ self::DEBUG_CLIENT
919
+ );
920
+ return false;
921
+ }
922
+
923
+ $this->setError('');
924
+ return true;
925
+ }
926
+
927
+ /**
928
+ * Send an SMTP SAML command.
929
+ * Starts a mail transaction from the email address specified in $from.
930
+ * Returns true if successful or false otherwise. If True
931
+ * the mail transaction is started and then one or more recipient
932
+ * commands may be called followed by a data command. This command
933
+ * will send the message to the users terminal if they are logged
934
+ * in and send them an email.
935
+ * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
936
+ * @param string $from The address the message is from
937
+ * @access public
938
+ * @return boolean
939
+ */
940
+ public function sendAndMail($from)
941
+ {
942
+ return $this->sendCommand('SAML', "SAML FROM:$from", 250);
943
+ }
944
+
945
+ /**
946
+ * Send an SMTP VRFY command.
947
+ * @param string $name The name to verify
948
+ * @access public
949
+ * @return boolean
950
+ */
951
+ public function verify($name)
952
+ {
953
+ return $this->sendCommand('VRFY', "VRFY $name", array(250, 251));
954
+ }
955
+
956
+ /**
957
+ * Send an SMTP NOOP command.
958
+ * Used to keep keep-alives alive, doesn't actually do anything
959
+ * @access public
960
+ * @return boolean
961
+ */
962
+ public function noop()
963
+ {
964
+ return $this->sendCommand('NOOP', 'NOOP', 250);
965
+ }
966
+
967
+ /**
968
+ * Send an SMTP TURN command.
969
+ * This is an optional command for SMTP that this class does not support.
970
+ * This method is here to make the RFC821 Definition complete for this class
971
+ * and _may_ be implemented in future
972
+ * Implements from rfc 821: TURN <CRLF>
973
+ * @access public
974
+ * @return boolean
975
+ */
976
+ public function turn()
977
+ {
978
+ $this->setError('The SMTP TURN command is not implemented');
979
+ $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
980
+ return false;
981
+ }
982
+
983
+ /**
984
+ * Send raw data to the server.
985
+ * @param string $data The data to send
986
+ * @access public
987
+ * @return integer|boolean The number of bytes sent to the server or false on error
988
+ */
989
+ public function client_send($data)
990
+ {
991
+ $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT);
992
+ return fwrite($this->smtp_conn, $data);
993
+ }
994
+
995
+ /**
996
+ * Get the latest error.
997
+ * @access public
998
+ * @return array
999
+ */
1000
+ public function getError()
1001
+ {
1002
+ return $this->error;
1003
+ }
1004
+
1005
+ /**
1006
+ * Get SMTP extensions available on the server
1007
+ * @access public
1008
+ * @return array|null
1009
+ */
1010
+ public function getServerExtList()
1011
+ {
1012
+ return $this->server_caps;
1013
+ }
1014
+
1015
+ /**
1016
+ * A multipurpose method
1017
+ * The method works in three ways, dependent on argument value and current state
1018
+ * 1. HELO/EHLO was not sent - returns null and set up $this->error
1019
+ * 2. HELO was sent
1020
+ * $name = 'HELO': returns server name
1021
+ * $name = 'EHLO': returns boolean false
1022
+ * $name = any string: returns null and set up $this->error
1023
+ * 3. EHLO was sent
1024
+ * $name = 'HELO'|'EHLO': returns server name
1025
+ * $name = any string: if extension $name exists, returns boolean True
1026
+ * or its options. Otherwise returns boolean False
1027
+ * In other words, one can use this method to detect 3 conditions:
1028
+ * - null returned: handshake was not or we don't know about ext (refer to $this->error)
1029
+ * - false returned: the requested feature exactly not exists
1030
+ * - positive value returned: the requested feature exists
1031
+ * @param string $name Name of SMTP extension or 'HELO'|'EHLO'
1032
+ * @return mixed
1033
+ */
1034
+ public function getServerExt($name)
1035
+ {
1036
+ if (!$this->server_caps) {
1037
+ $this->setError('No HELO/EHLO was sent');
1038
+ return null;
1039
+ }
1040
+
1041
+ // the tight logic knot ;)
1042
+ if (!array_key_exists($name, $this->server_caps)) {
1043
+ if ($name == 'HELO') {
1044
+ return $this->server_caps['EHLO'];
1045
+ }
1046
+ if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
1047
+ return false;
1048
+ }
1049
+ $this->setError('HELO handshake was used. Client knows nothing about server extensions');
1050
+ return null;
1051
+ }
1052
+
1053
+ return $this->server_caps[$name];
1054
+ }
1055
+
1056
+ /**
1057
+ * Get the last reply from the server.
1058
+ * @access public
1059
+ * @return string
1060
+ */
1061
+ public function getLastReply()
1062
+ {
1063
+ return $this->last_reply;
1064
+ }
1065
+
1066
+ /**
1067
+ * Read the SMTP server's response.
1068
+ * Either before eof or socket timeout occurs on the operation.
1069
+ * With SMTP we can tell if we have more lines to read if the
1070
+ * 4th character is '-' symbol. If it is a space then we don't
1071
+ * need to read anything else.
1072
+ * @access protected
1073
+ * @return string
1074
+ */
1075
+ protected function get_lines()
1076
+ {
1077
+ // If the connection is bad, give up straight away
1078
+ if (!is_resource($this->smtp_conn)) {
1079
+ return '';
1080
+ }
1081
+ $data = '';
1082
+ $endtime = 0;
1083
+ stream_set_timeout($this->smtp_conn, $this->Timeout);
1084
+ if ($this->Timelimit > 0) {
1085
+ $endtime = time() + $this->Timelimit;
1086
+ }
1087
+ while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
1088
+ $str = @fgets($this->smtp_conn, 515);
1089
+ $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
1090
+ $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL);
1091
+ $data .= $str;
1092
+ // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen
1093
+ if ((isset($str[3]) and $str[3] == ' ')) {
1094
+ break;
1095
+ }
1096
+ // Timed-out? Log and break
1097
+ $info = stream_get_meta_data($this->smtp_conn);
1098
+ if ($info['timed_out']) {
1099
+ $this->edebug(
1100
+ 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
1101
+ self::DEBUG_LOWLEVEL
1102
+ );
1103
+ break;
1104
+ }
1105
+ // Now check if reads took too long
1106
+ if ($endtime and time() > $endtime) {
1107
+ $this->edebug(
1108
+ 'SMTP -> get_lines(): timelimit reached ('.
1109
+ $this->Timelimit . ' sec)',
1110
+ self::DEBUG_LOWLEVEL
1111
+ );
1112
+ break;
1113
+ }
1114
+ }
1115
+ return $data;
1116
+ }
1117
+
1118
+ /**
1119
+ * Enable or disable VERP address generation.
1120
+ * @param boolean $enabled
1121
+ */
1122
+ public function setVerp($enabled = false)
1123
+ {
1124
+ $this->do_verp = $enabled;
1125
+ }
1126
+
1127
+ /**
1128
+ * Get VERP address generation mode.
1129
+ * @return boolean
1130
+ */
1131
+ public function getVerp()
1132
+ {
1133
+ return $this->do_verp;
1134
+ }
1135
+
1136
+ /**
1137
+ * Set error messages and codes.
1138
+ * @param string $message The error message
1139
+ * @param string $detail Further detail on the error
1140
+ * @param string $smtp_code An associated SMTP error code
1141
+ * @param string $smtp_code_ex Extended SMTP code
1142
+ */
1143
+ protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '')
1144
+ {
1145
+ $this->error = array(
1146
+ 'error' => $message,
1147
+ 'detail' => $detail,
1148
+ 'smtp_code' => $smtp_code,
1149
+ 'smtp_code_ex' => $smtp_code_ex
1150
+ );
1151
+ }
1152
+
1153
+ /**
1154
+ * Set debug output method.
1155
+ * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.
1156
+ */
1157
+ public function setDebugOutput($method = 'echo')
1158
+ {
1159
+ $this->Debugoutput = $method;
1160
+ }
1161
+
1162
+ /**
1163
+ * Get debug output method.
1164
+ * @return string
1165
+ */
1166
+ public function getDebugOutput()
1167
+ {
1168
+ return $this->Debugoutput;
1169
+ }
1170
+
1171
+ /**
1172
+ * Set debug output level.
1173
+ * @param integer $level
1174
+ */
1175
+ public function setDebugLevel($level = 0)
1176
+ {
1177
+ $this->do_debug = $level;
1178
+ }
1179
+
1180
+ /**
1181
+ * Get debug output level.
1182
+ * @return integer
1183
+ */
1184
+ public function getDebugLevel()
1185
+ {
1186
+ return $this->do_debug;
1187
+ }
1188
+
1189
+ /**
1190
+ * Set SMTP timeout.
1191
+ * @param integer $timeout
1192
+ */
1193
+ public function setTimeout($timeout = 0)
1194
+ {
1195
+ $this->Timeout = $timeout;
1196
+ }
1197
+
1198
+ /**
1199
+ * Get SMTP timeout.
1200
+ * @return integer
1201
+ */
1202
+ public function getTimeout()
1203
+ {
1204
+ return $this->Timeout;
1205
+ }
1206
+
1207
+ /**
1208
+ * Reports an error number and string.
1209
+ * @param integer $errno The error number returned by PHP.
1210
+ * @param string $errmsg The error message returned by PHP.
1211
+ */
1212
+ protected function errorHandler($errno, $errmsg)
1213
+ {
1214
+ $notice = 'Connection: Failed to connect to server.';
1215
+ $this->setError(
1216
+ $notice,
1217
+ $errno,
1218
+ $errmsg
1219
+ );
1220
+ $this->edebug(
1221
+ $notice . ' Error number ' . $errno . '. "Error notice: ' . $errmsg,
1222
+ self::DEBUG_CONNECTION
1223
+ );
1224
+ }
1225
+
1226
+ /**
1227
+ * Will return the ID of the last smtp transaction based on a list of patterns provided
1228
+ * in SMTP::$smtp_transaction_id_patterns.
1229
+ * If no reply has been received yet, it will return null.
1230
+ * If no pattern has been matched, it will return false.
1231
+ * @return bool|null|string
1232
+ */
1233
+ public function getLastTransactionID()
1234
+ {
1235
+ $reply = $this->getLastReply();
1236
+
1237
+ if (empty($reply)) {
1238
+ return null;
1239
+ }
1240
+
1241
+ foreach($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) {
1242
+ if(preg_match($smtp_transaction_id_pattern, $reply, $matches)) {
1243
+ return $matches[1];
1244
+ }
1245
+ }
1246
+
1247
+ return false;
1248
+ }
1249
+ }
modules/mail/engines/get_oauth_token.php CHANGED
@@ -1,162 +1,162 @@
1
- <?php
2
- /**
3
- * Get an OAuth2 token from Google.
4
- * * Install this script on your server so that it's accessible
5
- * as [https/http]://<yourdomain>/<folder>/get_oauth_token.php
6
- * e.g.: http://localhost/phpmail/get_oauth_token.php
7
- * * Ensure dependencies are installed with 'composer install'
8
- * * Set up an app in your Google developer console
9
- * * Set the script address as the app's redirect URL
10
- * If no refresh token is obtained when running this file, revoke access to your app
11
- * using link: https://accounts.google.com/b/0/IssuedAuthSubTokens and run the script again.
12
- * This script requires PHP 5.4 or later
13
- * PHP Version 5.4
14
- */
15
-
16
- namespace League\OAuth2\Client\Provider;
17
-
18
- require 'vendor/autoload.php';
19
-
20
- use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
21
- use League\OAuth2\Client\Token\AccessToken;
22
- use League\OAuth2\Client\Tool\BearerAuthorizationTrait;
23
- use Psr\Http\Message\ResponseInterface;
24
-
25
- session_start();
26
-
27
- //If this automatic URL doesn't work, set it yourself manually
28
- $redirectUri = isset($_SERVER['HTTPS']) ? 'https://' : 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
29
- //$redirectUri = 'http://localhost/phpmailer/get_oauth_token.php';
30
-
31
- //These details obtained are by setting up app in Google developer console.
32
- $clientId = 'RANDOMCHARS-----duv1n2.apps.googleusercontent.com';
33
- $clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';
34
-
35
- class Google extends AbstractProvider
36
- {
37
- use BearerAuthorizationTrait;
38
-
39
- const ACCESS_TOKEN_RESOURCE_OWNER_ID = 'id';
40
-
41
- /**
42
- * @var string If set, this will be sent to google as the "access_type" parameter.
43
- * @link https://developers.google.com/accounts/docs/OAuth2WebServer#offline
44
- */
45
- protected $accessType;
46
-
47
- /**
48
- * @var string If set, this will be sent to google as the "hd" parameter.
49
- * @link https://developers.google.com/accounts/docs/OAuth2Login#hd-param
50
- */
51
- protected $hostedDomain;
52
-
53
- /**
54
- * @var string If set, this will be sent to google as the "scope" parameter.
55
- * @link https://developers.google.com/gmail/api/auth/scopes
56
- */
57
- protected $scope;
58
-
59
- public function getBaseAuthorizationUrl()
60
- {
61
- return 'https://accounts.google.com/o/oauth2/auth';
62
- }
63
-
64
- public function getBaseAccessTokenUrl(array $params)
65
- {
66
- return 'https://accounts.google.com/o/oauth2/token';
67
- }
68
-
69
- public function getResourceOwnerDetailsUrl(AccessToken $token)
70
- {
71
- return ' ';
72
- }
73
-
74
- protected function getAuthorizationParameters(array $options)
75
- {
76
- if (is_array($this->scope)) {
77
- $separator = $this->getScopeSeparator();
78
- $this->scope = implode($separator, $this->scope);
79
- }
80
-
81
- $params = array_merge(
82
- parent::getAuthorizationParameters($options),
83
- array_filter([
84
- 'hd' => $this->hostedDomain,
85
- 'access_type' => $this->accessType,
86
- 'scope' => $this->scope,
87
- // if the user is logged in with more than one account ask which one to use for the login!
88
- 'authuser' => '-1'
89
- ])
90
- );
91
- return $params;
92
- }
93
-
94
- protected function getDefaultScopes()
95
- {
96
- return [
97
- 'email',
98
- 'openid',
99
- 'profile',
100
- ];
101
- }
102
-
103
- protected function getScopeSeparator()
104
- {
105
- return ' ';
106
- }
107
-
108
- protected function checkResponse(ResponseInterface $response, $data)
109
- {
110
- if (!empty($data['error'])) {
111
- $code = 0;
112
- $error = $data['error'];
113
-
114
- if (is_array($error)) {
115
- $code = $error['code'];
116
- $error = $error['message'];
117
- }
118
-
119
- throw new IdentityProviderException($error, $code, $data);
120
- }
121
- }
122
-
123
- protected function createResourceOwner(array $response, AccessToken $token)
124
- {
125
- return new GoogleUser($response);
126
- }
127
- }
128
-
129
-
130
- //Set Redirect URI in Developer Console as [https/http]://<yourdomain>/<folder>/get_oauth_token.php
131
- $provider = new Google(
132
- array(
133
- 'clientId' => $clientId,
134
- 'clientSecret' => $clientSecret,
135
- 'redirectUri' => $redirectUri,
136
- 'scope' => array('https://mail.google.com/'),
137
- 'accessType' => 'offline'
138
- )
139
- );
140
-
141
- if (!isset($_GET['code'])) {
142
- // If we don't have an authorization code then get one
143
- $authUrl = $provider->getAuthorizationUrl();
144
- $_SESSION['oauth2state'] = $provider->getState();
145
- header('Location: ' . $authUrl);
146
- exit;
147
- // Check given state against previously stored one to mitigate CSRF attack
148
- } elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
149
- unset($_SESSION['oauth2state']);
150
- exit('Invalid state');
151
- } else {
152
- // Try to get an access token (using the authorization code grant)
153
- $token = $provider->getAccessToken(
154
- 'authorization_code',
155
- array(
156
- 'code' => $_GET['code']
157
- )
158
- );
159
-
160
- // Use this to get a new access token if the old one expires
161
- echo 'Refresh Token: ' . $token->getRefreshToken();
162
- }
1
+ <?php
2
+ /**
3
+ * Get an OAuth2 token from Google.
4
+ * * Install this script on your server so that it's accessible
5
+ * as [https/http]://<yourdomain>/<folder>/get_oauth_token.php
6
+ * e.g.: http://localhost/phpmail/get_oauth_token.php
7
+ * * Ensure dependencies are installed with 'composer install'
8
+ * * Set up an app in your Google developer console
9
+ * * Set the script address as the app's redirect URL
10
+ * If no refresh token is obtained when running this file, revoke access to your app
11
+ * using link: https://accounts.google.com/b/0/IssuedAuthSubTokens and run the script again.
12
+ * This script requires PHP 5.4 or later
13
+ * PHP Version 5.4
14
+ */
15
+
16
+ namespace League\OAuth2\Client\Provider;
17
+
18
+ require 'vendor/autoload.php';
19
+
20
+ use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
21
+ use League\OAuth2\Client\Token\AccessToken;
22
+ use League\OAuth2\Client\Tool\BearerAuthorizationTrait;
23
+ use Psr\Http\Message\ResponseInterface;
24
+
25
+ session_start();
26
+
27
+ //If this automatic URL doesn't work, set it yourself manually
28
+ $redirectUri = isset($_SERVER['HTTPS']) ? 'https://' : 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
29
+ //$redirectUri = 'http://localhost/phpmailer/get_oauth_token.php';
30
+
31
+ //These details obtained are by setting up app in Google developer console.
32
+ $clientId = 'RANDOMCHARS-----duv1n2.apps.googleusercontent.com';
33
+ $clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';
34
+
35
+ class Google extends AbstractProvider
36
+ {
37
+ use BearerAuthorizationTrait;
38
+
39
+ const ACCESS_TOKEN_RESOURCE_OWNER_ID = 'id';
40
+
41
+ /**
42
+ * @var string If set, this will be sent to google as the "access_type" parameter.
43
+ * @link https://developers.google.com/accounts/docs/OAuth2WebServer#offline
44
+ */
45
+ protected $accessType;
46
+
47
+ /**
48
+ * @var string If set, this will be sent to google as the "hd" parameter.
49
+ * @link https://developers.google.com/accounts/docs/OAuth2Login#hd-param
50
+ */
51
+ protected $hostedDomain;
52
+
53
+ /**
54
+ * @var string If set, this will be sent to google as the "scope" parameter.
55
+ * @link https://developers.google.com/gmail/api/auth/scopes
56
+ */
57
+ protected $scope;
58
+
59
+ public function getBaseAuthorizationUrl()
60
+ {
61
+ return 'https://accounts.google.com/o/oauth2/auth';
62
+ }
63
+
64
+ public function getBaseAccessTokenUrl(array $params)
65
+ {
66
+ return 'https://accounts.google.com/o/oauth2/token';
67
+ }
68
+
69
+ public function getResourceOwnerDetailsUrl(AccessToken $token)
70
+ {
71
+ return ' ';
72
+ }
73
+
74
+ protected function getAuthorizationParameters(array $options)
75
+ {
76
+ if (is_array($this->scope)) {
77
+ $separator = $this->getScopeSeparator();
78
+ $this->scope = implode($separator, $this->scope);
79
+ }
80
+
81
+ $params = array_merge(
82
+ parent::getAuthorizationParameters($options),
83
+ array_filter([
84
+ 'hd' => $this->hostedDomain,
85
+ 'access_type' => $this->accessType,
86
+ 'scope' => $this->scope,
87
+ // if the user is logged in with more than one account ask which one to use for the login!
88
+ 'authuser' => '-1'
89
+ ])
90
+ );
91
+ return $params;
92
+ }
93
+
94
+ protected function getDefaultScopes()
95
+ {
96
+ return [
97
+ 'email',
98
+ 'openid',
99
+ 'profile',
100
+ ];
101
+ }
102
+
103
+ protected function getScopeSeparator()
104
+ {
105
+ return ' ';
106
+ }
107
+
108
+ protected function checkResponse(ResponseInterface $response, $data)
109
+ {
110
+ if (!empty($data['error'])) {
111
+ $code = 0;
112
+ $error = $data['error'];
113
+
114
+ if (is_array($error)) {
115
+ $code = $error['code'];
116
+ $error = $error['message'];
117
+ }
118
+
119
+ throw new IdentityProviderException($error, $code, $data);
120
+ }
121
+ }
122
+
123
+ protected function createResourceOwner(array $response, AccessToken $token)
124
+ {
125
+ return new GoogleUser($response);
126
+ }
127
+ }
128
+
129
+
130
+ //Set Redirect URI in Developer Console as [https/http]://<yourdomain>/<folder>/get_oauth_token.php
131
+ $provider = new Google(
132
+ array(
133
+ 'clientId' => $clientId,
134
+ 'clientSecret' => $clientSecret,
135
+ 'redirectUri' => $redirectUri,
136
+ 'scope' => array('https://mail.google.com/'),
137
+ 'accessType' => 'offline'
138
+ )
139
+ );
140
+
141
+ if (!isset($_GET['code'])) {
142
+ // If we don't have an authorization code then get one
143
+ $authUrl = $provider->getAuthorizationUrl();
144
+ $_SESSION['oauth2state'] = $provider->getState();
145
+ header('Location: ' . $authUrl);
146
+ exit;
147
+ // Check given state against previously stored one to mitigate CSRF attack
148
+ } elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
149
+ unset($_SESSION['oauth2state']);
150
+ exit('Invalid state');
151
+ } else {
152
+ // Try to get an access token (using the authorization code grant)
153
+ $token = $provider->getAccessToken(
154
+ 'authorization_code',
155
+ array(
156
+ 'code' => $_GET['code']
157
+ )
158
+ );
159
+
160
+ // Use this to get a new access token if the old one expires
161
+ echo 'Refresh Token: ' . $token->getRefreshToken();
162
+ }
modules/options/mod.php CHANGED
@@ -40,7 +40,6 @@ class optionsPps extends modulePps {
40
  return $this->getView()->getAdminPage();
41
  } else {
42
  installerPps::setUsed(); // Show this welcome page - only one time
43
- framePps::_()->getModule('supsystic_promo')->getModel()->bigStatAdd('Welcome Show');
44
  return framePps::_()->getModule('supsystic_promo')->showWelcomePage();
45
  }
46
  }
40
  return $this->getView()->getAdminPage();
41
  } else {
42
  installerPps::setUsed(); // Show this welcome page - only one time
 
43
  return framePps::_()->getModule('supsystic_promo')->showWelcomePage();
44
  }
45
  }
modules/popup/js/frontend.popup.js CHANGED
@@ -17,8 +17,8 @@ jQuery(document).ready(function(){
17
  ppsBindPopupLove( ppsPopups[ i ] );
18
  ppsBindPopupLoad( ppsPopups[ i ] );
19
  ppsBindPopupShow( ppsPopups[ i ] );
20
- ppsBindPopupActions( ppsPopups[ i ] );
21
  ppsBindPopupClose( ppsPopups[ i ] );
 
22
  ppsBindPopupSubscribers( ppsPopups[ i ] );
23
  ppsBindPopupForceShow( ppsPopups[ i ] );
24
  ppsCheckPopupGetNotices( ppsPopups[ i ] );
@@ -273,6 +273,9 @@ function ppsBindPopupClose( popup ) {
273
  /* For now - only one method - click on close btn */
274
  var $shell = ppsGetPopupShell( popup );
275
  $shell.find('.ppsPopupClose').click(function(){
 
 
 
276
  ppsClosePopup( popup );
277
  return false;
278
  });
@@ -1025,24 +1028,24 @@ function ppsHideBgOverlay(popup) {
1025
  jQuery('#ppsPopupBgOverlay').hide();
1026
  }
1027
  function ppsBindPopupActions(popup) {
1028
- var $shell = ppsGetPopupShell( popup );
1029
  // TODO: make usage of ppsPopupSubscribeSuccess() function only after success subscribe process, not after subscribe action
1030
- if($shell.find('.ppsSubscribeForm_aweber').size()) {
1031
- $shell.find('.ppsSubscribeForm_aweber').submit(function(){
1032
  if(jQuery(this).find('input[name=email]').val()) {
1033
  ppsPopupSubscribeSuccess( popup );
1034
  }
1035
  });
1036
  }
1037
  // Check build-in PopUp subscribe links
1038
- if($shell.find('.ppsSmLink').size()) {
1039
- $shell.find('.ppsSmLink').click(function(){
1040
  _ppsPopupSetActionDone(popup, 'share', jQuery(this).data('type'));
1041
  });
1042
  }
1043
  // Check Social Share by Supsystic plugin links in PopUp
1044
- if($shell.find('.supsystic-social-sharing').size()) {
1045
- $shell.find('.supsystic-social-sharing a').click(function(){
1046
  var socHost = this.hostname
1047
  , socType = ''; // Social network type key
1048
  if(socHost && socHost != '') {
@@ -1064,28 +1067,9 @@ function ppsBindPopupActions(popup) {
1064
  }
1065
  });
1066
  }
1067
- if($shell.find('.fb-like-box').size()) {
1068
  _ppsBindFbLikeBtnAction(popup);
1069
  }
1070
- /*For age verification templates*/
1071
- if(popup.type == 'age_verify') {
1072
- var $verifyBtns = $shell.find('.ppsBtn');
1073
- if($verifyBtns && $verifyBtns.size()) {
1074
- $verifyBtns.click(function(){
1075
- var btnClasses = jQuery(this).attr('class').split(' ')
1076
- , btnId = 0;
1077
- if(btnClasses && btnClasses.length) {
1078
- for(var i = 0; i < btnClasses.length; i++) {
1079
- if(btnClasses[ i ].indexOf('ppsBtn_') === 0) {
1080
- btnId = parseInt( btnClasses[ i ].split('_')[1] );
1081
- break;
1082
- }
1083
- }
1084
- }
1085
- _ppsPopupSetActionDone(popup, 'age_verify', btnId);
1086
- });
1087
- }
1088
- }
1089
  }
1090
  function _ppsBindFbLikeBtnAction(popup) {
1091
  if(typeof(FB) === 'undefined') {
17
  ppsBindPopupLove( ppsPopups[ i ] );
18
  ppsBindPopupLoad( ppsPopups[ i ] );
19
  ppsBindPopupShow( ppsPopups[ i ] );
 
20
  ppsBindPopupClose( ppsPopups[ i ] );
21
+ ppsBindPopupActions( ppsPopups[ i ] );
22
  ppsBindPopupSubscribers( ppsPopups[ i ] );
23
  ppsBindPopupForceShow( ppsPopups[ i ] );
24
  ppsCheckPopupGetNotices( ppsPopups[ i ] );
273
  /* For now - only one method - click on close btn */
274
  var $shell = ppsGetPopupShell( popup );
275
  $shell.find('.ppsPopupClose').click(function(){
276
+ if(popup.type == 'age_verify') {
277
+ _ppsPopupSetActionDone(popup, 'age_verify');
278
+ }
279
  ppsClosePopup( popup );
280
  return false;
281
  });
1028
  jQuery('#ppsPopupBgOverlay').hide();
1029
  }
1030
  function ppsBindPopupActions(popup) {
1031
+ var shell = ppsGetPopupShell( popup );
1032
  // TODO: make usage of ppsPopupSubscribeSuccess() function only after success subscribe process, not after subscribe action
1033
+ if(shell.find('.ppsSubscribeForm_aweber').size()) {
1034
+ shell.find('.ppsSubscribeForm_aweber').submit(function(){
1035
  if(jQuery(this).find('input[name=email]').val()) {
1036
  ppsPopupSubscribeSuccess( popup );
1037
  }
1038
  });
1039
  }
1040
  // Check build-in PopUp subscribe links
1041
+ if(shell.find('.ppsSmLink').size()) {
1042
+ shell.find('.ppsSmLink').click(function(){
1043
  _ppsPopupSetActionDone(popup, 'share', jQuery(this).data('type'));
1044
  });
1045
  }
1046
  // Check Social Share by Supsystic plugin links in PopUp
1047
+ if(shell.find('.supsystic-social-sharing').size()) {
1048
+ shell.find('.supsystic-social-sharing a').click(function(){
1049
  var socHost = this.hostname
1050
  , socType = ''; // Social network type key
1051
  if(socHost && socHost != '') {
1067
  }
1068
  });
1069
  }
1070
+ if(shell.find('.fb-like-box').size()) {
1071
  _ppsBindFbLikeBtnAction(popup);
1072
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1073
  }
1074
  function _ppsBindFbLikeBtnAction(popup) {
1075
  if(typeof(FB) === 'undefined') {
modules/popup/models/popup.php CHANGED
@@ -143,7 +143,6 @@ class popupModelPps extends modelPps {
143
  if(!empty($d['original_id'])) {
144
  $original = $this->getById($d['original_id']);
145
  framePps::_()->getModule('supsystic_promo')->getModel()->saveUsageStat('create_from_tpl.'. strtolower(str_replace(' ', '-', $original['label'])));
146
- framePps::_()->getModule('supsystic_promo')->getModel()->bigStatAddCheck('Used Template', array('Selected Template' => $original['label']));
147
  unset($original['id']);
148
  $original['label'] = $d['label'];
149
  $original['original_id'] = $d['original_id'];
@@ -437,7 +436,6 @@ class popupModelPps extends modelPps {
437
  // Save main settings - as they should not influence for display settings
438
  $this->_assignKeyArr($currentPopup, $newTpl, 'params.main');
439
  framePps::_()->getModule('supsystic_promo')->getModel()->saveUsageStat('change_to_tpl.'. strtolower(str_replace(' ', '-', $newTpl['label'])));
440
- framePps::_()->getModule('supsystic_promo')->getModel()->bigStatAddCheck('Used Template', array('Changed to Template' => $newTpl['label']));
441
  $newTpl['original_id'] = $newTpl['id']; // It will be our new original
442
  $newTpl['id'] = $currentPopup['id'];
443
  $newTpl['label'] = $currentPopup['label'];
143
  if(!empty($d['original_id'])) {
144
  $original = $this->getById($d['original_id']);
145
  framePps::_()->getModule('supsystic_promo')->getModel()->saveUsageStat('create_from_tpl.'. strtolower(str_replace(' ', '-', $original['label'])));
 
146
  unset($original['id']);
147
  $original['label'] = $d['label'];
148
  $original['original_id'] = $d['original_id'];
436
  // Save main settings - as they should not influence for display settings
437
  $this->_assignKeyArr($currentPopup, $newTpl, 'params.main');
438
  framePps::_()->getModule('supsystic_promo')->getModel()->saveUsageStat('change_to_tpl.'. strtolower(str_replace(' ', '-', $newTpl['label'])));
 
439
  $newTpl['original_id'] = $newTpl['id']; // It will be our new original
440
  $newTpl['id'] = $currentPopup['id'];
441
  $newTpl['label'] = $currentPopup['label'];
modules/popup/views/popup.php CHANGED
@@ -306,15 +306,8 @@ class popupViewPps extends viewPps {
306
  uasort($tabs, array($this, 'sortEditPopupTabsClb'));
307
  $this->assign('tabs', $tabs);
308
  dispatcherPps::doAction('beforePopupEditRender', $popup);
309
- $this->_initBigDataStats();
310
  return parent::getContent('popupEditAdmin');
311
  }
312
- private function _initBigDataStats() {
313
- $canSend = (int) framePps::_()->getModule('options')->get('send_stats');
314
- if( $canSend ) {
315
- framePps::_()->getModule('supsystic_promo')->connectItemEditStats();
316
- }
317
- }
318
  public function showEditPopupFormControls() {
319
  parent::display('popupEditFormControls');
320
  }
306
  uasort($tabs, array($this, 'sortEditPopupTabsClb'));
307
  $this->assign('tabs', $tabs);
308
  dispatcherPps::doAction('beforePopupEditRender', $popup);
 
309
  return parent::getContent('popupEditAdmin');
310
  }
 
 
 
 
 
 
311
  public function showEditPopupFormControls() {
312
  parent::display('popupEditFormControls');
313
  }
modules/popup/views/tpl/popupEditAdmin.php CHANGED
@@ -1,6 +1,6 @@
1
  <div id="ppsPopupEditTabs">
2
  <section class="supsystic-bar supsystic-sticky sticky-padd-next sticky-save-width sticky-base-width-auto" data-prev-height="#supsystic-breadcrumbs" data-next-padding-add="15">
3
- <h3 class="nav-tab-wrapper ppsMainTabsNav" style="margin-bottom: 0px; margin-top: 12px;">
4
  <?php $i = 0;?>
5
  <?php foreach($this->tabs as $tKey => $tData) { ?>
6
  <?php
1
  <div id="ppsPopupEditTabs">
2
  <section class="supsystic-bar supsystic-sticky sticky-padd-next sticky-save-width sticky-base-width-auto" data-prev-height="#supsystic-breadcrumbs" data-next-padding-add="15">
3
+ <h3 class="nav-tab-wrapper" style="margin-bottom: 0px; margin-top: 12px;">
4
  <?php $i = 0;?>
5
  <?php foreach($this->tabs as $tKey => $tData) { ?>
6
  <?php
modules/popup/views/tpl/popupEditAdminContactFormbOpts.php CHANGED
@@ -1,34 +1,34 @@
1
- <?php if(!$this->contactFormSupported) {
2
- printf(__('To start using this feature - you need to have Contact Form by Supsystic plugin installed on your site. It\'s free! You can find it <a href="%s" target="_blank" class="button" style="margin-top: -10px;">here</a>, install and active it, then reload this page - and you will be able to select your Contact Form.', PPS_LANG_CODE), admin_url('plugin-install.php?tab=search&s=Contact+Form+by+Supsystic'));
3
- } else { ?>
4
- <div class="ppsPopupOptRow">
5
- <label>
6
- <?php echo htmlPps::checkbox('params[tpl][enb_contact_form]', array(
7
- 'checked' => htmlPps::checkedOpt($this->popup['params']['tpl'], 'enb_contact_form'),
8
- 'attrs' => 'data-switch-block="contactFormShell"',
9
- ))?>
10
- <?php _e('Enable Contact Form', PPS_LANG_CODE)?>
11
- </label>
12
- <div class="description"><?php _e('Please be advised that this feature will replace your current PopUp forms (Subscribe, Login and Registration) with Contact Form', PPS_LANG_CODE)?></div>
13
- </div>
14
- <span data-block-to-switch="contactFormShell">
15
- <table class="form-table ppsSubShellMainTbl" style="width: auto;">
16
- <tr>
17
- <th scope="row">
18
- <?php _e('Select Contact Form', PPS_LANG_CODE)?>
19
- <i class="fa fa-question supsystic-tooltip" title="<?php echo esc_html(__('Contact Form that will handle your contacts.', PPS_LANG_CODE))?>"></i>
20
- </th>
21
- <td>
22
- <?php if(empty($this->contactFormsListForSelect)) {
23
- printf(__('You have no Contact Forms for now. Create your first form <a href="%s" target="_blank" class="button">here</a>, reload this page - and you will be able to select your Contact Form.', PPS_LANG_CODE), $this->contactFormCreateUrl);
24
- } else {
25
- echo htmlPps::selectbox('params[tpl][contact_form]', array(
26
- 'options' => $this->contactFormsListForSelect,
27
- 'value' => (isset($this->popup['params']['tpl']['contact_form']) ? $this->popup['params']['tpl']['contact_form'] : '')));
28
- }?>
29
- </td>
30
- </tr>
31
-
32
- </table>
33
- </span>
34
- <?php }
1
+ <?php if(!$this->contactFormSupported) {
2
+ printf(__('To start using this feature - you need to have Contact Form by Supsystic plugin installed on your site. It\'s free! You can find it <a href="%s" target="_blank" class="button" style="margin-top: -10px;">here</a>, install and active it, then reload this page - and you will be able to select your Contact Form.', PPS_LANG_CODE), admin_url('plugin-install.php?tab=search&s=Contact+Form+by+Supsystic'));
3
+ } else { ?>
4
+ <div class="ppsPopupOptRow">
5
+ <label>
6
+ <?php echo htmlPps::checkbox('params[tpl][enb_contact_form]', array(
7
+ 'checked' => htmlPps::checkedOpt($this->popup['params']['tpl'], 'enb_contact_form'),
8
+ 'attrs' => 'data-switch-block="contactFormShell"',
9
+ ))?>
10
+ <?php _e('Enable Contact Form', PPS_LANG_CODE)?>
11
+ </label>
12
+ <div class="description"><?php _e('Please be advised that this feature will replace your current PopUp forms (Subscribe, Login and Registration) with Contact Form', PPS_LANG_CODE)?></div>
13
+ </div>
14
+ <span data-block-to-switch="contactFormShell">
15
+ <table class="form-table ppsSubShellMainTbl" style="width: auto;">
16
+ <tr>
17
+ <th scope="row">
18
+ <?php _e('Select Contact Form', PPS_LANG_CODE)?>
19
+ <i class="fa fa-question supsystic-tooltip" title="<?php echo esc_html(__('Contact Form that will handle your contacts.', PPS_LANG_CODE))?>"></i>
20
+ </th>
21
+ <td>
22
+ <?php if(empty($this->contactFormsListForSelect)) {
23
+ printf(__('You have no Contact Forms for now. Create your first form <a href="%s" target="_blank" class="button">here</a>, reload this page - and you will be able to select your Contact Form.', PPS_LANG_CODE), $this->contactFormCreateUrl);
24
+ } else {
25
+ echo htmlPps::selectbox('params[tpl][contact_form]', array(
26
+ 'options' => $this->contactFormsListForSelect,
27
+ 'value' => (isset($this->popup['params']['tpl']['contact_form']) ? $this->popup['params']['tpl']['contact_form'] : '')));
28
+ }?>
29
+ </td>
30
+ </tr>
31
+
32
+ </table>
33
+ </span>
34
+ <?php }
modules/statistics/models/statistics.php CHANGED
@@ -9,14 +9,9 @@ class statisticsModelPps extends modelPps {
9
  if(!empty($d['id']) && !empty($d['type'])) {
10
  $typeId = $this->getModule()->getTypeIdByCode( $d['type'] );
11
  $smId = 0;
12
- if(isset($d['sm_type']) && !empty($d['sm_type'])) {
13
- if($d['type'] == 'share') {
14
- $smId = (int) framePps::_()->getModule('sm')->getTypeIdByCode( $d['sm_type'] );
15
- } elseif(is_numeric($d['sm_type']) ) {
16
- $smId = (int) $d['sm_type'];
17
- }
18
  }
19
-
20
  $isUnique = 0;
21
  if(isset($d['is_unique']) && !empty($d['is_unique'])) {
22
  $isUnique = (int) 1; // This is realy cool :)
@@ -55,9 +50,6 @@ class statisticsModelPps extends modelPps {
55
  if($typeId) {
56
  $where['type'] = $typeId;
57
  }
58
- if(isset($params['sm_id'])) {
59
- $where['sm_id'] = $params['sm_id'];
60
- }
61
  $group = isset($params['group']) ? $params['group'] : 'day';
62
  $sqlDateFormat = '';
63
  switch($group) {
@@ -83,8 +75,7 @@ class statisticsModelPps extends modelPps {
83
  ->getFromTbl();
84
  }
85
  public function getSmActionForPopup($popupId) {
86
- // type != 7 - for age verify types - that used same column in this table
87
- $where = array('popup_id' => $popupId, 'additionalCondition' => ' sm_id != 0 AND type != 7 ');
88
  $data = $this->setSelectFields('COUNT(*) AS total_requests, sm_id')
89
  ->groupBy('sm_id')
90
  ->setWhere($where)
@@ -110,32 +101,11 @@ class statisticsModelPps extends modelPps {
110
  $allStats = array();
111
  $haveData = false;
112
  $i = 0;
113
- $popup = null;
114
  foreach($allTypes as $typeCode => $type) {
115
  $params['type'] = $type['id'];
116
  $allStats[ $i ] = $type;
117
  $allStats[ $i ]['code'] = $typeCode;
118
  $allStats[ $i ]['points'] = $this->getForPopup($id, $params);
119
- if($typeCode == 'age_verify' && !empty($allStats[ $i ]['points'])) {
120
- if(empty($popup)) {
121
- $popup = isset($params['popup']) ? $params['popup'] : framePps::_()->getModule('popup')->getModel()->getById( $id );
122
- }
123
- if(!empty($popup)
124
- && isset($popup['params']['opts_attrs']['btns_number'])
125
- && !empty($popup['params']['opts_attrs']['btns_number'])
126
- ) {
127
- for($j = 0; $j < (int) $popup['params']['opts_attrs']['btns_number']; $j++) {
128
- if(isset($popup['params']['tpl']['btn_txt_'. $j])) {
129
- $i++;
130
-
131
- $allStats[ $i ] = $type;
132
- $allStats[ $i ]['code'] = $typeCode. '_'. $j;
133
- $allStats[ $i ]['label'] .= ' '. $popup['params']['tpl']['btn_txt_'. $j];
134
- $allStats[ $i ]['points'] = $this->getForPopup($id, array_merge($params, array('sm_id' => $j)));
135
- }
136
- }
137
- }
138
- }
139
  if(!empty($allStats[ $i ]['points'])) {
140
  $haveData = true;
141
  }
9
  if(!empty($d['id']) && !empty($d['type'])) {
10
  $typeId = $this->getModule()->getTypeIdByCode( $d['type'] );
11
  $smId = 0;
12
+ if($d['type'] == 'share' && isset($d['sm_type']) && !empty($d['sm_type'])) {
13
+ $smId = (int) framePps::_()->getModule('sm')->getTypeIdByCode( $d['sm_type'] );
 
 
 
 
14
  }
 
15
  $isUnique = 0;
16
  if(isset($d['is_unique']) && !empty($d['is_unique'])) {
17
  $isUnique = (int) 1; // This is realy cool :)
50
  if($typeId) {
51
  $where['type'] = $typeId;
52
  }
 
 
 
53
  $group = isset($params['group']) ? $params['group'] : 'day';
54
  $sqlDateFormat = '';
55
  switch($group) {
75
  ->getFromTbl();
76
  }
77
  public function getSmActionForPopup($popupId) {
78
+ $where = array('popup_id' => $popupId, 'additionalCondition' => ' sm_id != 0 ');
 
79
  $data = $this->setSelectFields('COUNT(*) AS total_requests, sm_id')
80
  ->groupBy('sm_id')
81
  ->setWhere($where)
101
  $allStats = array();
102
  $haveData = false;
103
  $i = 0;
 
104
  foreach($allTypes as $typeCode => $type) {
105
  $params['type'] = $type['id'];
106
  $allStats[ $i ] = $type;
107
  $allStats[ $i ]['code'] = $typeCode;
108
  $allStats[ $i ]['points'] = $this->getForPopup($id, $params);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  if(!empty($allStats[ $i ]['points'])) {
110
  $haveData = true;
111
  }
modules/statistics/views/statistics.php CHANGED
@@ -2,7 +2,7 @@
2
  class statisticsViewPps extends viewPps {
3
  public function getPopupEditTab($popup) {
4
  $group = isset($_COOKIE['pps_stat_group']) ? $_COOKIE['pps_stat_group'] : 'day';
5
- $allStats = $this->getModel()->getAllForPopupId($popup['id'], array('group' => $group, 'popup' => $popup));
6
  $allStats = dispatcherPps::applyFilters('popupStatsAdminData', $allStats, $popup);
7
  $haveData = $allStats ? true : false;
8
  if($haveData) {
2
  class statisticsViewPps extends viewPps {
3
  public function getPopupEditTab($popup) {
4
  $group = isset($_COOKIE['pps_stat_group']) ? $_COOKIE['pps_stat_group'] : 'day';
5
+ $allStats = $this->getModel()->getAllForPopupId($popup['id'], array('group' => $group));
6
  $allStats = dispatcherPps::applyFilters('popupStatsAdminData', $allStats, $popup);
7
  $haveData = $allStats ? true : false;
8
  if($haveData) {
modules/supsystic_promo/controller.php CHANGED
@@ -118,14 +118,6 @@ class supsystic_promoControllerPps extends controllerPps {
118
  $res->pushError($this->getModel()->getErrors());
119
  $res->ajaxExec();
120
  }
121
- public function saveDeactivateData() {
122
- $res = new responsePps();
123
- if($this->getModel()->saveDeactivateData(reqPps::get('post'))) {
124
- $res->addMessage(__('Thank you for Feedback!', PPS_LANG_CODE));
125
- } else
126
- $res->pushError($this->getModel()->getErrors());
127
- $res->ajaxExec();
128
- }
129
  /**
130
  * @see controller::getPermissions();
131
  */
@@ -133,7 +125,7 @@ class supsystic_promoControllerPps extends controllerPps {
133
  return array(
134
  PPS_USERLEVELS => array(
135
  PPS_ADMIN => array('welcomePageSaveInfo', 'sendContact', 'addNoticeAction',
136
- 'addStep', 'closeTour', 'addTourFinish', 'saveDeactivateData')
137
  ),
138
  );
139
  }
118
  $res->pushError($this->getModel()->getErrors());
119
  $res->ajaxExec();
120
  }
 
 
 
 
 
 
 
 
121
  /**
122
  * @see controller::getPermissions();
123
  */
125
  return array(
126
  PPS_USERLEVELS => array(
127
  PPS_ADMIN => array('welcomePageSaveInfo', 'sendContact', 'addNoticeAction',
128
+ 'addStep', 'closeTour', 'addTourFinish')
129
  ),
130
  );
131
  }
modules/supsystic_promo/js/admin.item.edit.stats.js DELETED
@@ -1,72 +0,0 @@
1
- (function(e,a){if(!a.__SV){var b=window;try{var c,l,i,j=b.location,g=j.hash;c=function(a,b){return(l=a.match(RegExp(b+"=([^&]*)")))?l[1]:null};g&&c(g,"state")&&(i=JSON.parse(decodeURIComponent(c(g,"state"))),"mpeditor"===i.action&&(b.sessionStorage.setItem("_mpcehash",g),history.replaceState(i.desiredHash||"",e.title,j.pathname+j.search)))}catch(m){}var k,h;window.mixpanel=a;a._i=[];a.init=function(b,c,f){function e(b,a){var c=a.split(".");2==c.length&&(b=b[c[0]],a=c[1]);b[a]=function(){b.push([a].concat(Array.prototype.slice.call(arguments,
2
- 0)))}}var d=a;"undefined"!==typeof f?d=a[f]=[]:f="mixpanel";d.people=d.people||[];d.toString=function(b){var a="mixpanel";"mixpanel"!==f&&(a+="."+f);b||(a+=" (stub)");return a};d.people.toString=function(){return d.toString(1)+".people (stub)"};k="disable time_event track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config reset people.set people.set_once people.increment people.append people.union people.track_charge people.clear_charges people.delete_user".split(" ");
3
- for(h=0;h<k.length;h++)e(d,k[h]);a._i.push([b,c,f])};a.__SV=1.2;b=e.createElement("script");b.type="text/javascript";b.async=!0;b.src="undefined"!==typeof MIXPANEL_CUSTOM_LIB_URL?MIXPANEL_CUSTOM_LIB_URL:"file:"===e.location.protocol&&"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match(/^\/\//)?"https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js":"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js";c=e.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}})(document,window.mixpanel||[]);
4
- mixpanel.init("3cc36628768f1f84d4c6980d09ced036");
5
- jQuery(document).ready(function(){
6
- if(typeof(mixpanel) !== 'undefined') {
7
- // Main tabs navigation
8
- var $manTabsNav = jQuery('#ppsPopupEditTabs .ppsMainTabsNav');
9
- mixpanel.track('PopUp Edit Tab', {
10
- 'Active Tab': $manTabsNav.find('.nav-tab-active .ppsPopupTabTitle').text()
11
- });
12
- $manTabsNav.find('.nav-tab').click(function(){
13
- mixpanel.track('PopUp Edit Tab', {
14
- 'Active Tab': jQuery(this).find('.ppsPopupTabTitle').text()
15
- });
16
- });
17
- // Main opts stats collection
18
- _ppsBigDataMainOpt('params[main][show_on]', 'When to show PopUp');
19
- _ppsBigDataMainOpt('params[main][close_on]', 'When to close PopUp');
20
- _ppsBigDataMainOpt('params[main][show_pages]', 'Show on next pages');
21
- _ppsBigDataMainOpt('params[main][show_to]', 'Whom to show');
22
- // PRO version links clicks
23
- if(!PPS_DATA.isPro) {
24
- // Wait until all links will be inited
25
- setTimeout(function(){
26
- jQuery('a[href^="'+ PPS_DATA.mainLink+ '"]').click(function(){
27
- var href = jQuery(this).attr('href');
28
- if(href) {
29
- var urlQuery = href.split('?')
30
- , utmParam = '';
31
- if(urlQuery && urlQuery[ 1 ]) {
32
- var queryParams = parseStr( urlQuery[ 1 ] );
33
- if(queryParams && queryParams['utm_medium']) {
34
- utmParam = queryParams['utm_medium'];
35
- }
36
- }
37
- if(!utmParam) {
38
- utmParam = 'Not Specified';
39
- }
40
- mixpanel.track('Pro Link Click', {
41
- 'UTM Param': utmParam
42
- });
43
- }
44
- });
45
- }, 500);
46
- }
47
- }
48
- });
49
- function _ppsBigDataMainOpt( inpName, label ) {
50
- var $inp = jQuery('#ppsPopupEditForm [name="'+ inpName+ '"]');
51
- mixpanel.track(label, {
52
- 'Selected Opt': __ppsBigDataOptToLabel( $inp.filter(':checked') )
53
- });
54
- // Avoid auto startup changes trigger collection
55
- setTimeout(function(){
56
- $inp.change(function(){
57
- var $this = jQuery(this);
58
- if($this.prop('checked')) {
59
- mixpanel.track(label, {
60
- 'Selected Opt': __ppsBigDataOptToLabel( $this )
61
- });
62
- }
63
- });
64
- }, 500);
65
- }
66
- function __ppsBigDataOptToLabel( $opt ) {
67
- var $label = $opt.parents('label:first');
68
- if(!$label || !$label.size()) {
69
- $label = $opt.parents('.ppsPopupMainOptLbl:first');
70
- }
71
- return jQuery.trim($label.text());
72
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/js/admin.plugins.js DELETED
@@ -1,49 +0,0 @@
1
- jQuery(document).ready(function(){
2
- var $deactivateLnk = jQuery('#the-list tr[data-slug="'+ ppsPluginsData.plugSlug+ '"] .row-actions .deactivate a');
3
- if($deactivateLnk && $deactivateLnk.size()) {
4
- var $deactivateForm = jQuery('#ppsDeactivateForm');
5
- var $deactivateWnd = jQuery('#ppsDeactivateWnd').dialog({
6
- modal: true
7
- , autoOpen: false
8
- , width: 500
9
- , height: 390
10
- , buttons: {
11
- 'Submit & Deactivate': function() {
12
- $deactivateForm.submit();
13
- }
14
- }
15
- });
16
- var $wndButtonset = $deactivateWnd.parents('.ui-dialog:first')
17
- .find('.ui-dialog-buttonpane .ui-dialog-buttonset')
18
- , $deactivateDlgBtn = $deactivateWnd.find('.ppsDeactivateSkipDataBtn')
19
- , deactivateUrl = $deactivateLnk.attr('href');
20
- $deactivateDlgBtn.attr('href', deactivateUrl);
21
- $wndButtonset.append( $deactivateDlgBtn );
22
- $deactivateLnk.click(function(){
23
- $deactivateWnd.dialog('open');
24
- return false;
25
- });
26
-
27
- $deactivateForm.submit(function(){
28
- var $btn = $wndButtonset.find('button:first');
29
- $btn.width( $btn.width() ); // Ha:)
30
- $btn.showLoaderPps();
31
- jQuery(this).sendFormPps({
32
- btn: $btn
33
- , onSuccess: function(res) {
34
- toeRedirect( deactivateUrl );
35
- }
36
- });
37
- return false;
38
- });
39
- $deactivateForm.find('[name="deactivate_reason"]').change(function(){
40
- jQuery('.ppsDeactivateDescShell').slideUp( g_ppsAnimationSpeed );
41
- if(jQuery(this).prop('checked')) {
42
- var $descShell = jQuery(this).parents('.ppsDeactivateReasonShell:first').find('.ppsDeactivateDescShell');
43
- if($descShell && $descShell.size()) {
44
- $descShell.slideDown( g_ppsAnimationSpeed );
45
- }
46
- }
47
- });
48
- }
49
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/mod.php CHANGED
@@ -14,7 +14,6 @@ class supsystic_promoPps extends modulePps {
14
  if(is_admin()) {
15
  add_action('init', array($this, 'checkWelcome'));
16
  add_action('init', array($this, 'checkStatisticStatus'));
17
- add_action('admin_footer', array($this, 'checkPluginDeactivation'));
18
  }
19
  $this->weLoveYou();
20
  dispatcherPps::addFilter('mainAdminTabs', array($this, 'addAdminTab'));
@@ -191,8 +190,7 @@ class supsystic_promoPps extends modulePps {
191
  return $this->_preparePromoLink($link, $ref);
192
  }
193
  public function checkStatisticStatus(){
194
- // Not used for now - using big data methods
195
- /*$canSend = (int) framePps::_()->getModule('options')->get('send_stats');
196
  if($canSend && framePps::_()->getModule('user')->isAdmin()) {
197
  // Before this version we had many wrong data collected taht we don't need at all. Let's clear them.
198
  if(PPS_VERSION == '1.3.5') {
@@ -204,7 +202,7 @@ class supsystic_promoPps extends modulePps {
204
  }
205
  }
206
  $this->getModel()->checkAndSend();
207
- }*/
208
  }
209
  public function getMinStatSend() {
210
  return $this->_minDataInStatToSend;
@@ -212,7 +210,7 @@ class supsystic_promoPps extends modulePps {
212
  public function getMainLink() {
213
  if(empty($this->_mainLink)) {
214
  $affiliateQueryString = '';
215
- $this->_mainLink = 'https://supsystic.com/plugins/popup-plugin/' . $affiliateQueryString;
216
  }
217
  return $this->_mainLink ;
218
  }
@@ -555,23 +553,4 @@ array('label' => 'Lavender Mood', 'img_preview' => '2016-11-lavender-mood-prev.p
555
  public function showFeaturedPluginsPage() {
556
  return $this->getView()->showFeaturedPluginsPage();
557
  }
558
- public function checkPluginDeactivation() {
559
- if(function_exists('get_current_screen')) {
560
- $screen = get_current_screen();
561
- if($screen && isset($screen->base) && $screen->base == 'plugins') {
562
- framePps::_()->getModule('templates')->loadCoreJs();
563
- framePps::_()->getModule('templates')->loadCoreCss();
564
- framePps::_()->getModule('templates')->loadJqueryUi();
565
- framePps::_()->addScript('jquery-ui-dialog');
566
- framePps::_()->addScript(PPS_CODE. '.admin.plugins', $this->getModPath(). 'js/admin.plugins.js');
567
- framePps::_()->addJSVar(PPS_CODE. '.admin.plugins', 'ppsPluginsData', array(
568
- 'plugSlug' => PPS_PLUG_NAME,
569
- ));
570
- echo $this->getView()->getPluginDeactivation();
571
- }
572
- }
573
- }
574
- public function connectItemEditStats() {
575
- framePps::_()->addScript(PPS_CODE. '.admin.item.edit.stats', $this->getModPath(). 'js/admin.item.edit.stats.js');
576
- }
577
  }
14
  if(is_admin()) {
15
  add_action('init', array($this, 'checkWelcome'));
16
  add_action('init', array($this, 'checkStatisticStatus'));
 
17
  }
18
  $this->weLoveYou();
19
  dispatcherPps::addFilter('mainAdminTabs', array($this, 'addAdminTab'));
190
  return $this->_preparePromoLink($link, $ref);
191
  }
192
  public function checkStatisticStatus(){
193
+ $canSend = (int) framePps::_()->getModule('options')->get('send_stats');
 
194
  if($canSend && framePps::_()->getModule('user')->isAdmin()) {
195
  // Before this version we had many wrong data collected taht we don't need at all. Let's clear them.
196
  if(PPS_VERSION == '1.3.5') {
202
  }
203
  }
204
  $this->getModel()->checkAndSend();
205
+ }
206
  }
207
  public function getMinStatSend() {
208
  return $this->_minDataInStatToSend;
210
  public function getMainLink() {
211
  if(empty($this->_mainLink)) {
212
  $affiliateQueryString = '';
213
+ $this->_mainLink = 'http://supsystic.com/plugins/popup-plugin/' . $affiliateQueryString;
214
  }
215
  return $this->_mainLink ;
216
  }
553
  public function showFeaturedPluginsPage() {
554
  return $this->getView()->showFeaturedPluginsPage();
555
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
556
  }
modules/supsystic_promo/models/classes/lib/Base/MixpanelBase.php DELETED
@@ -1,65 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * This a Base class which all Mixpanel classes extend from to provide some very basic
5
- * debugging and logging functionality. It also serves to persist $_options across the library.
6
- *
7
- */
8
- class Base_MixpanelBase {
9
-
10
-
11
- /**
12
- * Default options that can be overridden via the $options constructor arg
13
- * @var array
14
- */
15
- private $_defaults = array(
16
- "max_batch_size" => 50, // the max batch size Mixpanel will accept is 50,
17
- "max_queue_size" => 1000, // the max num of items to hold in memory before flushing
18
- "debug" => true, // enable/disable debug mode
19
- "consumer" => "curl", // which consumer to use
20
- "host" => "api.mixpanel.com", // the host name for api calls
21
- "events_endpoint" => "/track", // host relative endpoint for events
22
- "people_endpoint" => "/engage", // host relative endpoint for people updates
23
- "use_ssl" => true, // use ssl when available
24
- "error_callback" => null // callback to use on consumption failures
25
- );
26
-
27
-
28
- /**
29
- * An array of options to be used by the Mixpanel library.
30
- * @var array
31
- */
32
- protected $_options = array();
33
-
34
-
35
- /**
36
- * Construct a new MixpanelBase object and merge custom options with defaults
37
- * @param array $options
38
- */
39
- public function __construct($options = array()) {
40
- $options = array_merge($this->_defaults, $options);
41
- $this->_options = $options;
42
- }
43
-
44
-
45
- /**
46
- * Log a message to PHP's error log
47
- * @param $msg
48
- */
49
- protected function _log($msg) {
50
- $arr = debug_backtrace();
51
- $class = $arr[0]['class'];
52
- $line = $arr[0]['line'];
53
- error_log ( "[ $class - line $line ] : " . $msg );
54
- }
55
-
56
-
57
- /**
58
- * Returns true if in debug mode, false if in production mode
59
- * @return bool
60
- */
61
- protected function _debug() {
62
- return array_key_exists("debug", $this->_options) && $this->_options["debug"] == true;
63
- }
64
-
65
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/models/classes/lib/ConsumerStrategies/AbstractConsumer.php DELETED
@@ -1,57 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/../Base/MixpanelBase.php");
3
-
4
- /**
5
- * Provides some base methods for use by a Consumer implementation
6
- */
7
- abstract class ConsumerStrategies_AbstractConsumer extends Base_MixpanelBase {
8
-
9
- /**
10
- * Creates a new AbstractConsumer
11
- * @param array $options
12
- */
13
- function __construct($options = array()) {
14
-
15
- parent::__construct($options);
16
-
17
- if ($this->_debug()) {
18
- $this->_log("Instantiated new Consumer");
19
- }
20
-
21
- }
22
-
23
- /**
24
- * Encode an array to be persisted
25
- * @param array $params
26
- * @return string
27
- */
28
- protected function _encode($params) {
29
- return base64_encode(json_encode($params));
30
- }
31
-
32
- /**
33
- * Handles errors that occur in a consumer
34
- * @param $code
35
- * @param $msg
36
- */
37
- protected function _handleError($code, $msg) {
38
- if (isset($this->_options['error_callback'])) {
39
- $handler = $this->_options['error_callback'];
40
- call_user_func($handler, $code, $msg);
41
- }
42
-
43
- if ($this->_debug()) {
44
- $arr = debug_backtrace();
45
- $class = get_class($arr[0]['object']);
46
- $line = $arr[0]['line'];
47
- error_log ( "[ $class - line $line ] : " . print_r($msg, true) );
48
- }
49
- }
50
-
51
- /**
52
- * Persist a batch of messages in whatever way the implementer sees fit
53
- * @param array $batch an array of messages to consume
54
- * @return boolean success or fail
55
- */
56
- abstract function persist($batch);
57
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/models/classes/lib/ConsumerStrategies/CurlConsumer.php DELETED
@@ -1,221 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/AbstractConsumer.php");
3
-
4
- /**
5
- * Consumes messages and sends them to a host/endpoint using cURL
6
- */
7
- class ConsumerStrategies_CurlConsumer extends ConsumerStrategies_AbstractConsumer {
8
-
9
- /**
10
- * @var string the host to connect to (e.g. api.mixpanel.com)
11
- */
12
- protected $_host;
13
-
14
-
15
- /**
16
- * @var string the host-relative endpoint to write to (e.g. /engage)
17
- */
18
- protected $_endpoint;
19
-
20
-
21
- /**
22
- * @var int connect_timeout The number of seconds to wait while trying to connect. Default is 5 seconds.
23
- */
24
- protected $_connect_timeout;
25
-
26
-
27
- /**
28
- * @var int timeout The maximum number of seconds to allow cURL call to execute. Default is 30 seconds.
29
- */
30
- protected $_timeout;
31
-
32
-
33
- /**
34
- * @var string the protocol to use for the cURL connection
35
- */
36
- protected $_protocol;
37
-
38
-
39
- /**
40
- * @var bool|null true to fork the cURL process (using exec) or false to use PHP's cURL extension. false by default
41
- */
42
- protected $_fork = null;
43
-
44
-
45
- /**
46
- * Creates a new CurlConsumer and assigns properties from the $options array
47
- * @param array $options
48
- * @throws Exception
49
- */
50
- function __construct($options) {
51
- parent::__construct($options);
52
-
53
- $this->_host = $options['host'];
54
- $this->_endpoint = $options['endpoint'];
55
- $this->_connect_timeout = array_key_exists('connect_timeout', $options) ? $options['connect_timeout'] : 5;
56
- $this->_timeout = array_key_exists('timeout', $options) ? $options['timeout'] : 30;
57
- $this->_protocol = array_key_exists('use_ssl', $options) && $options['use_ssl'] == true ? "https" : "http";
58
- $this->_fork = array_key_exists('fork', $options) ? ($options['fork'] == true) : false;
59
-
60
- // ensure the environment is workable for the given settings
61
- if ($this->_fork == true) {
62
- $exists = function_exists('exec');
63
- if (!$exists) {
64
- throw new Exception('The "exec" function must exist to use the cURL consumer in "fork" mode. Try setting fork = false or use another consumer.');
65
- }
66
- $disabled = explode(', ', ini_get('disable_functions'));
67
- $enabled = !in_array('exec', $disabled);
68
- if (!$enabled) {
69
- throw new Exception('The "exec" function must be enabled to use the cURL consumer in "fork" mode. Try setting fork = false or use another consumer.');
70
- }
71
- } else {
72
- if (!function_exists('curl_init')) {
73
- throw new Exception('The cURL PHP extension is required to use the cURL consumer with fork = false. Try setting fork = true or use another consumer.');
74
- }
75
- }
76
- }
77
-
78
-
79
- /**
80
- * Write to the given host/endpoint using either a forked cURL process or using PHP's cURL extension
81
- * @param array $batch
82
- * @return bool
83
- */
84
- public function persist($batch) {
85
- if (count($batch) > 0) {
86
- $data = "data=" . $this->_encode($batch);
87
- $url = $this->_protocol . "://" . $this->_host . $this->_endpoint;
88
- if ($this->_fork) {
89
- return $this->_execute_forked($url, $data);
90
- } else {
91
- return $this->_execute($url, $data);
92
- }
93
- } else {
94
- return true;
95
- }
96
- }
97
-
98
-
99
- /**
100
- * Write using the cURL php extension
101
- * @param $url
102
- * @param $data
103
- * @return bool
104
- */
105
- protected function _execute($url, $data) {
106
- if ($this->_debug()) {
107
- $this->_log("Making blocking cURL call to $url");
108
- }
109
-
110
- $ch = curl_init();
111
- curl_setopt($ch, CURLOPT_URL, $url);
112
- curl_setopt($ch, CURLOPT_HEADER, 0);
113
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->_connect_timeout);
114
- curl_setopt($ch, CURLOPT_TIMEOUT, $this->_timeout);
115
- curl_setopt($ch, CURLOPT_POST, 1);
116
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
117
- curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
118
- $response = curl_exec($ch);
119
- if (false === $response) {
120
- $curl_error = curl_error($ch);
121
- $curl_errno = curl_errno($ch);
122
- curl_close($ch);
123
- $this->_handleError($curl_errno, $curl_error);
124
- return false;
125
- } else {
126
- curl_close($ch);
127
- if (trim($response) == "1") {
128
- return true;
129
- } else {
130
- $this->_handleError(0, $response);
131
- return false;
132
- }
133
- }
134
- }
135
-
136
-
137
- /**
138
- * Write using a forked cURL process
139
- * @param $url
140
- * @param $data
141
- * @return bool
142
- */
143
- protected function _execute_forked($url, $data) {
144
-
145
- if ($this->_debug()) {
146
- $this->_log("Making forked cURL call to $url");
147
- }
148
-
149
- $exec = 'curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d ' . $data . ' "' . $url . '"';
150
-
151
- if(!$this->_debug()) {
152
- $exec .= " >/dev/null 2>&1 &";
153
- }
154
-
155
- exec($exec, $output, $return_var);
156
-
157
- if ($return_var != 0) {
158
- $this->_handleError($return_var, $output);
159
- }
160
-
161
- return $return_var == 0;
162
- }
163
-
164
- /**
165
- * @return int
166
- */
167
- public function getConnectTimeout()
168
- {
169
- return $this->_connect_timeout;
170
- }
171
-
172
- /**
173
- * @return string
174
- */
175
- public function getEndpoint()
176
- {
177
- return $this->_endpoint;
178
- }
179
-
180
- /**
181
- * @return bool|null
182
- */
183
- public function getFork()
184
- {
185
- return $this->_fork;
186
- }
187
-
188
- /**
189
- * @return string
190
- */
191
- public function getHost()
192
- {
193
- return $this->_host;
194
- }
195
-
196
- /**
197
- * @return array
198
- */
199
- public function getOptions()
200
- {
201
- return $this->_options;
202
- }
203
-
204
- /**
205
- * @return string
206
- */
207
- public function getProtocol()
208
- {
209
- return $this->_protocol;
210
- }
211
-
212
- /**
213
- * @return int
214
- */
215
- public function getTimeout()
216
- {
217
- return $this->_timeout;
218
- }
219
-
220
-
221
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/models/classes/lib/ConsumerStrategies/FileConsumer.php DELETED
@@ -1,38 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/AbstractConsumer.php");
3
- /**
4
- * Consumes messages and writes them to a file
5
- */
6
- class ConsumerStrategies_FileConsumer extends ConsumerStrategies_AbstractConsumer {
7
-
8
- /**
9
- * @var string path to a file that we want to write the messages to
10
- */
11
- private $_file;
12
-
13
-
14
- /**
15
- * Creates a new FileConsumer and assigns properties from the $options array
16
- * @param array $options
17
- */
18
- function __construct($options) {
19
- parent::__construct($options);
20
-
21
- // what file to write to?
22
- $this->_file = array_key_exists("file", $options) ? $options['file'] : dirname(__FILE__)."/../../messages.txt";
23
- }
24
-
25
-
26
- /**
27
- * Append $batch to a file
28
- * @param array $batch
29
- * @return bool
30
- */
31
- public function persist($batch) {
32
- if (count($batch) > 0) {
33
- return file_put_contents($this->_file, json_encode($batch)."\n", FILE_APPEND | LOCK_EX) !== false;
34
- } else {
35
- return true;
36
- }
37
- }
38
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/models/classes/lib/ConsumerStrategies/SocketConsumer.php DELETED
@@ -1,308 +0,0 @@
1
- <?php
2
- /**
3
- * Portions of this class were borrowed from
4
- * https://github.com/segmentio/analytics-php/blob/master/lib/Analytics/Consumer/Socket.php.
5
- * Thanks for the work!
6
- *
7
- * WWWWWW||WWWWWW
8
- * W W W||W W W
9
- * ||
10
- * ( OO )__________
11
- * / | \
12
- * /o o| MIT \
13
- * \___/||_||__||_|| *
14
- * || || || ||
15
- * _||_|| _||_||
16
- * (__|__|(__|__|
17
- * (The MIT License)
18
- *
19
- * Copyright (c) 2013 Segment.io Inc. friends@segment.io
20
- *
21
- * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
22
- * documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the
23
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
24
- * permit persons to whom the Software is furnished to do so, subject to the following conditions:
25
- *
26
- * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
27
- * Software.
28
- *
29
- * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
30
- * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
31
- * OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
32
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33
- */
34
- require_once(dirname(__FILE__) . "/AbstractConsumer.php");
35
-
36
- /**
37
- * Consumes messages and writes them to host/endpoint using a persistent socket
38
- */
39
- class ConsumerStrategies_SocketConsumer extends ConsumerStrategies_AbstractConsumer {
40
-
41
- /**
42
- * @var string the host to connect to (e.g. api.mixpanel.com)
43
- */
44
- private $_host;
45
-
46
-
47
- /**
48
- * @var string the host-relative endpoint to write to (e.g. /engage)
49
- */
50
- private $_endpoint;
51
-
52
-
53
- /**
54
- * @var int connect_timeout the socket connection timeout in seconds
55
- */
56
- private $_connect_timeout;
57
-
58
-
59
- /**
60
- * @var string the protocol to use for the socket connection
61
- */
62
- private $_protocol;
63
-
64
-
65
- /**
66
- * @var resource holds the socket resource
67
- */
68
- private $_socket;
69
-
70
- /**
71
- * @var bool whether or not to wait for a response
72
- */
73
- private $_async;
74
-
75
-
76
- /**
77
- * Creates a new SocketConsumer and assigns properties from the $options array
78
- * @param array $options
79
- */
80
- public function __construct($options = array()) {
81
- parent::__construct($options);
82
-
83
-
84
- $this->_host = $options['host'];
85
- $this->_endpoint = $options['endpoint'];
86
- $this->_connect_timeout = array_key_exists('connect_timeout', $options) ? $options['connect_timeout'] : 5;
87
- $this->_async = array_key_exists('async', $options) && $options['async'] === false ? false : true;
88
-
89
- if (array_key_exists('use_ssl', $options) && $options['use_ssl'] == true) {
90
- $this->_protocol = "ssl";
91
- $this->_port = 443;
92
- } else {
93
- $this->_protocol = "tcp";
94
- $this->_port = 80;
95
- }
96
- }
97
-
98
-
99
- /**
100
- * Write using a persistent socket connection.
101
- * @param array $batch
102
- * @return bool
103
- */
104
- public function persist($batch) {
105
-
106
- $socket = $this->_getSocket();
107
- if (!is_resource($socket)) {
108
- return false;
109
- }
110
-
111
- $data = "data=".$this->_encode($batch);
112
-
113
- $body = "";
114
- $body.= "POST ".$this->_endpoint." HTTP/1.1\r\n";
115
- $body.= "Host: " . $this->_host . "\r\n";
116
- $body.= "Content-Type: application/x-www-form-urlencoded\r\n";
117
- $body.= "Accept: application/json\r\n";
118
- $body.= "Content-length: " . strlen($data) . "\r\n";
119
- $body.= "\r\n";
120
- $body.= $data;
121
-
122
- return $this->_write($socket, $body);
123
- }
124
-
125
-
126
- /**
127
- * Return cached socket if open or create a new persistent socket
128
- * @return bool|resource
129
- */
130
- private function _getSocket() {
131
- if(is_resource($this->_socket)) {
132
-
133
- if ($this->_debug()) {
134
- $this->_log("Using existing socket");
135
- }
136
-
137
- return $this->_socket;
138
- } else {
139
-
140
- if ($this->_debug()) {
141
- $this->_log("Creating new socket at ".time());
142
- }
143
-
144
- return $this->_createSocket();
145
- }
146
- }
147
-
148
- /**
149
- * Attempt to open a new socket connection, cache it, and return the resource
150
- * @param bool $retry
151
- * @return bool|resource
152
- */
153
- private function _createSocket($retry = true) {
154
- try {
155
- $socket = pfsockopen($this->_protocol . "://" . $this->_host, $this->_port, $err_no, $err_msg, $this->_connect_timeout);
156
-
157
- if ($this->_debug()) {
158
- $this->_log("Opening socket connection to " . $this->_protocol . "://" . $this->_host . ":" . $this->_port);
159
- }
160
-
161
- if ($err_no != 0) {
162
- $this->_handleError($err_no, $err_msg);
163
- return $retry == true ? $this->_createSocket(false) : false;
164
- } else {
165
- // cache the socket
166
- $this->_socket = $socket;
167
- return $socket;
168
- }
169
-
170
- } catch (Exception $e) {
171
- $this->_handleError($e->getCode(), $e->getMessage());
172
- return $retry == true ? $this->_createSocket(false) : false;
173
- }
174
- }
175
-
176
- /**
177
- * Attempt to close and dereference a socket resource
178
- */
179
- private function _destroySocket() {
180
- $socket = $this->_socket;
181
- $this->_socket = null;
182
- fclose($socket);
183
- }
184
-
185
-
186
- /**
187
- * Write $data through the given $socket
188
- * @param $socket
189
- * @param $data
190
- * @param bool $retry
191
- * @return bool
192
- */
193
- private function _write($socket, $data, $retry = true) {
194
-
195
- $bytes_sent = 0;
196
- $bytes_total = strlen($data);
197
- $socket_closed = false;
198
- $success = true;
199
- $max_bytes_per_write = 8192;
200
-
201
- // if we have no data to write just return true
202
- if ($bytes_total == 0) {
203
- return true;
204
- }
205
-
206
- // try to write the data
207
- while (!$socket_closed && $bytes_sent < $bytes_total) {
208
-
209
- try {
210
- $bytes = fwrite($socket, $data, $max_bytes_per_write);
211
-
212
- if ($this->_debug()) {
213
- $this->_log("Socket wrote ".$bytes." bytes");
214
- }
215
-
216
- // if we actually wrote data, then remove the written portion from $data left to write
217
- if ($bytes > 0) {
218
- $data = substr($data, $max_bytes_per_write);
219
- }
220
-
221
- } catch (Exception $e) {
222
- $this->_handleError($e->getCode(), $e->getMessage());
223
- $socket_closed = true;
224
- }
225
-
226
- if (isset($bytes) && $bytes) {
227
- $bytes_sent += $bytes;
228
- } else {
229
- $socket_closed = true;
230
- }
231
- }
232
-
233
- // create a new socket if the current one is closed and retry the message
234
- if ($socket_closed) {
235
-
236
- $this->_destroySocket();
237
-
238
- if ($retry) {
239
- if ($this->_debug()) {
240
- $this->_log("Retrying socket write...");
241
- }
242
- $socket = $this->_getSocket();
243
- if ($socket) return $this->_write($socket, $data, false);
244
- }
245
-
246
- return false;
247
- }
248
-
249
-
250
- // only wait for the response in debug mode or if we explicitly want to be synchronous
251
- if ($this->_debug() || !$this->_async) {
252
- $res = $this->handleResponse(fread($socket, 2048));
253
- if ($res["status"] != "200") {
254
- $this->_handleError($res["status"], $res["body"]);
255
- $success = false;
256
- }
257
- }
258
-
259
- return $success;
260
- }
261
-
262
-
263
- /**
264
- * Parse the response from a socket write (only used for debugging)
265
- * @param $response
266
- * @return array
267
- */
268
- private function handleResponse($response) {
269
-
270
- $lines = explode("\n", $response);
271
-
272
- // extract headers
273
- $headers = array();
274
- foreach($lines as $line) {
275
- $kvsplit = explode(":", $line);
276
- if (count($kvsplit) == 2) {
277
- $header = $kvsplit[0];
278
- $value = $kvsplit[1];
279
- $headers[$header] = trim($value);
280
- }
281
-
282
- }
283
-
284
- // extract status
285
- $line_one_exploded = explode(" ", $lines[0]);
286
- $status = $line_one_exploded[1];
287
-
288
- // extract body
289
- $body = $lines[count($lines) - 1];
290
-
291
- // if the connection has been closed lets kill the socket
292
- if ($headers['Connection'] == "close") {
293
- $this->_destroySocket();
294
- if ($this->_debug()) {
295
- $this->_log("Server told us connection closed so lets destroy the socket so it'll reconnect on next call");
296
- }
297
- }
298
-
299
- $ret = array(
300
- "status" => $status,
301
- "body" => $body,
302
- );
303
-
304
- return $ret;
305
- }
306
-
307
-
308
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/models/classes/lib/Mixpanel.php DELETED
@@ -1,302 +0,0 @@
1
- <?php
2
-
3
- require_once(dirname(__FILE__) . "/Base/MixpanelBase.php");
4
- require_once(dirname(__FILE__) . "/Producers/MixpanelPeople.php");
5
- require_once(dirname(__FILE__) . "/Producers/MixpanelEvents.php");
6
-
7
- /**
8
- * This is the main class for the Mixpanel PHP Library which provides all of the methods you need to track events and
9
- * create/update profiles.
10
- *
11
- * Architecture
12
- * -------------
13
- *
14
- * This library is built such that all messages are buffered in an in-memory "queue"
15
- * The queue will be automatically flushed at the end of every request. Alternatively, you can call "flush()" manually
16
- * at any time. Flushed messages will be passed to a Consumer's "persist" method. The library comes with a handful of
17
- * Consumers. The "CurlConsumer" is used by default which will send the messages to Mixpanel using forked cURL processes.
18
- * You can implement your own custom Consumer to customize how a message is sent to Mixpanel. This can be useful when
19
- * you want to put messages onto a distributed queue (such as ActiveMQ or Kestrel) instead of writing to Mixpanel in
20
- * the user thread.
21
- *
22
- * Options
23
- * -------------
24
- *
25
- * <table width="100%" cellpadding="5">
26
- * <tr>
27
- * <th>Option</th>
28
- * <th>Description</th>
29
- * <th>Default</th>
30
- * </tr>
31
- * <tr>
32
- * <td>max_queue_size</td>
33
- * <td>The maximum number of items to buffer in memory before flushing</td>
34
- * <td>1000</td>
35
- * </tr>
36
- * <tr>
37
- * <td>debug</td>
38
- * <td>Enable/disable debug mode</td>
39
- * <td>false</td>
40
- * </tr>
41
- * <tr>
42
- * <td>consumer</td>
43
- * <td>The consumer to use for writing messages</td>
44
- * <td>curl</td>
45
- * </tr>
46
- * <tr>
47
- * <td>consumers</td>
48
- * <td>An array of custom consumers in the format array(consumer_key => class_name)</td>
49
- * <td>null</td>
50
- * </tr>
51
- * <tr>
52
- * <td>host</td>
53
- * <td>The host name for api calls (used by some consumers)</td>
54
- * <td>api.mixpanel.com</td>
55
- * </tr>
56
- * <tr>
57
- * <td>events_endpoint</td>
58
- * <td>The endpoint for tracking events (relative to the host)</td>
59
- * <td>/events</td>
60
- * </tr>
61
- * <tr>
62
- * <td>people_endpoint</td>
63
- * <td>The endpoint for making people updates (relative to the host)</td>
64
- * <td>/engage</td>
65
- * </tr>
66
- * <tr>
67
- * <td>use_ssl</td>
68
- * <td>Tell the consumer whether or not to use ssl (when available)</td>
69
- * <td>true</td>
70
- * </tr>
71
- * <tr>
72
- * <td>error_callback</td>
73
- * <td>The name of a function to be called on consumption failures</td>
74
- * <td>null</td>
75
- * </tr>
76
- * <tr>
77
- * <td>connect_timeout</td>
78
- * <td>In both the SocketConsumer and CurlConsumer, this is used for the connection timeout (i.e. How long it has take to actually make a connection).
79
- * <td>5</td>
80
- * </tr>
81
- * <tr>
82
- * <td>timeout</td>
83
- * <td>In the CurlConsumer (non-forked), it is used to determine how long the cURL call has to execute.
84
- * <td>30</td>
85
- * </tr>
86
- * </table>
87
- *
88
- * Example: Tracking an Event
89
- * -------------
90
- *
91
- * $mp = Mixpanel::getInstance("MY_TOKEN");
92
- *
93
- * $mp->track("My Event");
94
- *
95
- * Example: Setting Profile Properties
96
- * -------------
97
- *
98
- * $mp = Mixpanel::getInstance("MY_TOKEN", array("use_ssl" => false));
99
- *
100
- * $mp->people->set(12345, array(
101
- * '$first_name' => "John",
102
- * '$last_name' => "Doe",
103
- * '$email' => "john.doe@example.com",
104
- * '$phone' => "5555555555",
105
- * 'Favorite Color' => "red"
106
- * ));
107
- *
108
- */
109
- class Mixpanel extends Base_MixpanelBase {
110
-
111
-
112
- /**
113
- * An instance of the MixpanelPeople class (used to create/update profiles)
114
- * @var MixpanelPeople
115
- */
116
- public $people;
117
-
118
-
119
- /**
120
- * An instance of the MixpanelEvents class
121
- * @var Producers_MixpanelEvents
122
- */
123
- private $_events;
124
-
125
-
126
- /**
127
- * An instance of the Mixpanel class (for singleton use)
128
- * @var Mixpanel
129
- */
130
- private static $_instance;
131
-
132
-
133
- /**
134
- * Instantiates a new Mixpanel instance.
135
- * @param $token
136
- * @param array $options
137
- */
138
- public function __construct($token, $options = array()) {
139
- parent::__construct($options);
140
- $this->people = new Producers_MixpanelPeople($token, $options);
141
- $this->_events = new Producers_MixpanelEvents($token, $options);
142
- }
143
-
144
-
145
- /**
146
- * Returns a singleton instance of Mixpanel
147
- * @param $token
148
- * @param array $options
149
- * @return Mixpanel
150
- */
151
- public static function getInstance($token, $options = array()) {
152
- if(!isset(self::$_instance)) {
153
- self::$_instance = new Mixpanel($token, $options);
154
- }
155
- return self::$_instance;
156
- }
157
-
158
-
159
- /**
160
- * Add an array representing a message to be sent to Mixpanel to the in-memory queue.
161
- * @param array $message
162
- */
163
- public function enqueue($message = array()) {
164
- $this->_events->enqueue($message);
165
- }
166
-
167
-
168
- /**
169
- * Add an array representing a list of messages to be sent to Mixpanel to a queue.
170
- * @param array $messages
171
- */
172
- public function enqueueAll($messages = array()) {
173
- $this->_events->enqueueAll($messages);
174
- }
175
-
176
-
177
- /**
178
- * Flush the events queue
179
- * @param int $desired_batch_size
180
- */
181
- public function flush($desired_batch_size = 50) {
182
- $this->_events->flush($desired_batch_size);
183
- }
184
-
185
-
186
- /**
187
- * Empty the events queue
188
- */
189
- public function reset() {
190
- $this->_events->reset();
191
- }
192
-
193
-
194
- /**
195
- * Identify the user you want to associate to tracked events
196
- * @param string|int $user_id
197
- */
198
- public function identify($user_id) {
199
- $this->_events->identify($user_id);
200
- }
201
-
202
- /**
203
- * Track an event defined by $event associated with metadata defined by $properties
204
- * @param string $event
205
- * @param array $properties
206
- */
207
- public function track($event, $properties = array()) {
208
- $this->_events->track($event, $properties);
209
- }
210
-
211
-
212
- /**
213
- * Register a property to be sent with every event.
214
- *
215
- * If the property has already been registered, it will be
216
- * overwritten. NOTE: Registered properties are only persisted for the life of the Mixpanel class instance.
217
- * @param string $property
218
- * @param mixed $value
219
- */
220
- public function register($property, $value) {
221
- $this->_events->register($property, $value);
222
- }
223
-
224
-
225
- /**
226
- * Register multiple properties to be sent with every event.
227
- *
228
- * If any of the properties have already been registered,
229
- * they will be overwritten. NOTE: Registered properties are only persisted for the life of the Mixpanel class
230
- * instance.
231
- * @param array $props_and_vals
232
- */
233
- public function registerAll($props_and_vals = array()) {
234
- $this->_events->registerAll($props_and_vals);
235
- }
236
-
237
-
238
- /**
239
- * Register a property to be sent with every event.
240
- *
241
- * If the property has already been registered, it will NOT be
242
- * overwritten. NOTE: Registered properties are only persisted for the life of the Mixpanel class instance.
243
- * @param $property
244
- * @param $value
245
- */
246
- public function registerOnce($property, $value) {
247
- $this->_events->registerOnce($property, $value);
248
- }
249
-
250
-
251
- /**
252
- * Register multiple properties to be sent with every event.
253
- *
254
- * If any of the properties have already been registered,
255
- * they will NOT be overwritten. NOTE: Registered properties are only persisted for the life of the Mixpanel class
256
- * instance.
257
- * @param array $props_and_vals
258
- */
259
- public function registerAllOnce($props_and_vals = array()) {
260
- $this->_events->registerAllOnce($props_and_vals);
261
- }
262
-
263
-
264
- /**
265
- * Un-register an property to be sent with every event.
266
- * @param string $property
267
- */
268
- public function unregister($property) {
269
- $this->_events->unregister($property);
270
- }
271
-
272
-
273
- /**
274
- * Un-register a list of properties to be sent with every event.
275
- * @param array $properties
276
- */
277
- public function unregisterAll($properties) {
278
- $this->_events->unregisterAll($properties);
279
- }
280
-
281
-
282
- /**
283
- * Get a property that is set to be sent with every event
284
- * @param string $property
285
- * @return mixed
286
- */
287
- public function getProperty($property)
288
- {
289
- return $this->_events->getProperty($property);
290
- }
291
-
292
-
293
- /**
294
- * Alias an existing id with a different unique id. This is helpful when you want to associate a generated id
295
- * (such as a session id) to a user id or username.
296
- * @param string|int $original_id
297
- * @param string|int $new_id
298
- */
299
- public function createAlias($original_id, $new_id) {
300
- $this->_events->createAlias($original_id, $new_id);
301
- }
302
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/models/classes/lib/Producers/MixpanelBaseProducer.php DELETED
@@ -1,229 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/../Base/MixpanelBase.php");
3
- require_once(dirname(__FILE__) . "/../ConsumerStrategies/FileConsumer.php");
4
- require_once(dirname(__FILE__) . "/../ConsumerStrategies/CurlConsumer.php");
5
- require_once(dirname(__FILE__) . "/../ConsumerStrategies/SocketConsumer.php");
6
-
7
- if (!function_exists('json_encode')) {
8
- throw new Exception('The JSON PHP extension is required.');
9
- }
10
-
11
- /**
12
- * Provides some base methods for use by a message Producer
13
- */
14
- abstract class Producers_MixpanelBaseProducer extends Base_MixpanelBase {
15
-
16
-
17
- /**
18
- * @var string a token associated to a Mixpanel project
19
- */
20
- protected $_token;
21
-
22
-
23
- /**
24
- * @var array a queue to hold messages in memory before flushing in batches
25
- */
26
- private $_queue = array();
27
-
28
-
29
- /**
30
- * @var ConsumerStrategies_AbstractConsumer the consumer to use when flushing messages
31
- */
32
- private $_consumer = null;
33
-
34
-
35
- /**
36
- * @var array The list of available consumers
37
- */
38
- private $_consumers = array(
39
- "file" => "ConsumerStrategies_FileConsumer",
40
- "curl" => "ConsumerStrategies_CurlConsumer",
41
- "socket" => "ConsumerStrategies_SocketConsumer"
42
- );
43
-
44
-
45
- /**
46
- * If the queue reaches this size we'll auto-flush to prevent out of memory errors
47
- * @var int
48
- */
49
- protected $_max_queue_size = 1000;
50
-
51
-
52
- /**
53
- * Creates a new MixpanelBaseProducer, assings Mixpanel project token, registers custom Consumers, and instantiates
54
- * the desired consumer
55
- * @param $token
56
- * @param array $options
57
- */
58
- public function __construct($token, $options = array()) {
59
-
60
- parent::__construct($options);
61
-
62
- // register any customer consumers
63
- if (array_key_exists("consumers", $options)) {
64
- $this->_consumers = array_merge($this->_consumers, $options['consumers']);
65
- }
66
-
67
- // set max queue size
68
- if (array_key_exists("max_queue_size", $options)) {
69
- $this->_max_queue_size = $options['max_queue_size'];
70
- }
71
-
72
- // associate token
73
- $this->_token = $token;
74
-
75
- if ($this->_debug()) {
76
- $this->_log("Using token: ".$this->_token);
77
- }
78
-
79
- // instantiate the chosen consumer
80
- $this->_consumer = $this->_getConsumer();
81
-
82
- }
83
-
84
-
85
- /**
86
- * Flush the queue when we destruct the client with retries
87
- */
88
- public function __destruct() {
89
- $attempts = 0;
90
- $max_attempts = 10;
91
- $success = false;
92
- while (!$success && $attempts < $max_attempts) {
93
- if ($this->_debug()) {
94
- $this->_log("destruct flush attempt #".($attempts+1));
95
- }
96
- $success = $this->flush();
97
- $attempts++;
98
- }
99
- }
100
-
101
-
102
- /**
103
- * Iterate the queue and write in batches using the instantiated Consumer Strategy
104
- * @param int $desired_batch_size
105
- * @return bool whether or not the flush was successful
106
- */
107
- public function flush($desired_batch_size = 50) {
108
- $queue_size = count($this->_queue);
109
- $succeeded = true;
110
- if ($this->_debug()) {
111
- $this->_log("Flush called - queue size: ".$queue_size);
112
- }
113
-
114
- while($queue_size > 0 && $succeeded) {
115
- $batch_size = min(array($queue_size, $desired_batch_size, $this->_options['max_batch_size']));
116
- $batch = array_splice($this->_queue, 0, $batch_size);
117
- $succeeded = $this->_persist($batch);
118
-
119
- if (!$succeeded) {
120
- if ($this->_debug()) {
121
- $this->_log("Batch consumption failed!");
122
- }
123
- $this->_queue = array_merge($batch, $this->_queue);
124
-
125
- if ($this->_debug()) {
126
- $this->_log("added batch back to queue, queue size is now $queue_size");
127
- }
128
- }
129
-
130
- $queue_size = count($this->_queue);
131
-
132
- if ($this->_debug()) {
133
- $this->_log("Batch of $batch_size consumed, queue size is now $queue_size");
134
- }
135
- }
136
- return $succeeded;
137
- }
138
-
139
-
140
- /**
141
- * Empties the queue without persisting any of the messages
142
- */
143
- public function reset() {
144
- $this->_queue = array();
145
- }
146
-
147
-
148
- /**
149
- * Returns the in-memory queue
150
- * @return array
151
- */
152
- public function getQueue() {
153
- return $this->_queue;
154
- }
155
-
156
- /**
157
- * Returns the current Mixpanel project token
158
- * @return string
159
- */
160
- public function getToken() {
161
- return $this->_token;
162
- }
163
-
164
-
165
- /**
166
- * Given a strategy type, return a new PersistenceStrategy object
167
- * @return ConsumerStrategies_AbstractConsumer
168
- */
169
- protected function _getConsumer() {
170
- $key = $this->_options['consumer'];
171
- $Strategy = $this->_consumers[$key];
172
- if ($this->_debug()) {
173
- $this->_log("Using consumer: " . $key . " -> " . $Strategy);
174
- }
175
- $this->_options['endpoint'] = $this->_getEndpoint();
176
-
177
- return new $Strategy($this->_options);
178
- }
179
-
180
-
181
- /**
182
- * Add an array representing a message to be sent to Mixpanel to a queue.
183
- * @param array $message
184
- */
185
- public function enqueue($message = array()) {
186
- array_push($this->_queue, $message);
187
-
188
- // force a flush if we've reached our threshold
189
- if (count($this->_queue) > $this->_max_queue_size) {
190
- $this->flush();
191
- }
192
-
193
- if ($this->_debug()) {
194
- $this->_log("Queued message: ".json_encode($message));
195
- }
196
- }
197
-
198
-
199
- /**
200
- * Add an array representing a list of messages to be sent to Mixpanel to a queue.
201
- * @param array $messages
202
- */
203
- public function enqueueAll($messages = array()) {
204
- foreach($messages as $message) {
205
- $this->enqueue($message);
206
- }
207
-
208
- }
209
-
210
-
211
- /**
212
- * Given an array of messages, persist it with the instantiated Persistence Strategy
213
- * @param $message
214
- * @return mixed
215
- */
216
- protected function _persist($message) {
217
- return $this->_consumer->persist($message);
218
- }
219
-
220
-
221
-
222
-
223
- /**
224
- * Return the endpoint that should be used by a consumer that consumes messages produced by this producer.
225
- * @return string
226
- */
227
- abstract function _getEndpoint();
228
-
229
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/models/classes/lib/Producers/MixpanelEvents.php DELETED
@@ -1,164 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/MixpanelBaseProducer.php");
3
- require_once(dirname(__FILE__) . "/MixpanelPeople.php");
4
- require_once(dirname(__FILE__) . "/../ConsumerStrategies/CurlConsumer.php");
5
-
6
- /**
7
- * Provides an API to track events on Mixpanel
8
- */
9
- class Producers_MixpanelEvents extends Producers_MixpanelBaseProducer {
10
-
11
- /**
12
- * An array of properties to attach to every tracked event
13
- * @var array
14
- */
15
- private $_super_properties = array("mp_lib" => "php");
16
-
17
-
18
- /**
19
- * Track an event defined by $event associated with metadata defined by $properties
20
- * @param string $event
21
- * @param array $properties
22
- */
23
- public function track($event, $properties = array()) {
24
-
25
- // if no token is passed in, use current token
26
- if (!array_key_exists("token", $properties)) $properties['token'] = $this->_token;
27
-
28
- // if no time is passed in, use the current time
29
- if (!array_key_exists('time', $properties)) $properties['time'] = time();
30
-
31
- $params['event'] = $event;
32
- $params['properties'] = array_merge($this->_super_properties, $properties);
33
-
34
- $this->enqueue($params);
35
- }
36
-
37
-
38
- /**
39
- * Register a property to be sent with every event. If the property has already been registered, it will be
40
- * overwritten.
41
- * @param string $property
42
- * @param mixed $value
43
- */
44
- public function register($property, $value) {
45
- $this->_super_properties[$property] = $value;
46
- }
47
-
48
-
49
- /**
50
- * Register multiple properties to be sent with every event. If any of the properties have already been registered,
51
- * they will be overwritten.
52
- * @param array $props_and_vals
53
- */
54
- public function registerAll($props_and_vals = array()) {
55
- foreach($props_and_vals as $property => $value) {
56
- $this->register($property, $value);
57
- }
58
- }
59
-
60
-
61
- /**
62
- * Register a property to be sent with every event. If the property has already been registered, it will NOT be
63
- * overwritten.
64
- * @param $property
65
- * @param $value
66
- */
67
- public function registerOnce($property, $value) {
68
- if (!isset($this->_super_properties[$property])) {
69
- $this->register($property, $value);
70
- }
71
- }
72
-
73
-
74
- /**
75
- * Register multiple properties to be sent with every event. If any of the properties have already been registered,
76
- * they will NOT be overwritten.
77
- * @param array $props_and_vals
78
- */
79
- public function registerAllOnce($props_and_vals = array()) {
80
- foreach($props_and_vals as $property => $value) {
81
- if (!isset($this->_super_properties[$property])) {
82
- $this->register($property, $value);
83
- }
84
- }
85
- }
86
-
87
-
88
- /**
89
- * Un-register an property to be sent with every event.
90
- * @param string $property
91
- */
92
- public function unregister($property) {
93
- unset($this->_super_properties[$property]);
94
- }
95
-
96
-
97
- /**
98
- * Un-register a list of properties to be sent with every event.
99
- * @param array $properties
100
- */
101
- public function unregisterAll($properties) {
102
- foreach($properties as $property) {
103
- $this->unregister($property);
104
- }
105
- }
106
-
107
-
108
- /**
109
- * Get a property that is set to be sent with every event
110
- * @param string $property
111
- * @return mixed
112
- */
113
- public function getProperty($property) {
114
- return $this->_super_properties[$property];
115
- }
116
-
117
-
118
- /**
119
- * Identify the user you want to associate to tracked events
120
- * @param string|int $user_id
121
- */
122
- public function identify($user_id) {
123
- $this->register("distinct_id", $user_id);
124
- }
125
-
126
-
127
- /**
128
- * Alias an existing id with a different unique id. This is helpful when you want to associate a generated id to
129
- * a username or e-mail address.
130
- *
131
- * Because aliasing can be extremely vulnerable to race conditions and ordering issues, we'll make a synchronous
132
- * call directly to Mixpanel when this method is called. If it fails we'll throw an Exception as subsequent
133
- * events are likely to be incorrectly tracked.
134
- * @param string|int $original_id
135
- * @param string|int $new_id
136
- * @return array $msg
137
- * @throws Exception
138
- */
139
- public function createAlias($original_id, $new_id) {
140
- $msg = array(
141
- "event" => '$create_alias',
142
- "properties" => array("distinct_id" => $original_id, "alias" => $new_id, "token" => $this->_token)
143
- );
144
-
145
- $options = array_merge($this->_options, array("endpoint" => $this->_getEndpoint(), "fork" => false));
146
- $curlConsumer = new ConsumerStrategies_CurlConsumer($options);
147
- $success = $curlConsumer->persist(array($msg));
148
- if (!$success) {
149
- error_log("Creating Mixpanel Alias (original id: $original_id, new id: $new_id) failed");
150
- throw new Exception("Tried to create an alias but the call was not successful");
151
- } else {
152
- return $msg;
153
- }
154
- }
155
-
156
-
157
- /**
158
- * Returns the "events" endpoint
159
- * @return string
160
- */
161
- function _getEndpoint() {
162
- return $this->_options['events_endpoint'];
163
- }
164
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/models/classes/lib/Producers/MixpanelPeople.php DELETED
@@ -1,147 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/MixpanelBaseProducer.php");
3
-
4
- /**
5
- * Provides an API to create/update profiles on Mixpanel
6
- */
7
- class Producers_MixpanelPeople extends Producers_MixpanelBaseProducer {
8
-
9
- /**
10
- * Internal method to prepare a message given the message data
11
- * @param $distinct_id
12
- * @param $operation
13
- * @param $value
14
- * @param null $ip
15
- * @return array
16
- */
17
- private function _constructPayload($distinct_id, $operation, $value, $ip = null, $ignore_time = false) {
18
- $payload = array(
19
- '$token' => $this->_token,
20
- '$distinct_id' => $distinct_id,
21
- $operation => $value
22
- );
23
- if ($ip !== null) $payload['$ip'] = $ip;
24
- if ($ignore_time === true) $payload['$ignore_time'] = true;
25
- return $payload;
26
- }
27
-
28
- /**
29
- * Set properties on a user record. If the profile does not exist, it creates it with these properties.
30
- * If it does exist, it sets the properties to these values, overwriting existing values.
31
- * @param string|int $distinct_id the distinct_id or alias of a user
32
- * @param array $props associative array of properties to set on the profile
33
- * @param string|null $ip the ip address of the client (used for geo-location)
34
- * @param boolean $ignore_time If the $ignore_time property is true, Mixpanel will not automatically update the "Last Seen" property of the profile. Otherwise, Mixpanel will add a "Last Seen" property associated with the current time
35
- */
36
- public function set($distinct_id, $props, $ip = null, $ignore_time = false) {
37
- $payload = $this->_constructPayload($distinct_id, '$set', $props, $ip, $ignore_time);
38
- $this->enqueue($payload);
39
- }
40
-
41
- /**
42
- * Set properties on a user record. If the profile does not exist, it creates it with these properties.
43
- * If it does exist, it sets the properties to these values but WILL NOT overwrite existing values.
44
- * @param string|int $distinct_id the distinct_id or alias of a user
45
- * @param array $props associative array of properties to set on the profile
46
- * @param string|null $ip the ip address of the client (used for geo-location)
47
- * @param boolean $ignore_time If the $ignore_time property is true, Mixpanel will not automatically update the "Last Seen" property of the profile. Otherwise, Mixpanel will add a "Last Seen" property associated with the current time
48
- */
49
- public function setOnce($distinct_id, $props, $ip = null, $ignore_time = false) {
50
- $payload = $this->_constructPayload($distinct_id, '$set_once', $props, $ip, $ignore_time);
51
- $this->enqueue($payload);
52
- }
53
-
54
- /**
55
- * Unset properties on a user record. If the profile does not exist, it creates it with no properties.
56
- * If it does exist, it unsets these properties. NOTE: In other libraries we use 'unset' which is
57
- * a reserved word in PHP.
58
- * @param string|int $distinct_id the distinct_id or alias of a user
59
- * @param array $props associative array of properties to unset on the profile
60
- * @param string|null $ip the ip address of the client (used for geo-location)
61
- * @param boolean $ignore_time If the $ignore_time property is true, Mixpanel will not automatically update the "Last Seen" property of the profile. Otherwise, Mixpanel will add a "Last Seen" property associated with the current time
62
- */
63
- public function remove($distinct_id, $props, $ip = null, $ignore_time = false) {
64
- $payload = $this->_constructPayload($distinct_id, '$unset', $props, $ip, $ignore_time);
65
- $this->enqueue($payload);
66
- }
67
-
68
- /**
69
- * Increments the value of a property on a user record. If the profile does not exist, it creates it and sets the
70
- * property to the increment value.
71
- * @param string|int $distinct_id the distinct_id or alias of a user
72
- * @param $prop string the property to increment
73
- * @param int $val the amount to increment the property by
74
- * @param string|null $ip the ip address of the client (used for geo-location)
75
- * @param boolean $ignore_time If the $ignore_time property is true, Mixpanel will not automatically update the "Last Seen" property of the profile. Otherwise, Mixpanel will add a "Last Seen" property associated with the current time
76
- */
77
- public function increment($distinct_id, $prop, $val, $ip = null, $ignore_time = false) {
78
- $payload = $this->_constructPayload($distinct_id, '$add', array("$prop" => $val), $ip, $ignore_time);
79
- $this->enqueue($payload);
80
- }
81
-
82
- /**
83
- * Adds $val to a list located at $prop. If the property does not exist, it will be created. If $val is a string
84
- * and the list is empty or does not exist, a new list with one value will be created.
85
- * @param string|int $distinct_id the distinct_id or alias of a user
86
- * @param string $prop the property that holds the list
87
- * @param string|array $val items to add to the list
88
- * @param string|null $ip the ip address of the client (used for geo-location)
89
- * @param boolean $ignore_time If the $ignore_time property is true, Mixpanel will not automatically update the "Last Seen" property of the profile. Otherwise, Mixpanel will add a "Last Seen" property associated with the current time
90
- */
91
- public function append($distinct_id, $prop, $val, $ip = null, $ignore_time = false) {
92
- $operation = gettype($val) == "array" ? '$union' : '$append';
93
- $payload = $this->_constructPayload($distinct_id, $operation, array("$prop" => $val), $ip, $ignore_time);
94
- $this->enqueue($payload);
95
- }
96
-
97
- /**
98
- * Adds a transaction to the user's profile for revenue tracking
99
- * @param string|int $distinct_id the distinct_id or alias of a user
100
- * @param string $amount the transaction amount e.g. "20.50"
101
- * @param null $timestamp the timestamp of when the transaction occurred (default to current timestamp)
102
- * @param string|null $ip the ip address of the client (used for geo-location)
103
- * @param boolean $ignore_time If the $ignore_time property is true, Mixpanel will not automatically update the "Last Seen" property of the profile. Otherwise, Mixpanel will add a "Last Seen" property associated with the current time
104
- */
105
- public function trackCharge($distinct_id, $amount, $timestamp = null, $ip = null, $ignore_time = false) {
106
- $timestamp = $timestamp == null ? time() : $timestamp;
107
- $date_iso = date("c", $timestamp);
108
- $transaction = array(
109
- '$time' => $date_iso,
110
- '$amount' => $amount
111
- );
112
- $val = array('$transactions' => $transaction);
113
- $payload = $this->_constructPayload($distinct_id, '$append', $val, $ip, $ignore_time);
114
- $this->enqueue($payload);
115
- }
116
-
117
- /**
118
- * Clear all transactions stored on a user's profile
119
- * @param string|int $distinct_id the distinct_id or alias of a user
120
- * @param string|null $ip the ip address of the client (used for geo-location)
121
- * @param boolean $ignore_time If the $ignore_time property is true, Mixpanel will not automatically update the "Last Seen" property of the profile. Otherwise, Mixpanel will add a "Last Seen" property associated with the current time
122
- */
123
- public function clearCharges($distinct_id, $ip = null, $ignore_time = false) {
124
- $payload = $this->_constructPayload($distinct_id, '$set', array('$transactions' => array()), $ip, $ignore_time);
125
- $this->enqueue($payload);
126
- }
127
-
128
- /**
129
- * Delete this profile from Mixpanel
130
- * @param string|int $distinct_id the distinct_id or alias of a user
131
- * @param string|null $ip the ip address of the client (used for geo-location)
132
- * @param boolean $ignore_time If the $ignore_time property is true, Mixpanel will not automatically update the "Last Seen" property of the profile. Otherwise, Mixpanel will add a "Last Seen" property associated with the current time
133
- */
134
- public function deleteUser($distinct_id, $ip = null, $ignore_time = false) {
135
- $payload = $this->_constructPayload($distinct_id, '$delete', "", $ip, $ignore_time);
136
- $this->enqueue($payload);
137
- }
138
-
139
- /**
140
- * Returns the "engage" endpoint
141
- * @return string
142
- */
143
- function _getEndpoint() {
144
- return $this->_options['people_endpoint'];
145
- }
146
-
147
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/supsystic_promo/models/supsystic_promo.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
  class supsystic_promoModelPps extends modelPps {
3
  private $_apiUrl = '';
4
- private $_bigCli = null;
5
  private function _getApiUrl() {
6
  if(empty($this->_apiUrl)) {
7
  $this->_initApiUrl();
@@ -118,64 +117,4 @@ class supsystic_promoModelPps extends modelPps {
118
  $this->setTourHst( $hst );
119
  $this->saveUsageStat('tour_finished_on_'. $pointKey);
120
  }
121
- private function _getBigStatClient() {
122
- if(!$this->_bigCli) {
123
- if(!class_exists('Mixpanel')) {
124
- require_once($this->getModule()->getModDir(). 'models'. DS. 'classes'. DS. 'lib'. DS. 'Mixpanel.php');
125
- }
126
- $opts = array();
127
- if(!function_exists('curl_init')) {
128
- $opts['consumer'] = 'socket';
129
- }
130
- if(class_exists('Mixpanel')) {
131
- $this->_bigCli = Mixpanel::getInstance("3cc36628768f1f84d4c6980d09ced036", $opts);
132
- /*$bigCliId = (int) get_option(PPS_CODE. '_big_cli_id');
133
- if(!$bigCliId) {
134
- $bigCliId = mt_rand(1, 9999999999);
135
- update_option(PPS_CODE. '_big_cli_id', $bigCliId);
136
- }
137
- $this->_bigCli->identify( $bigCliId );*/
138
- }
139
- }
140
- return $this->_bigCli;
141
- }
142
- public function bigStatAdd( $key, $properties = array() ) {
143
- if(function_exists('json_encode')) {
144
- $this->_getBigStatClient();
145
- if($this->_bigCli) {
146
- $this->_bigCli->track( $key, $properties );
147
- }
148
- }
149
- }
150
- public function bigStatAddCheck( $key, $properties = array() ) {
151
- $canSend = (int) framePps::_()->getModule('options')->get('send_stats');
152
- if( $canSend ) {
153
- $this->bigStatAdd( $key, $properties );
154
- }
155
- }
156
- public function saveDeactivateData( $d ) {
157
- $deactivateParams = array();
158
- $reasonsLabels = array(
159
- 'not_working' => 'Not working',
160
- 'found_better' => 'Found better',
161
- 'not_need' => 'Not need',
162
- 'temporary' => 'Temporary',
163
- 'other' => 'Other',
164
- );
165
- $deactivateParams['Reason'] = isset($d['deactivate_reason']) && $d['deactivate_reason']
166
- ? $reasonsLabels[ $d['deactivate_reason'] ]
167
- : 'No reason';
168
- if(isset($d['deactivate_reason']) && $d['deactivate_reason']) {
169
- switch( $d['deactivate_reason'] ) {
170
- case 'found_better':
171
- $deactivateParams['Better plugin'] = $d['better_plugin'];
172
- break;
173
- case 'other':
174
- $deactivateParams['Other'] = $d['other'];
175
- break;
176
- }
177
- }
178
- $this->bigStatAdd('Deactivated', $deactivateParams);
179
- return true;
180
- }
181
  }
1
  <?php
2
  class supsystic_promoModelPps extends modelPps {
3
  private $_apiUrl = '';
 
4
  private function _getApiUrl() {
5
  if(empty($this->_apiUrl)) {
6
  $this->_initApiUrl();
117
  $this->setTourHst( $hst );
118
  $this->saveUsageStat('tour_finished_on_'. $pointKey);
119
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  }
modules/supsystic_promo/views/supsystic_promo.php CHANGED
@@ -148,7 +148,4 @@ Here you can edit css style of the pop-up window.', PPS_LANG_CODE),
148
  $this->assign('bundleUrl', $siteUrl. 'product/plugins-bundle/'. '?utm_source=plugin&utm_medium=featured_plugins&utm_campaign='. $promoCampaign);
149
  return parent::getContent('featuredPlugins');
150
  }
151
- public function getPluginDeactivation() {
152
- return parent::getContent('pluginDeactivation');
153
- }
154
  }
148
  $this->assign('bundleUrl', $siteUrl. 'product/plugins-bundle/'. '?utm_source=plugin&utm_medium=featured_plugins&utm_campaign='. $promoCampaign);
149
  return parent::getContent('featuredPlugins');
150
  }
 
 
 
151
  }
modules/supsystic_promo/views/tpl/featuredPlugins.php CHANGED
@@ -1,41 +1,41 @@
1
- <section id="supsystic-featured-plugins" class="supsystic-item supsystic-panel">
2
- <div class="supsysticPageBundleContainer container-fluid">
3
- <div class="bundle-text col-md-7 col-xs-12"><?php _e('Get plugins bundle today and save over 80%', PPS_LANG_CODE)?></div>
4
- <div class="bundle-btn col-md-5 col-xs-12">
5
- <a href="<?php echo $this->bundleUrl;?>" class="btn btn-full btn-revert hvr-shutter-out-horizontal" target="_blank">
6
- <?php _e('Check It out', PPS_LANG_CODE)?>
7
- </a>
8
- </div>
9
- </div>
10
- <hr />
11
- <?php foreach($this->pluginsList as $p) { ?>
12
- <div class="catitem col-md-4 col-sm-6 col-xs-12">
13
- <div class="download-product-item">
14
- <div class="dp-thumb text-center">
15
- <a href="<?php echo $p['url']?>" target="_blank">
16
- <img src="<?php echo $p['img']?>" class="img-responsive wp-post-image" alt="<?php echo $p['label']?>" />
17
- </a>
18
- </div>
19
- <div class="dp-title">
20
- <a href="<?php echo $p['url']?>" target="_blank">
21
- <?php echo $p['label']?>
22
- </a>
23
- </div>
24
- <div class="dp-excerpt">
25
- <div class="dp-excerpt-wrapper">
26
- <?php echo $p['desc']?>
27
- </div>
28
- </div>
29
- <div class="dp-buttons">
30
- <a href="<?php echo $p['url']?>" target="_blank" class="btn btn-full hvr-shutter-out-horizontal">
31
- <?php _e('More info', PPS_LANG_CODE)?>
32
- </a>
33
- <a href="<?php echo $p['download']?>" target="_blank" class="btn btn-full btn-info hvr-shutter-out-horizontal">
34
- <?php _e('Download', PPS_LANG_CODE)?>
35
- </a>
36
- </div>
37
- </div>
38
- </div>
39
- <?php }?>
40
- <div style="clear: both;"></div>
41
- </section>
1
+ <section id="supsystic-featured-plugins" class="supsystic-item supsystic-panel">
2
+ <div class="supsysticPageBundleContainer container-fluid">
3
+ <div class="bundle-text col-md-7 col-xs-12"><?php _e('Get plugins bundle today and save over 80%', PPS_LANG_CODE)?></div>
4
+ <div class="bundle-btn col-md-5 col-xs-12">
5
+ <a href="<?php echo $this->bundleUrl;?>" class="btn btn-full btn-revert hvr-shutter-out-horizontal" target="_blank">
6
+ <?php _e('Check It out', PPS_LANG_CODE)?>
7
+ </a>
8
+ </div>
9
+ </div>
10
+ <hr />
11
+ <?php foreach($this->pluginsList as $p) { ?>
12
+ <div class="catitem col-md-4 col-sm-6 col-xs-12">
13
+ <div class="download-product-item">
14
+ <div class="dp-thumb text-center">
15
+ <a href="<?php echo $p['url']?>" target="_blank">
16
+ <img src="<?php echo $p['img']?>" class="img-responsive wp-post-image" alt="<?php echo $p['label']?>" />
17
+ </a>
18
+ </div>
19
+ <div class="dp-title">
20
+ <a href="<?php echo $p['url']?>" target="_blank">
21
+ <?php echo $p['label']?>
22
+ </a>
23
+ </div>
24
+ <div class="dp-excerpt">
25
+ <div class="dp-excerpt-wrapper">
26
+ <?php echo $p['desc']?>
27
+ </div>
28
+ </div>
29
+ <div class="dp-buttons">
30
+ <a href="<?php echo $p['url']?>" target="_blank" class="btn btn-full hvr-shutter-out-horizontal">
31
+ <?php _e('More info', PPS_LANG_CODE)?>
32
+ </a>
33
+ <a href="<?php echo $p['download']?>" target="_blank" class="btn btn-full btn-info hvr-shutter-out-horizontal">
34
+ <?php _e('Download', PPS_LANG_CODE)?>
35
+ </a>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ <?php }?>
40
+ <div style="clear: both;"></div>
41
+ </section>
modules/supsystic_promo/views/tpl/pluginDeactivation.php DELETED
@@ -1,78 +0,0 @@
1
- <style type="text/css">
2
- .ppsDeactivateDescShell {
3
- display: none;
4
- margin-left: 25px;
5
- margin-top: 5px;
6
- }
7
- .ppsDeactivateReasonShell {
8
- display: block;
9
- margin-bottom: 10px;
10
- }
11
- #ppsDeactivateWnd input[type="text"],
12
- #ppsDeactivateWnd textarea {
13
- width: 100%;
14
- }
15
- #ppsDeactivateWnd h4 {
16
- line-height: 1.53em;
17
- }
18
- #ppsDeactivateWnd + .ui-dialog-buttonpane .ui-dialog-buttonset {
19
- float: none;
20
- }
21
- .ppsDeactivateSkipDataBtn {
22
- float: right;
23
- margin-top: 15px;
24
- text-decoration: none;
25
- color: #777 !important;
26
- }
27
- </style>
28
- <div id="ppsDeactivateWnd" style="display: none;" title="<?php _e('Your Feedback', PPS_LANG_CODE)?>">
29
- <h4><?php printf(__('If you have a moment, please share why you are deactivating %s', PPS_LANG_CODE), PPS_WP_PLUGIN_NAME)?></h4>
30
- <form id="ppsDeactivateForm">
31
- <label class="ppsDeactivateReasonShell">
32
- <?php echo htmlPps::radiobutton('deactivate_reason', array(
33
- 'value' => 'not_working',
34
- ))?>
35
- <?php _e('Couldn\'t get the plugin to work', PPS_LANG_CODE)?>
36
- <div class="ppsDeactivateDescShell">
37
- <?php printf(__('If you have a question, <a href="%s" target="_blank">contact us</a> and will do our best to help you'), 'https://supsystic.com/contact-us/?utm_source=plugin&utm_medium=deactivated_contact&utm_campaign=popup')?>
38
- </div>
39
- </label>
40
- <label class="ppsDeactivateReasonShell">
41
- <?php echo htmlPps::radiobutton('deactivate_reason', array(
42
- 'value' => 'found_better',
43
- ))?>
44
- <?php _e('I found a better plugin', PPS_LANG_CODE)?>
45
- <div class="ppsDeactivateDescShell">
46
- <?php echo htmlPps::text('better_plugin', array(
47
- 'placeholder' => __('If it\'s possible, specify plugin name', PPS_LANG_CODE),
48
- ))?>
49
- </div>
50
- </label>
51
- <label class="ppsDeactivateReasonShell">
52
- <?php echo htmlPps::radiobutton('deactivate_reason', array(
53
- 'value' => 'not_need',
54
- ))?>
55
- <?php _e('I no longer need the plugin', PPS_LANG_CODE)?>
56
- </label>
57
- <label class="ppsDeactivateReasonShell">
58
- <?php echo htmlPps::radiobutton('deactivate_reason', array(
59
- 'value' => 'temporary',
60
- ))?>
61
- <?php _e('It\'s a temporary deactivation', PPS_LANG_CODE)?>
62
- </label>
63
- <label class="ppsDeactivateReasonShell">
64
- <?php echo htmlPps::radiobutton('deactivate_reason', array(
65
- 'value' => 'other',
66
- ))?>
67
- <?php _e('Other', PPS_LANG_CODE)?>
68
- <div class="ppsDeactivateDescShell">
69
- <?php echo htmlPps::text('other', array(
70
- 'placeholder' => __('What is the reason?', PPS_LANG_CODE),
71
- ))?>
72
- </div>
73
- </label>
74
- <?php echo htmlPps::hidden('mod', array('value' => 'supsystic_promo'))?>
75
- <?php echo htmlPps::hidden('action', array('value' => 'saveDeactivateData'))?>
76
- </form>
77
- <a href="" class="ppsDeactivateSkipDataBtn"><?php _e('Skip & Deactivate', PPS_LANG_CODE)?></a>
78
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
modules/templates/mod.php CHANGED
@@ -86,7 +86,6 @@ class templatesPps extends modulePps {
86
  );
87
  if(is_admin()) {
88
  $jsData['isPro'] = framePps::_()->getModule('supsystic_promo')->isPro();
89
- $jsData['mainLink'] = framePps::_()->getModule('supsystic_promo')->getMainLink();
90
  }
91
  $jsData = dispatcherPps::applyFilters('jsInitVariables', $jsData);
92
  framePps::_()->addJSVar('corePps', 'PPS_DATA', $jsData);
86
  );
87
  if(is_admin()) {
88
  $jsData['isPro'] = framePps::_()->getModule('supsystic_promo')->isPro();
 
89
  }
90
  $jsData = dispatcherPps::applyFilters('jsInitVariables', $jsData);
91
  framePps::_()->addJSVar('corePps', 'PPS_DATA', $jsData);
pps.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Popup by Supsystic
4
  * Plugin URI: https://supsystic.com/plugins/popup-plugin/
5
  * Description: The Best WordPress popup plugin to help you gain more subscribers, social followers or advertisement. Responsive popups with friendly options
6
- * Version: 1.9.3
7
  * Author: supsystic.com
8
  * Author URI: https://supsystic.com
9
  **/
3
  * Plugin Name: Popup by Supsystic
4
  * Plugin URI: https://supsystic.com/plugins/popup-plugin/
5
  * Description: The Best WordPress popup plugin to help you gain more subscribers, social followers or advertisement. Responsive popups with friendly options
6
+ * Version: 1.9.1
7
  * Author: supsystic.com
8
  * Author URI: https://supsystic.com
9
  **/
readme.txt CHANGED
@@ -2,29 +2,18 @@
2
  Contributors: supsystic.com
3
  Donate link: https://supsystic.com/plugins/popup-plugin
4
  Tags: popup, full screen popup, html popup, wordpress popup, popup contact form, popup builder, modal popup, video popup, youtube popup, social popup, facebook popup, christmas
5
- Tested up to: 4.7.4
6
- Stable tag: 1.9.3
7
 
8
- Popup by Supsystic the best way to convert visitors into subscribers, followers & customers. Create any type of popup with popup builder templates
9
 
10
  == Description ==
11
 
12
- [Popup by Supsystic](https://supsystic.com/plugins/popup-plugin?utm_source=wordpress&utm_medium=description&utm_campaign=popup "Popup WordPress Plugin") with Popup Builder help you to get newsletter subscribers, promote new products, deliver special offers and get more social followers. Popup maker loaded with full range of features:
13
 
14
- = Main Features =
15
-
16
- * 30+ Mobile-ready [Popup Templates](https://supsystic.com/popup-examples/ "WordPress Plugin Popup Templates")
17
- * [Popup Triggers](https://supsystic.com/displaying-popup-configuration/ "Popup Triggers"). When to show / close popup, whom to show, show on next pages, time to display
18
- * Different Popup types
19
- * [Popup Placement](https://supsystic.com/popup-placement/ "Popup Placement"). Modal Popup, Fullscreen Popup, Info Bar, Fly-in, Slide In Popup
20
-
21
- = More Popup Options =
22
 
23
- * [Optin, Social and Link Locks](https://supsystic.com/lock-content/ "Content Lock")
24
- * Subscription Services Integration (WordPress, MailChimp, Aweber and more)
25
- * [A/B Split Tests](https://supsystic.com/what-is-ab-testing/ "A / B Split Test")
26
- * [Real Time Statistic](https://supsystic.com/statistics/ "Real Time Popup Statistic")
27
- * [20+ Popup Opening Animations](https://supsystic.com/popup-opening-animations/ "Popup Openin Animation")
28
 
29
  Popup types:
30
 
@@ -38,9 +27,24 @@ Popup types:
38
  * [Notification Bar](https://supsystic.com/plugins/popup-plugin/#ppsShowPopUp_157 "Notification Bar")
39
  * [Age Verivication](https://supsystic.com/plugins/popup-plugin/#ppsShowPopUp_158 "Age Verification Popup")
40
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  = Popup Builder =
42
 
43
- What makes people buy up? Firstly emotions. Use Popup builder to popup people's emotions and up your purchases. By Supsystic team Popup you can easily customize any popup window to your site design attracting users popuply. Popup plugin allows to create magnetizing popup by customizing sizes, attracting visitors attention to bonuses and discounts with popups. Many other various promotion offers becomes more effective by popouping them on the site.
44
 
45
  [youtube http://www.youtube.com/watch?v=-Q9-tWi-lQE]
46
 
@@ -220,21 +224,21 @@ Yes. Light compliant Popup plugin backup can close the Popup window, just set th
220
 
221
  == Screenshots ==
222
 
223
- 1. Subscription popup templates. All [Popup Examples](https://supsystic.com/popup-examples?utm_source=wordpress&utm_medium=second_screenshot&utm_campaign=popup "Popup Examples")
224
 
225
- 2. Facebook like popup
226
 
227
- 3. Popup with YouTube video
228
 
229
- 4. PopUp Login / Registration Style
230
 
231
- 5. PopUp with google map and contact form
232
 
233
- 6. Social Buttons and contact form with popup
234
 
235
- 7. [Popup WordPress plugin](https://supsystic.com/plugins/popup-plugin?utm_source=wordpress&utm_medium=first_screenshot&utm_campaign=popup "Popup WordPress plugin")
236
 
237
- 8. [Christmas popup templates pack](https://supsystic.com/blog/christmas-popup-templates-pack "Christmas popup templates")
238
 
239
  == Other Notes ==
240
 
@@ -267,7 +271,7 @@ Perform your site in candy attraction resource with Video Popup Builder features
267
  = Facebook Like Popup =
268
 
269
  More then 50% of population of the Earth is addicted to the internet and social share resources. Make them involved in your products/ services with Popup plugin. Or just become popular offering to share your site along the FB, Twitter, Linkedin etc. by Facebook Like Popup. Installing of the Popup Builder doesn’t take much time or effort than to drink coffee or tea.
270
- Facebook Like Popup is the most gentle way to welcome your visitors for website interaction. Try simple Facebook Like Popup by Supsystic in the box to show your social sites profile.
271
 
272
  = Age Verification Popup =
273
 
@@ -275,17 +279,6 @@ Working with adult site content, sometimes is needed to be sure kids not watchin
275
 
276
  == Changelog ==
277
 
278
- = 1.9.3 / 24.04.2017
279
- * Additional feedback improvements
280
- * Fix issue with some non-latin characters in PopUp Labels
281
- * Additional core improvements
282
-
283
- = 1.9.2 / 19.04.2017
284
- * Added Age Verification templates detailed statistics
285
- * Fixed issue with propagandizing cached stats for AB Test PopUps
286
- * Fix small issue with ConstantContact subscribe service
287
- * Core code improvements and minor issues fix
288
-
289
  = 1.9.1 / 11.04.2017
290
  * ActiveCampaign - fix Tags functionality
291
  * Minor issues fix
2
  Contributors: supsystic.com
3
  Donate link: https://supsystic.com/plugins/popup-plugin
4
  Tags: popup, full screen popup, html popup, wordpress popup, popup contact form, popup builder, modal popup, video popup, youtube popup, social popup, facebook popup, christmas
5
+ Tested up to: 4.7.3
6
+ Stable tag: 1.9.1
7
 
8
+ Popup by Supsystic the best way to convert visitors into subscribers, followers & customers. Create any type of popup with preset popup builder templates
9
 
10
  == Description ==
11
 
12
+ [Popup by Supsystic](https://supsystic.com/plugins/popup-plugin?utm_source=wordpress&utm_medium=description&utm_campaign=popup "Popup WordPress Plugin") get more newsletter subscribers, promote new products, deliver special offers anf get more social followers.
13
 
14
+ = Christmas special popup templates pack! =
 
 
 
 
 
 
 
15
 
16
+ Grab visitors attention with Christmas templates. The highest conversion with positive amotions. More about [Christmas popup templates](https://supsystic.com/blog/christmas-popup-templates-pack "Christmas popup templates").
 
 
 
 
17
 
18
  Popup types:
19
 
27
  * [Notification Bar](https://supsystic.com/plugins/popup-plugin/#ppsShowPopUp_157 "Notification Bar")
28
  * [Age Verivication](https://supsystic.com/plugins/popup-plugin/#ppsShowPopUp_158 "Age Verification Popup")
29
 
30
+ = Main Features =
31
+
32
+ * 30+ Mobile-ready [Popup Templates](https://supsystic.com/popup-examples/ "WordPress Plugin Popup Templates")
33
+ * [Popup Placement](https://supsystic.com/popup-placement/ "Popup Placement"). Modal Popup, Fullscreen Popup, Info Bar, Fly-in, Slide In Popup
34
+ * [Popup Triggers](https://supsystic.com/displaying-popup-configuration/ "Popup Triggers"). When to show / close popup, whom to show, show on next pages, time to display
35
+ * Different Popup types. Subscriptions, Contact Form, YouTube Popup, Google Maps, Full Screen, Image Popup, Login/Registration, Age Verification
36
+
37
+ = More Popup Options =
38
+
39
+ * [Optin, Social and Link Locks](https://supsystic.com/lock-content/ "Content Lock")
40
+ * Subscription Services Integration (WordPress, MailChimp, Aweber and more)
41
+ * [A/B Split Tests](https://supsystic.com/what-is-ab-testing/ "A / B Split Test")
42
+ * [Real Time Statistic](https://supsystic.com/statistics/ "Real Time Popup Statistic")
43
+ * [20+ Popup Opening Animations](https://supsystic.com/popup-opening-animations/ "Popup Openin Animation")
44
+
45
  = Popup Builder =
46
 
47
+ What makes people buy up? Firstly emotions. Use Popup builder to pop up people's emotions and up your purchases. By Supsystic team Popup you can easily customize any popup window to your site design attracting users popuply. Popup plugin allows to create magnetizing popup by customizing sizes, attracting visitors attention to bonuses and discounts with popups. Many other various promotion offers becomes more effective by popouping them on the site.
48
 
49
  [youtube http://www.youtube.com/watch?v=-Q9-tWi-lQE]
50
 
224
 
225
  == Screenshots ==
226
 
227
+ 1. [Christmas popup templates pack](https://supsystic.com/blog/christmas-popup-templates-pack "Christmas popup templates")
228
 
229
+ 2. Subscription popup templates. All [Popup Examples](https://supsystic.com/popup-examples?utm_source=wordpress&utm_medium=second_screenshot&utm_campaign=popup "Popup Examples")
230
 
231
+ 3. Facebook like popup
232
 
233
+ 4. popup with YouTube video
234
 
235
+ 5. PopUp Login / Registration Style
236
 
237
+ 6. PopUp with google map and contact form
238
 
239
+ 7. Social Buttons and contact form with popup
240
 
241
+ 8. [Popup WordPress plugin](https://supsystic.com/plugins/popup-plugin?utm_source=wordpress&utm_medium=first_screenshot&utm_campaign=popup "Popup WordPress plugin")
242
 
243
  == Other Notes ==
244
 
271
  = Facebook Like Popup =
272
 
273
  More then 50% of population of the Earth is addicted to the internet and social share resources. Make them involved in your products/ services with Popup plugin. Or just become popular offering to share your site along the FB, Twitter, Linkedin etc. by Facebook Like Popup. Installing of the Popup Builder doesn’t take much time or effort than to drink coffee or tea.
274
+ Facebook Like Popup is the most gentle way to welcome your visitors for website interaction.Try simple Facebook Like Popup by Supsystic in the box to show your social sites profile.
275
 
276
  = Age Verification Popup =
277
 
279
 
280
  == Changelog ==
281
 
 
 
 
 
 
 
 
 
 
 
 
282
  = 1.9.1 / 11.04.2017
283
  * ActiveCampaign - fix Tags functionality
284
  * Minor issues fix