Post SMTP Mailer/Email Log - Version 1.9.7

Version Description

  • 2019-02-17
  • New: Fallback Feature - Configure a backup SMTP when emails are failing.
  • New: WordPress Multisite compability - with global settings.
  • New: Email Log capability - give other user cheking the logs.
  • Fixed: compatibility with mailster plugin
  • Fixed: Mandrill exception bug - Thanks to Niels de Blaauw from Level-Level
Download this release

Release Info

Developer yehudah
Plugin Icon 128x128 Post SMTP Mailer/Email Log
Version 1.9.7
Comparing to
See all releases

Code changes from version 1.9.6 to 1.9.7

Postman/Postman-Configuration/PostmanConfigurationController.php CHANGED
@@ -197,14 +197,18 @@ class PostmanConfigurationController {
197
  PostmanViewController::outputChildPageHeader( __( 'Settings', Postman::TEXT_DOMAIN ), 'advanced_config' );
198
  print '<div id="config_tabs"><ul>';
199
  print sprintf( '<li><a href="#account_config">%s</a></li>', __( 'Account', Postman::TEXT_DOMAIN ) );
 
200
  print sprintf( '<li><a href="#message_config">%s</a></li>', __( 'Message', Postman::TEXT_DOMAIN ) );
201
  print sprintf( '<li><a href="#logging_config">%s</a></li>', __( 'Logging', Postman::TEXT_DOMAIN ) );
202
  print sprintf( '<li><a href="#advanced_options_config">%s</a></li>', __( 'Advanced', Postman::TEXT_DOMAIN ) );
203
  print sprintf( '<li><a href="#notifications">%s</a></li>', __( 'Notifications', Postman::TEXT_DOMAIN ) );
204
  print '</ul>';
 
205
  print '<form method="post" action="options.php">';
206
  // This prints out all hidden setting fields
207
  settings_fields( PostmanAdminController::SETTINGS_GROUP_NAME );
 
 
208
  print '<section id="account_config">';
209
  if ( sizeof( PostmanTransportRegistry::getInstance()->getTransports() ) > 1 ) {
210
  do_settings_sections( 'transport_options' );
@@ -230,6 +234,115 @@ class PostmanConfigurationController {
230
  do_settings_sections( PostmanMailgunTransport::MAILGUN_AUTH_OPTIONS );
231
  print '</div>';
232
  print '</section>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
  print '<section id="message_config">';
234
  do_settings_sections( PostmanAdminController::MESSAGE_SENDER_OPTIONS );
235
  do_settings_sections( PostmanAdminController::MESSAGE_FROM_OPTIONS );
197
  PostmanViewController::outputChildPageHeader( __( 'Settings', Postman::TEXT_DOMAIN ), 'advanced_config' );
198
  print '<div id="config_tabs"><ul>';
199
  print sprintf( '<li><a href="#account_config">%s</a></li>', __( 'Account', Postman::TEXT_DOMAIN ) );
200
+ print sprintf( '<li><a href="#fallback">%s</a></li>', __( 'Fallback', Postman::TEXT_DOMAIN ) );
201
  print sprintf( '<li><a href="#message_config">%s</a></li>', __( 'Message', Postman::TEXT_DOMAIN ) );
202
  print sprintf( '<li><a href="#logging_config">%s</a></li>', __( 'Logging', Postman::TEXT_DOMAIN ) );
203
  print sprintf( '<li><a href="#advanced_options_config">%s</a></li>', __( 'Advanced', Postman::TEXT_DOMAIN ) );
204
  print sprintf( '<li><a href="#notifications">%s</a></li>', __( 'Notifications', Postman::TEXT_DOMAIN ) );
205
  print '</ul>';
206
+
207
  print '<form method="post" action="options.php">';
208
  // This prints out all hidden setting fields
209
  settings_fields( PostmanAdminController::SETTINGS_GROUP_NAME );
210
+
211
+ // account_config
212
  print '<section id="account_config">';
213
  if ( sizeof( PostmanTransportRegistry::getInstance()->getTransports() ) > 1 ) {
214
  do_settings_sections( 'transport_options' );
234
  do_settings_sections( PostmanMailgunTransport::MAILGUN_AUTH_OPTIONS );
235
  print '</div>';
236
  print '</section>';
237
+ // end account config
238
+ ?>
239
+
240
+ <!-- Fallback Start -->
241
+ <section id="fallback">
242
+ <h2><?php esc_html_e( 'Failed emails fallback', Postman::TEXT_DOMAIN ); ?></h2>
243
+ <p><?php esc_html_e( 'By enable this option, if your email is fail to send Post SMTP will try to use the SMTP service you define here.', Postman::TEXT_DOMAIN ); ?></p>
244
+ <table class="form-table">
245
+ <tr valign="">
246
+ <th scope="row"><?php _e( 'Use Fallback?', Postman::TEXT_DOMAIN ); ?></th>
247
+ <td>
248
+ <label>
249
+ <input name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_ENABLED; ?>]" type="radio"
250
+ value="no"<?php echo checked( $this->options->getFallbackIsEnabled(), 'no' ); ?>>
251
+ <?php _e( 'No', Postman::TEXT_DOMAIN ); ?>
252
+ </label>
253
+ &nbsp;
254
+ <label>
255
+ <?php $checked = checked( $this->options->getFallbackIsEnabled(), 'yes', false ); ?>
256
+ <input name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_ENABLED; ?>]" type="radio"
257
+ value="yes"<?php echo checked( $this->options->getFallbackIsEnabled(), 'yes' ); ?>>
258
+ <?php _e( 'Yes', Postman::TEXT_DOMAIN ); ?>
259
+ </label>
260
+ </td>
261
+ </tr>
262
+
263
+ <tr>
264
+ <th scope="row"><?php _e('Outgoing Mail Server', Postman::TEXT_DOMAIN ); ?></th>
265
+ <?php $host = $this->options->getFallbackHostname(); ?>
266
+ <td>
267
+ <input type="text" id="fallback-smtp-host" name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_HOSTNAME; ?>]"
268
+ value="<?php echo $host; ?>" placeholder="Example: smtp.host.com">
269
+ </td>
270
+ </tr>
271
+
272
+ <tr>
273
+ <th scope="row"><?php _e('Mail Server Port', Postman::TEXT_DOMAIN ); ?></th>
274
+ <?php $port = $this->options->getFallbackPort(); ?>
275
+ <td>
276
+ <input type="number" id="fallback-smtp-port" name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_PORT; ?>]"
277
+ value="<?php echo $port; ?>" placeholder="Example: 587">
278
+ </td>
279
+ </tr>
280
+
281
+ <tr>
282
+ <th scope="row"><?php _e('Security', Postman::TEXT_DOMAIN ); ?></th>
283
+ <?php
284
+ $security_options = array(
285
+ 'none' => __( 'None', Postman::TEXT_DOMAIN ),
286
+ 'ssl' => __( 'SSL', Postman::TEXT_DOMAIN ),
287
+ 'tls' => __( 'TLS', Postman::TEXT_DOMAIN ),
288
+ );
289
+ ?>
290
+ <td>
291
+ <select id="fallback-smtp-security" name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_SECURITY; ?>]">
292
+ <?php
293
+ foreach ( $security_options as $key => $label ) {
294
+ $selected = selected( $this->options->getFallbackSecurity(), $key,false );
295
+ ?>
296
+ <option value="<?php echo $key; ?>"<?php echo $selected; ?>><?php echo $label; ?></option>
297
+ <?php
298
+ }
299
+ ?>
300
+ </select>
301
+ </td>
302
+ </tr>
303
+
304
+ <tr valign="">
305
+ <th scope="row"><?php _e( 'Use SMTP Authentication?', Postman::TEXT_DOMAIN ); ?></th>
306
+ <td>
307
+ <label>
308
+ <input name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_USE_AUTH; ?>]"
309
+ type="radio" value="none"<?php checked( $this->options->getFallbackAuth(), 'none' ); ?>>
310
+ <?php _e( 'No', Postman::TEXT_DOMAIN ); ?>
311
+ </label>
312
+ &nbsp;
313
+ <label>
314
+ <input name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_USE_AUTH; ?>]"
315
+ type="radio" value="login"<?php checked( $this->options->getFallbackAuth(), 'login' ); ?>>
316
+ <?php _e( 'Yes', Postman::TEXT_DOMAIN ); ?>
317
+ </label>
318
+ </td>
319
+ </tr>
320
+
321
+ <tr>
322
+ <th scope="row"><?php _e('User name', Postman::TEXT_DOMAIN ); ?></th>
323
+ <td>
324
+ <input type="text" id="fallback-smtp-username"
325
+ value="<?php echo $this->options->getFallbackUsername(); ?>"
326
+ name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_USERNAME; ?>]"
327
+ >
328
+ </td>
329
+ </tr>
330
+
331
+ <tr>
332
+ <th scope="row"><?php _e('Password', Postman::TEXT_DOMAIN ); ?></th>
333
+ <td>
334
+ <input type="password" id="fallback-smtp-password"
335
+ value="<?php echo PostmanUtils::obfuscatePassword( $this->options->getFallbackPassword() ); ?>"
336
+ name="postman_options[<?php echo PostmanOptions::FALLBACK_SMTP_PASSWORD; ?>]"
337
+ >
338
+ </td>
339
+ </tr>
340
+
341
+ </table>
342
+ </section>
343
+ <!-- Fallback End -->
344
+
345
+ <?php
346
  print '<section id="message_config">';
347
  do_settings_sections( PostmanAdminController::MESSAGE_SENDER_OPTIONS );
348
  do_settings_sections( PostmanAdminController::MESSAGE_FROM_OPTIONS );
Postman/Postman-Configuration/PostmanRegisterConfigurationSettings.php CHANGED
@@ -21,7 +21,7 @@ class PostmanSettingsRegistry {
21
 
22
  // only administrators should be able to trigger this
23
  if ( PostmanUtils::isAdmin() ) {
24
- $sanitizer = new PostmanInputSanitizer();
25
  register_setting( PostmanAdminController::SETTINGS_GROUP_NAME, PostmanOptions::POSTMAN_OPTIONS, array(
26
  $sanitizer,
27
  'sanitize',
@@ -101,6 +101,8 @@ class PostmanSettingsRegistry {
101
  'headers_callback',
102
  ), PostmanAdminController::MESSAGE_HEADERS_OPTIONS, PostmanAdminController::MESSAGE_HEADERS_SECTION );
103
 
 
 
104
  // the Email Validation section
105
  add_settings_section( PostmanAdminController::EMAIL_VALIDATION_SECTION, __( 'Validation', Postman::TEXT_DOMAIN ), array(
106
  $this,
@@ -431,7 +433,7 @@ class PostmanSettingsRegistry {
431
  }
432
 
433
  public function notification_chrome_uid_callback() {
434
- printf( '<input type="password" id="input_%2$s" class="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::NOTIFICATION_CHROME_UID, $this->options->getNotificationChromeUid() );
435
  }
436
 
437
  public function pushover_user_callback() {
21
 
22
  // only administrators should be able to trigger this
23
  if ( PostmanUtils::isAdmin() ) {
24
+ $sanitizer = new PostmanInputSanitizer();
25
  register_setting( PostmanAdminController::SETTINGS_GROUP_NAME, PostmanOptions::POSTMAN_OPTIONS, array(
26
  $sanitizer,
27
  'sanitize',
101
  'headers_callback',
102
  ), PostmanAdminController::MESSAGE_HEADERS_OPTIONS, PostmanAdminController::MESSAGE_HEADERS_SECTION );
103
 
104
+ // Fallback
105
+
106
  // the Email Validation section
107
  add_settings_section( PostmanAdminController::EMAIL_VALIDATION_SECTION, __( 'Validation', Postman::TEXT_DOMAIN ), array(
108
  $this,
433
  }
434
 
435
  public function notification_chrome_uid_callback() {
436
+ printf( '<input type="password" id="input_%2$s" class="input_%2$s" name="%1$s[%2$s]" value="%3$s" />', PostmanOptions::POSTMAN_OPTIONS, PostmanOptions::NOTIFICATION_CHROME_UID, PostmanUtils::obfuscatePassword( $this->options->getNotificationChromeUid() ) );
437
  }
438
 
439
  public function pushover_user_callback() {
Postman/Postman-Diagnostic-Test/PostmanDiagnosticTestController.php CHANGED
@@ -102,9 +102,9 @@ class PostmanDiagnosticTestController {
102
 
103
  printf( '<h4>%s</h4>', __( 'Are you having issues with Postman?', Postman::TEXT_DOMAIN ) );
104
  /* translators: where %1$s and %2$s are the URLs to the Troubleshooting and Support Forums on WordPress.org */
105
- printf( '<p style="margin:0 10px">%s</p>', sprintf( __( 'Please check the <a href="%1$s">troubleshooting and error messages</a> page and the <a href="%2$s">support forum</a>.', Postman::TEXT_DOMAIN ), 'https://wordpress.org/plugins/post-smtp/other_notes/', 'https://wordpress.org/support/plugin/postman-smtp' ) );
106
  printf( '<h4>%s</h4>', __( 'Diagnostic Test', Postman::TEXT_DOMAIN ) );
107
- printf( '<p style="margin:0 10px">%s</p><br/>', sprintf( __( 'If you write for help, please include the following:', Postman::TEXT_DOMAIN ), 'https://wordpress.org/plugins/post-smtp/other_notes/', 'https://wordpress.org/support/plugin/postman-smtp' ) );
108
  printf( '<textarea readonly="readonly" id="diagnostic-text" cols="80" rows="15">%s</textarea>', _x( 'Checking..', 'The "please wait" message', Postman::TEXT_DOMAIN ) );
109
  print '</div>';
110
  }
102
 
103
  printf( '<h4>%s</h4>', __( 'Are you having issues with Postman?', Postman::TEXT_DOMAIN ) );
104
  /* translators: where %1$s and %2$s are the URLs to the Troubleshooting and Support Forums on WordPress.org */
105
+ printf( '<p style="margin:0 10px">%s</p>', sprintf( __( 'Please check the <a href="%1$s">troubleshooting and error messages</a> page and the <a href="%2$s">support forum</a>.', Postman::TEXT_DOMAIN ), 'https://wordpress.org/plugins/post-smtp/other_notes/', 'https://wordpress.org/support/plugin/post-smtp' ) );
106
  printf( '<h4>%s</h4>', __( 'Diagnostic Test', Postman::TEXT_DOMAIN ) );
107
+ printf( '<p style="margin:0 10px">%s</p><br/>', sprintf( __( 'If you write for help, please include the following:', Postman::TEXT_DOMAIN ), 'https://wordpress.org/plugins/post-smtp/other_notes/', 'https://wordpress.org/support/plugin/post-smtp' ) );
108
  printf( '<textarea readonly="readonly" id="diagnostic-text" cols="80" rows="15">%s</textarea>', _x( 'Checking..', 'The "please wait" message', Postman::TEXT_DOMAIN ) );
109
  print '</div>';
110
  }
Postman/Postman-Email-Log/PostmanEmailLogController.php CHANGED
@@ -302,7 +302,7 @@ class PostmanEmailLogController {
302
  $pageTitle = sprintf( __( '%s Email Log', Postman::TEXT_DOMAIN ), __( 'Post SMTP', Postman::TEXT_DOMAIN ) );
303
  $pluginName = _x( 'Email Log', 'The log of Emails that have been delivered', Postman::TEXT_DOMAIN );
304
 
305
- $page = add_submenu_page( PostmanViewController::POSTMAN_MENU_SLUG, $pageTitle, $pluginName, 'read_private_posts', 'postman_email_log', array( $this, 'postman_render_email_page' ) );
306
 
307
  // When the plugin options page is loaded, also load the stylesheet
308
  add_action( 'admin_print_styles-' . $page, array(
302
  $pageTitle = sprintf( __( '%s Email Log', Postman::TEXT_DOMAIN ), __( 'Post SMTP', Postman::TEXT_DOMAIN ) );
303
  $pluginName = _x( 'Email Log', 'The log of Emails that have been delivered', Postman::TEXT_DOMAIN );
304
 
305
+ $page = add_submenu_page( PostmanViewController::POSTMAN_MENU_SLUG, $pageTitle, $pluginName, Postman::MANAGE_POSTMAN_CAPABILITY_LOGS, 'postman_email_log', array( $this, 'postman_render_email_page' ) );
306
 
307
  // When the plugin options page is loaded, also load the stylesheet
308
  add_action( 'admin_print_styles-' . $page, array(
Postman/Postman-Email-Log/PostmanEmailLogService.php CHANGED
@@ -16,6 +16,10 @@ if ( ! class_exists( 'PostmanEmailLog' ) ) {
16
  public $originalSubject;
17
  public $originalMessage;
18
  public $originalHeaders;
 
 
 
 
19
  }
20
  }
21
 
@@ -95,7 +99,7 @@ if ( ! class_exists( 'PostmanEmailLogService' ) ) {
95
  public function writeFailureLog( PostmanEmailLog $log, PostmanMessage $message = null, $transcript, PostmanModuleTransport $transport, $statusMessage ) {
96
  if ( PostmanOptions::getInstance()->isMailLoggingEnabled() ) {
97
  $this->createLog( $log, $message, $transcript, $statusMessage, false, $transport );
98
- $this->writeToEmailLog( $log );
99
  }
100
  }
101
 
@@ -104,21 +108,43 @@ if ( ! class_exists( 'PostmanEmailLogService' ) ) {
104
  *
105
  * From http://wordpress.stackexchange.com/questions/8569/wp-insert-post-php-function-and-custom-fields
106
  */
107
- private function writeToEmailLog( PostmanEmailLog $log ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
- $this->checkForLogErrors( $log );
110
  // nothing here is sanitized as WordPress should take care of
111
  // making database writes safe
112
  $my_post = array(
113
  'post_type' => PostmanEmailLogPostType::POSTMAN_CUSTOM_POST_TYPE_SLUG,
114
  'post_title' => $log->subject,
115
  'post_content' => $log->body,
116
- 'post_excerpt' => $log->statusMessage,
117
  'post_status' => PostmanEmailLogService::POSTMAN_CUSTOM_POST_STATUS_PRIVATE,
118
  );
119
 
120
  // Insert the post into the database (WordPress gives us the Post ID)
121
- $post_id = wp_insert_post( $my_post );
 
 
 
 
 
 
 
 
 
 
122
  $this->logger->debug( sprintf( 'Saved message #%s to the database', $post_id ) );
123
  $this->logger->trace( $log );
124
 
@@ -155,7 +181,7 @@ if ( ! class_exists( 'PostmanEmailLogService' ) ) {
155
  $purger->truncateLogItems( PostmanOptions::getInstance()->getMailLoggingMaxEntries() );
156
  }
157
 
158
- private function checkForLogErrors( PostmanEmailLog $log ) {
159
  $message = __( 'You getting this message because an error detected while delivered your email.', Postman::TEXT_DOMAIN );
160
  $message .= "\r\n" . sprintf( __( 'For the domain: %1$s',Postman::TEXT_DOMAIN ), get_bloginfo('url') );
161
  $message .= "\r\n" . __( 'The log to paste when you open a support issue:', Postman::TEXT_DOMAIN ) . "\r\n";
@@ -180,7 +206,8 @@ if ( ! class_exists( 'PostmanEmailLogService' ) ) {
180
  $notifyer = new PostmanMailNotify;
181
  }
182
 
183
- $notify = new PostmanNotify( $notifyer, $message );
 
184
  $notify->send($message, $log);
185
  $notify->push_to_chrome($log->statusMessage);
186
  }
16
  public $originalSubject;
17
  public $originalMessage;
18
  public $originalHeaders;
19
+
20
+ public function setStatusMessage( $message ) {
21
+ $this->statusMessage .= $message;
22
+ }
23
  }
24
  }
25
 
99
  public function writeFailureLog( PostmanEmailLog $log, PostmanMessage $message = null, $transcript, PostmanModuleTransport $transport, $statusMessage ) {
100
  if ( PostmanOptions::getInstance()->isMailLoggingEnabled() ) {
101
  $this->createLog( $log, $message, $transcript, $statusMessage, false, $transport );
102
+ $this->writeToEmailLog( $log,$message );
103
  }
104
  }
105
 
108
  *
109
  * From http://wordpress.stackexchange.com/questions/8569/wp-insert-post-php-function-and-custom-fields
110
  */
111
+ private function writeToEmailLog( PostmanEmailLog $log, PostmanMessage $message = null ) {
112
+
113
+ $options = PostmanOptions::getInstance();
114
+
115
+ $this->checkForLogErrors( $log ,$message );
116
+ $new_status = $log->statusMessage;
117
+
118
+ if ( $options->is_fallback && empty( $log->statusMessage ) ) {
119
+ $new_status = 'Sent ( ** Fallback ** )';
120
+ }
121
+
122
+ if ( $options->is_fallback && ! empty( $log->statusMessage ) ) {
123
+ $new_status = '( ** Fallback ** ) ' . $log->statusMessage;
124
+ }
125
 
 
126
  // nothing here is sanitized as WordPress should take care of
127
  // making database writes safe
128
  $my_post = array(
129
  'post_type' => PostmanEmailLogPostType::POSTMAN_CUSTOM_POST_TYPE_SLUG,
130
  'post_title' => $log->subject,
131
  'post_content' => $log->body,
132
+ 'post_excerpt' => $new_status,
133
  'post_status' => PostmanEmailLogService::POSTMAN_CUSTOM_POST_STATUS_PRIVATE,
134
  );
135
 
136
  // Insert the post into the database (WordPress gives us the Post ID)
137
+ $post_id = wp_insert_post( $my_post, true );
138
+
139
+ if ( is_wp_error( $post_id ) ) {
140
+ add_action( 'admin_notices', function() use( $post_id ) {
141
+ $class = 'notice notice-error';
142
+ $message = $post_id->get_error_message();
143
+
144
+ printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), esc_html( $message ) );
145
+ });
146
+ }
147
+
148
  $this->logger->debug( sprintf( 'Saved message #%s to the database', $post_id ) );
149
  $this->logger->trace( $log );
150
 
181
  $purger->truncateLogItems( PostmanOptions::getInstance()->getMailLoggingMaxEntries() );
182
  }
183
 
184
+ private function checkForLogErrors( PostmanEmailLog $log, $postMessage ) {
185
  $message = __( 'You getting this message because an error detected while delivered your email.', Postman::TEXT_DOMAIN );
186
  $message .= "\r\n" . sprintf( __( 'For the domain: %1$s',Postman::TEXT_DOMAIN ), get_bloginfo('url') );
187
  $message .= "\r\n" . __( 'The log to paste when you open a support issue:', Postman::TEXT_DOMAIN ) . "\r\n";
206
  $notifyer = new PostmanMailNotify;
207
  }
208
 
209
+ // Notifications
210
+ $notify = new PostmanNotify( $notifyer );
211
  $notify->send($message, $log);
212
  $notify->push_to_chrome($log->statusMessage);
213
  }
Postman/Postman-Mail/PostmanMyMailConnector.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
- define( 'MYMAIL_POSTMAN_REQUIRED_VERSION', '2.0' );
3
- define( 'MYMAIL_POSTMAN_ID', 'postman' );
4
 
5
  /**
6
  * Enables MyMail to deliver via Postman
@@ -36,36 +36,36 @@ if ( ! class_exists( 'PostmanMyMailConnector' ) ) {
36
  * Initialize the Connector
37
  */
38
  public function init() {
39
- if ( ! defined( 'MYMAIL_VERSION' ) || version_compare( MYMAIL_POSTMAN_REQUIRED_VERSION, MYMAIL_VERSION, '>' ) ) {
40
  // no-op
41
  } else {
42
  // create an instance of the Logger
43
  $this->logger = new PostmanLogger( get_class( $this ) );
44
  $this->logger->debug( 'Starting' );
45
 
46
- add_filter( 'mymail_delivery_methods', array(
47
  &$this,
48
  'delivery_method',
49
  ) );
50
- add_action( 'mymail_deliverymethod_tab_postman', array(
51
  &$this,
52
  'deliverytab',
53
  ) );
54
 
55
- if ( mymail_option( 'deliverymethod' ) == MYMAIL_POSTMAN_ID ) {
56
- add_action( 'mymail_initsend', array(
57
  &$this,
58
  'initsend',
59
  ) );
60
- add_action( 'mymail_presend', array(
61
  &$this,
62
  'presend',
63
  ) );
64
- add_action( 'mymail_dosend', array(
65
  &$this,
66
  'dosend',
67
  ) );
68
- add_action( 'MYMAIL_POSTMAN_cron', array(
69
  &$this,
70
  'reset',
71
  ) );
@@ -76,7 +76,7 @@ if ( ! class_exists( 'PostmanMyMailConnector' ) ) {
76
  /**
77
  * initsend function.
78
  *
79
- * uses mymail_initsend hook to set initial settings
80
  *
81
  * @access public
82
  * @param mixed $mailobject
@@ -91,7 +91,7 @@ if ( ! class_exists( 'PostmanMyMailConnector' ) ) {
91
  /**
92
  * presend function.
93
  *
94
- * uses the mymail_presend hook to apply setttings before each mail
95
  *
96
  * @access public
97
  * @param mixed $mailobject
@@ -110,7 +110,7 @@ if ( ! class_exists( 'PostmanMyMailConnector' ) ) {
110
  /**
111
  * dosend function.
112
  *
113
- * uses the mymail_dosend hook and triggers the send
114
  *
115
  * @access public
116
  * @param mixed $mailobject
@@ -158,8 +158,8 @@ if ( ! class_exists( 'PostmanMyMailConnector' ) ) {
158
  * @return array
159
  */
160
  public function reset() {
161
- update_option( '_transient__mymail_send_period_timeout', false );
162
- update_option( '_transient__mymail_send_period', 0 );
163
  }
164
 
165
  /**
@@ -172,7 +172,7 @@ if ( ! class_exists( 'PostmanMyMailConnector' ) ) {
172
  * @return void
173
  */
174
  public function delivery_method( $delivery_methods ) {
175
- $delivery_methods [ MYMAIL_POSTMAN_ID ] = __( 'Postman SMTP', Postman::TEXT_DOMAIN );
176
  return $delivery_methods;
177
  }
178
 
@@ -195,8 +195,8 @@ if ( ! class_exists( 'PostmanMyMailConnector' ) ) {
195
  * @return void
196
  */
197
  public function activate() {
198
- if ( defined( 'MYMAIL_VERSION' ) && version_compare( MYMAIL_POSTMAN_REQUIRED_VERSION, MYMAIL_VERSION, '<=' ) ) {
199
- mymail_notice( sprintf( __( 'MyMail: Change the delivery method in the %s!', Postman::TEXT_DOMAIN ), sprintf( '<a href="options-general.php?page=newsletter-settings&mymail_remove_notice=mymail_delivery_method#delivery">%s</a>', __( 'Settings', 'postman-smtp' ) ) ), '', false, 'delivery_method' );
200
  $this->reset();
201
  }
202
  }
@@ -208,11 +208,11 @@ if ( ! class_exists( 'PostmanMyMailConnector' ) ) {
208
  * @return void
209
  */
210
  public function deactivate() {
211
- if ( defined( 'MYMAIL_VERSION' ) && function_exists( 'mymail_option' ) && version_compare( MYMAIL_POSTMAN_REQUIRED_VERSION, MYMAIL_VERSION, '<=' ) ) {
212
- if ( mymail_option( 'deliverymethod' ) == MYMAIL_POSTMAN_ID ) {
213
- mymail_update_option( 'deliverymethod', 'simple' );
214
  /* Translators where %s is the name of the page */
215
- mymail_notice( sprintf( __( 'MyMail: Change the delivery method in the %s!', Postman::TEXT_DOMAIN ), sprintf( '<a href="options-general.php?page=newsletter-settings&mymail_remove_notice=mymail_delivery_method#delivery">%s</a>', __( 'Settings', 'postman-smtp' ) ) ), '', false, 'delivery_method' );
216
  }
217
  }
218
  }
1
  <?php
2
+ define( 'MAILSTER_POSTMAN_REQUIRED_VERSION', '2.0' );
3
+ define( 'MAILSTER_POSTMAN_ID', 'postman' );
4
 
5
  /**
6
  * Enables MyMail to deliver via Postman
36
  * Initialize the Connector
37
  */
38
  public function init() {
39
+ if ( ! defined( 'MAILSTER_VERSION' ) || version_compare( MAILSTER_POSTMAN_REQUIRED_VERSION, MAILSTER_VERSION, '>' ) ) {
40
  // no-op
41
  } else {
42
  // create an instance of the Logger
43
  $this->logger = new PostmanLogger( get_class( $this ) );
44
  $this->logger->debug( 'Starting' );
45
 
46
+ add_filter( 'mailster_delivery_methods', array(
47
  &$this,
48
  'delivery_method',
49
  ) );
50
+ add_action( 'mailster_deliverymethod_tab_postman', array(
51
  &$this,
52
  'deliverytab',
53
  ) );
54
 
55
+ if ( mailster_option( 'deliverymethod' ) == MAILSTER_POSTMAN_ID ) {
56
+ add_action( 'mailster_initsend', array(
57
  &$this,
58
  'initsend',
59
  ) );
60
+ add_action( 'mailster_presend', array(
61
  &$this,
62
  'presend',
63
  ) );
64
+ add_action( 'mailster_dosend', array(
65
  &$this,
66
  'dosend',
67
  ) );
68
+ add_action( 'MAILSTER_POSTMAN_cron', array(
69
  &$this,
70
  'reset',
71
  ) );
76
  /**
77
  * initsend function.
78
  *
79
+ * uses mailster_initsend hook to set initial settings
80
  *
81
  * @access public
82
  * @param mixed $mailobject
91
  /**
92
  * presend function.
93
  *
94
+ * uses the mailster_presend hook to apply setttings before each mail
95
  *
96
  * @access public
97
  * @param mixed $mailobject
110
  /**
111
  * dosend function.
112
  *
113
+ * uses the mailster_dosend hook and triggers the send
114
  *
115
  * @access public
116
  * @param mixed $mailobject
158
  * @return array
159
  */
160
  public function reset() {
161
+ update_option( '_transient__mailster_send_period_timeout', false );
162
+ update_option( '_transient__mailster_send_period', 0 );
163
  }
164
 
165
  /**
172
  * @return void
173
  */
174
  public function delivery_method( $delivery_methods ) {
175
+ $delivery_methods [ MAILSTER_POSTMAN_ID ] = __( 'Postman SMTP', Postman::TEXT_DOMAIN );
176
  return $delivery_methods;
177
  }
178
 
195
  * @return void
196
  */
197
  public function activate() {
198
+ if ( defined( 'MAILSTER_VERSION' ) && version_compare( MAILSTER_POSTMAN_REQUIRED_VERSION, MAILSTER_VERSION, '<=' ) ) {
199
+ mailster_notice( sprintf( __( 'MyMail: Change the delivery method in the %s!', Postman::TEXT_DOMAIN ), sprintf( '<a href="edit.php?post_type=newsletter&page=mailster_settings&mailster_remove_notice=mailster_delivery_method#delivery">%s</a>', __( 'Settings', 'postman-smtp' ) ) ), '', false, 'delivery_method' );
200
  $this->reset();
201
  }
202
  }
208
  * @return void
209
  */
210
  public function deactivate() {
211
+ if ( defined( 'MAILSTER_VERSION' ) && function_exists( 'mailster_option' ) && version_compare( MAILSTER_POSTMAN_REQUIRED_VERSION, MAILSTER_VERSION, '<=' ) ) {
212
+ if ( mailster_option( 'deliverymethod' ) == MAILSTER_POSTMAN_ID ) {
213
+ mailster_update_option( 'deliverymethod', 'simple' );
214
  /* Translators where %s is the name of the page */
215
+ mailster_notice( sprintf( __( 'MyMail: Change the delivery method in the %s!', Postman::TEXT_DOMAIN ), sprintf( '<a href="edit.php?post_type=newsletter&page=mailster_settings&mailster_remove_notice=mailster_delivery_method#delivery">%s</a>', __( 'Settings', 'postman-smtp' ) ) ), '', false, 'delivery_method' );
216
  }
217
  }
218
  }
Postman/Postman-Mail/PostmanSendGridMailEngine.php CHANGED
@@ -210,6 +210,7 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) {
210
  $this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS;
211
  $this->transcript .= print_r( $mail, true );
212
  $this->logger->debug( 'Transcript=' . $this->transcript );
 
213
  throw $e;
214
  }
215
  }
210
  $this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS;
211
  $this->transcript .= print_r( $mail, true );
212
  $this->logger->debug( 'Transcript=' . $this->transcript );
213
+
214
  throw $e;
215
  }
216
  }
Postman/Postman-Mail/mailchimp-mandrill-api-php-da3adc10042e/src/Mandrill.php CHANGED
@@ -149,7 +149,7 @@ class Postman_Mandrill {
149
  public function castError($result) {
150
  if($result['status'] !== 'error' || !$result['name']) throw new Postman_Mandrill_Error('We received an unexpected error: ' . json_encode($result));
151
 
152
- $class = (isset(self::$error_map[$result['name']])) ? self::$error_map[$result['name']] : 'Mandrill_Error';
153
  return new $class($result['message'], $result['code']);
154
  }
155
 
149
  public function castError($result) {
150
  if($result['status'] !== 'error' || !$result['name']) throw new Postman_Mandrill_Error('We received an unexpected error: ' . json_encode($result));
151
 
152
+ $class = (isset(self::$error_map[$result['name']])) ? self::$error_map[$result['name']] : 'Postman_Mandrill_Error';
153
  return new $class($result['message'], $result['code']);
154
  }
155
 
Postman/Postman.php CHANGED
@@ -18,6 +18,7 @@ class Postman {
18
 
19
  const ADMINISTRATOR_ROLE_NAME = 'administrator';
20
  const MANAGE_POSTMAN_CAPABILITY_NAME = 'manage_postman_smtp';
 
21
  const TEXT_DOMAIN = 'post-smtp';
22
 
23
  private $logger;
18
 
19
  const ADMINISTRATOR_ROLE_NAME = 'administrator';
20
  const MANAGE_POSTMAN_CAPABILITY_NAME = 'manage_postman_smtp';
21
+ const MANAGE_POSTMAN_CAPABILITY_LOGS = 'manage_postman_logs';
22
  const TEXT_DOMAIN = 'post-smtp';
23
 
24
  private $logger;
Postman/PostmanAdminController.php CHANGED
@@ -136,6 +136,17 @@ if ( ! class_exists( 'PostmanAdminController' ) ) {
136
  'on_init',
137
  ) );
138
 
 
 
 
 
 
 
 
 
 
 
 
139
  // Adds "Settings" link to the plugin action page
140
  add_filter( 'plugin_action_links_' . plugin_basename( $this->rootPluginFilenameAndPath ), array(
141
  $this,
@@ -145,6 +156,68 @@ if ( ! class_exists( 'PostmanAdminController' ) ) {
145
  require_once( 'PostmanPluginFeedback.php' );
146
  }
147
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  /**
149
  * Functions to execute on the init event
150
  *
136
  'on_init',
137
  ) );
138
 
139
+ // continue to initialize the AdminController
140
+ add_action( 'wpmu_options', array(
141
+ $this,
142
+ 'wpmu_options',
143
+ ) );
144
+
145
+ add_action( 'update_wpmu_options', array(
146
+ $this,
147
+ 'update_wpmu_options',
148
+ ) );
149
+
150
  // Adds "Settings" link to the plugin action page
151
  add_filter( 'plugin_action_links_' . plugin_basename( $this->rootPluginFilenameAndPath ), array(
152
  $this,
156
  require_once( 'PostmanPluginFeedback.php' );
157
  }
158
 
159
+
160
+ function wpmu_options() {
161
+ $options = get_site_option( PostmanOptions::POSTMAN_NETWORK_OPTIONS );
162
+ ?>
163
+ <input type="hidden" name="<?php echo PostmanOptions::POSTMAN_NETWORK_OPTIONS; ?>[post_smtp_global_settings]" value="null">
164
+ <input type="hidden" name="<?php echo PostmanOptions::POSTMAN_NETWORK_OPTIONS; ?>[post_smtp_allow_overwrite]" value="null">
165
+ <h2><?php _e( 'Post SMTP Settings', Postman::TEXT_DOMAIN ); ?></h2>
166
+ <table id="menu" class="form-table">
167
+ <tr>
168
+ <th scope="row">
169
+ <?php _e( 'Enable global settings', Postman::TEXT_DOMAIN ); ?>
170
+ </th>
171
+ <td>
172
+ <?php $checked = checked( $options['post_smtp_global_settings'], 1, false ); ?>
173
+ <label for="post-smtp-global-settings">
174
+ <input id="post-smtp-global-settings" type="checkbox"
175
+ name="<?php echo PostmanOptions::POSTMAN_NETWORK_OPTIONS; ?>[post_smtp_global_settings]"
176
+ value="1"
177
+ <?php echo $checked; ?>
178
+ >
179
+ <p class="description">
180
+ <?php _e('Same settings as the main site/blog (id:1)', Postman::TEXT_DOMAIN ); ?>
181
+ </p>
182
+ </label>
183
+ </td>
184
+ </tr>
185
+ <tr>
186
+ <th scope="row">
187
+ <?php _e( 'Allow user to load saved options', Postman::TEXT_DOMAIN ); ?>
188
+ </th>
189
+ <td>
190
+ <?php $checked = checked( $options['post_smtp_allow_overwrite'], 1, false ); ?>
191
+ <label for="post-smtp-allow-overwrite">
192
+ <input id="post-smtp-allow-overwrite" type="checkbox"
193
+ name="<?php echo PostmanOptions::POSTMAN_NETWORK_OPTIONS; ?>[post_smtp_allow_overwrite]"
194
+ value="1"
195
+ <?php echo $checked; ?>
196
+ >
197
+ </label>
198
+ </td>
199
+ </tr>
200
+ </table>
201
+ <?php
202
+ }
203
+
204
+ function update_wpmu_options() {
205
+ $options = get_site_option( PostmanOptions::POSTMAN_NETWORK_OPTIONS );
206
+ if ( isset( $_POST[ PostmanOptions::POSTMAN_NETWORK_OPTIONS ] ) ) {
207
+ foreach ( $_POST[ PostmanOptions::POSTMAN_NETWORK_OPTIONS ] as $key => $value ) {
208
+ $options[$key] = sanitize_text_field( $value );
209
+
210
+ if ( $value == 'null' ) {
211
+ unset( $options[$key] );
212
+ }
213
+ }
214
+
215
+ update_site_option( PostmanOptions::POSTMAN_NETWORK_OPTIONS, $options );
216
+ } else {
217
+ update_site_option( PostmanOptions::POSTMAN_NETWORK_OPTIONS, array() );
218
+ }
219
+ }
220
+
221
  /**
222
  * Functions to execute on the init event
223
  *
Postman/PostmanInputSanitizer.php CHANGED
@@ -69,14 +69,25 @@ if ( ! class_exists( 'PostmanInputSanitizer' ) ) {
69
  $this->sanitizeInt( 'Transcript Size', PostmanOptions::TRANSCRIPT_SIZE, $input, $new_input );
70
  $this->sanitizeString( 'Temporary Directory', PostmanOptions::TEMPORARY_DIRECTORY, $input, $new_input );
71
 
 
72
  $this->sanitizeString( 'Pushover Service', PostmanOptions::NOTIFICATION_SERVICE, $input, $new_input, $this->options->getNotificationService() );
73
  $this->sanitizePassword( 'Pushover Username', PostmanOptions::PUSHOVER_USER, $input, $new_input, $this->options->getPushoverUser() );
74
  $this->sanitizePassword( 'Pushover Token', PostmanOptions::PUSHOVER_TOKEN, $input, $new_input, $this->options->getPushoverToken() );
75
  $this->sanitizePassword( 'Slack Token', PostmanOptions::SLACK_TOKEN, $input, $new_input, $this->options->getSlackToken() );
76
 
 
77
  $this->sanitizeString( 'Push Chrome Extension', PostmanOptions::NOTIFICATION_USE_CHROME, $input, $new_input );
78
  $this->sanitizePassword( 'Push Chrome Extension UID', PostmanOptions::NOTIFICATION_CHROME_UID, $input, $new_input, $this->options->getNotificationChromeUid() );
79
 
 
 
 
 
 
 
 
 
 
80
  if ( $new_input [ PostmanOptions::CLIENT_ID ] != $this->options->getClientId() || $new_input [ PostmanOptions::CLIENT_SECRET ] != $this->options->getClientSecret() || $new_input [ PostmanOptions::HOSTNAME ] != $this->options->getHostname() ) {
81
  $this->logger->debug( 'Recognized new Client ID' );
82
  // the user entered a new client id and we should destroy the stored auth token
69
  $this->sanitizeInt( 'Transcript Size', PostmanOptions::TRANSCRIPT_SIZE, $input, $new_input );
70
  $this->sanitizeString( 'Temporary Directory', PostmanOptions::TEMPORARY_DIRECTORY, $input, $new_input );
71
 
72
+ // Notifications
73
  $this->sanitizeString( 'Pushover Service', PostmanOptions::NOTIFICATION_SERVICE, $input, $new_input, $this->options->getNotificationService() );
74
  $this->sanitizePassword( 'Pushover Username', PostmanOptions::PUSHOVER_USER, $input, $new_input, $this->options->getPushoverUser() );
75
  $this->sanitizePassword( 'Pushover Token', PostmanOptions::PUSHOVER_TOKEN, $input, $new_input, $this->options->getPushoverToken() );
76
  $this->sanitizePassword( 'Slack Token', PostmanOptions::SLACK_TOKEN, $input, $new_input, $this->options->getSlackToken() );
77
 
78
+ // Chrome extension
79
  $this->sanitizeString( 'Push Chrome Extension', PostmanOptions::NOTIFICATION_USE_CHROME, $input, $new_input );
80
  $this->sanitizePassword( 'Push Chrome Extension UID', PostmanOptions::NOTIFICATION_CHROME_UID, $input, $new_input, $this->options->getNotificationChromeUid() );
81
 
82
+ // Fallback
83
+ $this->sanitizeString( 'Use fallback', PostmanOptions::FALLBACK_SMTP_ENABLED, $input, $new_input );
84
+ $this->sanitizeString( 'Fallback hostname', PostmanOptions::FALLBACK_SMTP_HOSTNAME, $input, $new_input );
85
+ $this->sanitizeInt( 'Fallback port', PostmanOptions::FALLBACK_SMTP_PORT, $input, $new_input );
86
+ $this->sanitizeString( 'Fallback security', PostmanOptions::FALLBACK_SMTP_SECURITY, $input, $new_input );
87
+ $this->sanitizeString( 'Fallback auth', PostmanOptions::FALLBACK_SMTP_USE_AUTH, $input, $new_input );
88
+ $this->sanitizeString( 'Fallback username', PostmanOptions::FALLBACK_SMTP_USERNAME, $input, $new_input );
89
+ $this->sanitizePassword( 'Fallback password', PostmanOptions::FALLBACK_SMTP_PASSWORD, $input, $new_input, $this->options->getFallbackPassword() );
90
+
91
  if ( $new_input [ PostmanOptions::CLIENT_ID ] != $this->options->getClientId() || $new_input [ PostmanOptions::CLIENT_SECRET ] != $this->options->getClientSecret() || $new_input [ PostmanOptions::HOSTNAME ] != $this->options->getHostname() ) {
92
  $this->logger->debug( 'Recognized new Client ID' );
93
  // the user entered a new client id and we should destroy the stored auth token
Postman/PostmanInstaller.php CHANGED
@@ -12,6 +12,8 @@ require_once( 'PostmanOptions.php' );
12
  class PostmanInstaller {
13
  private $logger;
14
 
 
 
15
  /**
16
  */
17
  public function __construct() {
@@ -22,16 +24,39 @@ class PostmanInstaller {
22
  * Handle activation of the plugin
23
  */
24
  public function activatePostman() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  if ( function_exists( 'is_multisite' ) && is_multisite() ) {
 
 
 
 
 
 
 
 
26
  // handle network activation
27
  // from https://wordpress.org/support/topic/new-function-wp_get_sites?replies=11
28
  // run the activation function for each blog id
29
  $old_blog = get_current_blog_id();
30
  // Get all blog ids
31
- $subsites = wp_get_sites();
32
  foreach ( $subsites as $subsite ) {
33
- $this->logger->trace( 'multisite: switching to blog ' . $subsite ['blog_id'] );
34
- switch_to_blog( $subsite ['blog_id'] );
35
  $this->handleOptionUpdates();
36
  $this->addCapability();
37
  }
@@ -65,10 +90,10 @@ class PostmanInstaller {
65
  // run the deactivation function for each blog id
66
  $old_blog = get_current_blog_id();
67
  // Get all blog ids
68
- $subsites = wp_get_sites();
69
  foreach ( $subsites as $subsite ) {
70
- $this->logger->trace( 'multisite: switching to blog ' . $subsite ['blog_id'] );
71
- switch_to_blog( $subsite ['blog_id'] );
72
  $this->removeCapability();
73
  }
74
  switch_to_blog( $old_blog );
@@ -90,6 +115,7 @@ class PostmanInstaller {
90
  // add the custom capability to the administrator role
91
  $role = get_role( Postman::ADMINISTRATOR_ROLE_NAME );
92
  $role->add_cap( Postman::MANAGE_POSTMAN_CAPABILITY_NAME );
 
93
  }
94
 
95
  /**
@@ -104,6 +130,7 @@ class PostmanInstaller {
104
  // remove the custom capability from the administrator role
105
  $role = get_role( Postman::ADMINISTRATOR_ROLE_NAME );
106
  $role->remove_cap( Postman::MANAGE_POSTMAN_CAPABILITY_NAME );
 
107
  }
108
 
109
  /**
12
  class PostmanInstaller {
13
  private $logger;
14
 
15
+ private $roles;
16
+
17
  /**
18
  */
19
  public function __construct() {
24
  * Handle activation of the plugin
25
  */
26
  public function activatePostman() {
27
+ $options = get_option( PostmanOptions::POSTMAN_OPTIONS );
28
+ $args = array(
29
+ 'fallback_smtp_enabled' => 'no',
30
+ );
31
+
32
+ if ( empty( $options ) ) {
33
+ add_option( 'postman_options', $args );
34
+
35
+ } else {
36
+ if ( empty( $options['fallback_smtp_enabled'] ) ) {
37
+ $result = array_merge($options, $args);
38
+ update_option( PostmanOptions::POSTMAN_OPTIONS, $result );
39
+ }
40
+ }
41
+
42
  if ( function_exists( 'is_multisite' ) && is_multisite() ) {
43
+
44
+ /* $role = get_role( Postman::ADMINISTRATOR_ROLE_NAME );
45
+ $role->add_cap( Postman::MANAGE_POSTMAN_CAPABILITY_NAME );
46
+ $role->add_cap( Postman::MANAGE_POSTMAN_CAPABILITY_LOGS );*/
47
+
48
+ $options['post_smtp_allow_overwrite'] = '1';
49
+ update_site_option( PostmanOptions::POSTMAN_NETWORK_OPTIONS, $options );
50
+
51
  // handle network activation
52
  // from https://wordpress.org/support/topic/new-function-wp_get_sites?replies=11
53
  // run the activation function for each blog id
54
  $old_blog = get_current_blog_id();
55
  // Get all blog ids
56
+ $subsites = get_sites();
57
  foreach ( $subsites as $subsite ) {
58
+ $this->logger->trace( 'multisite: switching to blog ' . $subsite->blog_id );
59
+ switch_to_blog( $subsite->blog_id );
60
  $this->handleOptionUpdates();
61
  $this->addCapability();
62
  }
90
  // run the deactivation function for each blog id
91
  $old_blog = get_current_blog_id();
92
  // Get all blog ids
93
+ $subsites = get_sites();
94
  foreach ( $subsites as $subsite ) {
95
+ $this->logger->trace( 'multisite: switching to blog ' . $subsite->blog_id );
96
+ switch_to_blog( $subsite->blog_id );
97
  $this->removeCapability();
98
  }
99
  switch_to_blog( $old_blog );
115
  // add the custom capability to the administrator role
116
  $role = get_role( Postman::ADMINISTRATOR_ROLE_NAME );
117
  $role->add_cap( Postman::MANAGE_POSTMAN_CAPABILITY_NAME );
118
+ $role->add_cap( Postman::MANAGE_POSTMAN_CAPABILITY_LOGS );
119
  }
120
 
121
  /**
130
  // remove the custom capability from the administrator role
131
  $role = get_role( Postman::ADMINISTRATOR_ROLE_NAME );
132
  $role->remove_cap( Postman::MANAGE_POSTMAN_CAPABILITY_NAME );
133
+ $role->remove_cap( Postman::MANAGE_POSTMAN_CAPABILITY_LOGS );
134
  }
135
 
136
  /**
Postman/PostmanOptions.php CHANGED
@@ -54,6 +54,7 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
54
 
55
  // the option database name
56
  const POSTMAN_OPTIONS = 'postman_options';
 
57
 
58
  // the options fields
59
  const VERSION = 'version';
@@ -112,6 +113,15 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
112
  const PUSHOVER_TOKEN = 'pushover_token';
113
  const SLACK_TOKEN = 'slack_token';
114
 
 
 
 
 
 
 
 
 
 
115
  // defaults
116
  const DEFAULT_TRANSCRIPT_SIZE = 128;
117
  const DEFAULT_STEALTH_MODE = false;
@@ -127,6 +137,8 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
127
  const DEFAULT_PLUGIN_MESSAGE_SENDER_EMAIL_ENFORCED = false;
128
  const DEFAULT_TEMP_DIRECTORY = '/tmp';
129
 
 
 
130
  // options data
131
  private $options;
132
 
@@ -145,15 +157,36 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
145
  private function __construct() {
146
  $this->load();
147
  }
 
148
  public function save() {
149
- update_option( PostmanOptions::POSTMAN_OPTIONS, $this->options );
150
  }
 
151
  public function reload() {
152
  $this->load();
153
  }
 
154
  private function load() {
155
- $this->options = get_option( PostmanOptions::POSTMAN_OPTIONS );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  }
 
157
  public function isNew() {
158
  return ! isset( $this->options [ PostmanOptions::TRANSPORT_TYPE ] );
159
  }
@@ -231,18 +264,41 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
231
  return $this->options [ self::ADDITIONAL_HEADERS ]; }
232
  }
233
  public function getHostname() {
 
 
 
 
 
234
  if ( isset( $this->options [ PostmanOptions::HOSTNAME ] ) ) {
235
  return $this->options [ PostmanOptions::HOSTNAME ]; }
236
  }
 
237
  public function getPort() {
 
 
 
 
 
238
  if ( isset( $this->options [ PostmanOptions::PORT ] ) ) {
239
  return $this->options [ PostmanOptions::PORT ]; }
240
  }
 
241
  public function getEnvelopeSender() {
 
 
 
 
 
242
  if ( isset( $this->options [ PostmanOptions::ENVELOPE_SENDER ] ) ) {
243
  return $this->options [ PostmanOptions::ENVELOPE_SENDER ]; }
244
  }
 
245
  public function getMessageSenderEmail() {
 
 
 
 
 
246
  if ( isset( $this->options [ PostmanOptions::MESSAGE_SENDER_EMAIL ] ) ) {
247
  return $this->options [ PostmanOptions::MESSAGE_SENDER_EMAIL ]; }
248
  }
@@ -258,21 +314,45 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
258
  if ( isset( $this->options [ PostmanOptions::CLIENT_SECRET ] ) ) {
259
  return $this->options [ PostmanOptions::CLIENT_SECRET ]; }
260
  }
 
261
  public function getTransportType() {
 
 
 
 
 
262
  if ( isset( $this->options [ PostmanOptions::TRANSPORT_TYPE ] ) ) {
263
  return $this->options [ PostmanOptions::TRANSPORT_TYPE ]; }
264
  }
 
265
  public function getAuthenticationType() {
 
 
 
 
 
266
  if ( isset( $this->options [ PostmanOptions::AUTHENTICATION_TYPE ] ) ) {
267
  return $this->options [ PostmanOptions::AUTHENTICATION_TYPE ]; }
268
  }
 
269
  public function getEncryptionType() {
 
 
 
 
 
 
270
  if ( isset( $this->options [ PostmanOptions::SECURITY_TYPE ] ) ) {
271
  return $this->options [ PostmanOptions::SECURITY_TYPE ];
272
  }
273
  }
274
 
275
  public function getUsername() {
 
 
 
 
 
276
  if ( defined( 'POST_SMTP_AUTH_USERNAME' ) ) {
277
  return POST_SMTP_AUTH_USERNAME;
278
  }
@@ -281,15 +361,77 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
281
  return $this->options [ PostmanOptions::BASIC_AUTH_USERNAME ];
282
  }
283
  }
284
- public function getPassword() {
285
- if ( defined( 'POST_SMTP_AUTH_PASSWORD' ) ) {
286
- return POST_SMTP_AUTH_PASSWORD;
287
- }
288
 
289
- if ( isset( $this->options [ PostmanOptions::BASIC_AUTH_PASSWORD ] ) ) {
290
- return base64_decode( $this->options [ PostmanOptions::BASIC_AUTH_PASSWORD ] );
291
- }
292
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  public function getMandrillApiKey() {
294
  if ( defined( 'POST_SMTP_API_KEY' ) ) {
295
  return POST_SMTP_API_KEY;
@@ -376,10 +518,12 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
376
  if ( isset( $this->options [ PostmanOptions::PREVENT_MESSAGE_SENDER_NAME_OVERRIDE ] ) ) {
377
  return $this->options [ PostmanOptions::PREVENT_MESSAGE_SENDER_NAME_OVERRIDE ]; }
378
  }
 
379
  public function isEmailValidationDisabled() {
380
  if ( isset( $this->options [ PostmanOptions::DISABLE_EMAIL_VALIDAITON ] ) ) {
381
  return $this->options [ PostmanOptions::DISABLE_EMAIL_VALIDAITON ]; }
382
  }
 
383
  /**
384
  * (non-PHPdoc)
385
  *
@@ -390,6 +534,11 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
390
  return $this->isPluginSenderEmailEnforced();
391
  }
392
  public function isPluginSenderEmailEnforced() {
 
 
 
 
 
393
  if ( $this->isNew() ) {
394
  return self::DEFAULT_PLUGIN_MESSAGE_SENDER_EMAIL_ENFORCED; }
395
  if ( isset( $this->options [ PostmanOptions::PREVENT_MESSAGE_SENDER_EMAIL_OVERRIDE ] ) ) {
54
 
55
  // the option database name
56
  const POSTMAN_OPTIONS = 'postman_options';
57
+ const POSTMAN_NETWORK_OPTIONS = 'postman_network_options';
58
 
59
  // the options fields
60
  const VERSION = 'version';
113
  const PUSHOVER_TOKEN = 'pushover_token';
114
  const SLACK_TOKEN = 'slack_token';
115
 
116
+ // Fallback
117
+ const FALLBACK_SMTP_ENABLED = 'fallback_smtp_enabled';
118
+ const FALLBACK_SMTP_HOSTNAME = 'fallback_smtp_hostname';
119
+ const FALLBACK_SMTP_PORT = 'fallback_smtp_port';
120
+ const FALLBACK_SMTP_SECURITY = 'fallback_smtp_security';
121
+ const FALLBACK_SMTP_USE_AUTH = 'fallback_smtp_use_auth';
122
+ const FALLBACK_SMTP_USERNAME = 'fallback_smtp_username';
123
+ const FALLBACK_SMTP_PASSWORD = 'fallback_smtp_password';
124
+
125
  // defaults
126
  const DEFAULT_TRANSCRIPT_SIZE = 128;
127
  const DEFAULT_STEALTH_MODE = false;
137
  const DEFAULT_PLUGIN_MESSAGE_SENDER_EMAIL_ENFORCED = false;
138
  const DEFAULT_TEMP_DIRECTORY = '/tmp';
139
 
140
+ public $is_fallback = false;
141
+
142
  // options data
143
  private $options;
144
 
157
  private function __construct() {
158
  $this->load();
159
  }
160
+
161
  public function save() {
162
+ update_option( PostmanOptions::POSTMAN_OPTIONS, $this->options );
163
  }
164
+
165
  public function reload() {
166
  $this->load();
167
  }
168
+
169
  private function load() {
170
+
171
+ $options = get_option( self::POSTMAN_OPTIONS );
172
+
173
+ if ( is_multisite() ) {
174
+ $network_options = get_site_option( self::POSTMAN_NETWORK_OPTIONS );
175
+
176
+ if ( isset( $network_options['post_smtp_global_settings'] ) ) {
177
+ $blog_id = apply_filters( 'post_smtp_default_site_option', 1 );
178
+ } elseif ( $options && isset( $network_options['post_smtp_allow_overwrite'] ) ) {
179
+ $blog_id = get_current_blog_id();
180
+ }
181
+
182
+ switch_to_blog($blog_id);
183
+ $options = get_option( self::POSTMAN_OPTIONS );
184
+ restore_current_blog();
185
+ }
186
+
187
+ $this->options = $options;
188
  }
189
+
190
  public function isNew() {
191
  return ! isset( $this->options [ PostmanOptions::TRANSPORT_TYPE ] );
192
  }
264
  return $this->options [ self::ADDITIONAL_HEADERS ]; }
265
  }
266
  public function getHostname() {
267
+
268
+ if ( $this->is_fallback ) {
269
+ return $this->getFallbackHostname();
270
+ }
271
+
272
  if ( isset( $this->options [ PostmanOptions::HOSTNAME ] ) ) {
273
  return $this->options [ PostmanOptions::HOSTNAME ]; }
274
  }
275
+
276
  public function getPort() {
277
+
278
+ if ( $this->is_fallback ) {
279
+ return $this->getFallbackPort();
280
+ }
281
+
282
  if ( isset( $this->options [ PostmanOptions::PORT ] ) ) {
283
  return $this->options [ PostmanOptions::PORT ]; }
284
  }
285
+
286
  public function getEnvelopeSender() {
287
+
288
+ if ( $this->is_fallback ) {
289
+ return $this->getFallbackUsername();
290
+ }
291
+
292
  if ( isset( $this->options [ PostmanOptions::ENVELOPE_SENDER ] ) ) {
293
  return $this->options [ PostmanOptions::ENVELOPE_SENDER ]; }
294
  }
295
+
296
  public function getMessageSenderEmail() {
297
+
298
+ if ( $this->is_fallback ) {
299
+ return $this->getFallbackUsername();
300
+ }
301
+
302
  if ( isset( $this->options [ PostmanOptions::MESSAGE_SENDER_EMAIL ] ) ) {
303
  return $this->options [ PostmanOptions::MESSAGE_SENDER_EMAIL ]; }
304
  }
314
  if ( isset( $this->options [ PostmanOptions::CLIENT_SECRET ] ) ) {
315
  return $this->options [ PostmanOptions::CLIENT_SECRET ]; }
316
  }
317
+
318
  public function getTransportType() {
319
+
320
+ if ( $this->is_fallback ) {
321
+ return 'smtp';
322
+ }
323
+
324
  if ( isset( $this->options [ PostmanOptions::TRANSPORT_TYPE ] ) ) {
325
  return $this->options [ PostmanOptions::TRANSPORT_TYPE ]; }
326
  }
327
+
328
  public function getAuthenticationType() {
329
+
330
+ if ( $this->is_fallback ) {
331
+ return $this->getFallbackAuth();
332
+ }
333
+
334
  if ( isset( $this->options [ PostmanOptions::AUTHENTICATION_TYPE ] ) ) {
335
  return $this->options [ PostmanOptions::AUTHENTICATION_TYPE ]; }
336
  }
337
+
338
  public function getEncryptionType() {
339
+
340
+ if ( $this->is_fallback ) {
341
+ return $this->getFallbackSecurity();
342
+ }
343
+
344
+
345
  if ( isset( $this->options [ PostmanOptions::SECURITY_TYPE ] ) ) {
346
  return $this->options [ PostmanOptions::SECURITY_TYPE ];
347
  }
348
  }
349
 
350
  public function getUsername() {
351
+
352
+ if ( $this->is_fallback ) {
353
+ return $this->getFallbackUsername();
354
+ }
355
+
356
  if ( defined( 'POST_SMTP_AUTH_USERNAME' ) ) {
357
  return POST_SMTP_AUTH_USERNAME;
358
  }
361
  return $this->options [ PostmanOptions::BASIC_AUTH_USERNAME ];
362
  }
363
  }
 
 
 
 
364
 
365
+ public function getPassword() {
366
+
367
+ if ( $this->is_fallback ) {
368
+ return $this->getFallbackPassword();
369
+ }
370
+
371
+ if ( defined( 'POST_SMTP_AUTH_PASSWORD' ) ) {
372
+ return POST_SMTP_AUTH_PASSWORD;
373
+ }
374
+
375
+ if ( isset( $this->options [ PostmanOptions::BASIC_AUTH_PASSWORD ] ) ) {
376
+ return base64_decode( $this->options [ PostmanOptions::BASIC_AUTH_PASSWORD ] );
377
+ }
378
+ }
379
+
380
+ // Fallback
381
+ public function getFallbackIsEnabled() {
382
+ if ( isset( $this->options [ PostmanOptions::FALLBACK_SMTP_ENABLED ] ) ) {
383
+ return $this->options [ PostmanOptions::FALLBACK_SMTP_ENABLED ];
384
+ }
385
+ return false;
386
+ }
387
+
388
+ public function getFallbackHostname() {
389
+ if ( isset( $this->options [ PostmanOptions::FALLBACK_SMTP_HOSTNAME ] ) ) {
390
+ return $this->options [ PostmanOptions::FALLBACK_SMTP_HOSTNAME ];
391
+ }
392
+ }
393
+
394
+ public function getFallbackPort() {
395
+ if ( isset( $this->options [ PostmanOptions::FALLBACK_SMTP_PORT ] ) ) {
396
+ return $this->options [ PostmanOptions::FALLBACK_SMTP_PORT ];
397
+ }
398
+ }
399
+
400
+ public function getFallbackSecurity() {
401
+ if ( isset( $this->options [ PostmanOptions::FALLBACK_SMTP_SECURITY ] ) ) {
402
+ return $this->options [ PostmanOptions::FALLBACK_SMTP_SECURITY ];
403
+ }
404
+ }
405
+
406
+ public function getFallbackAuth() {
407
+ if ( isset( $this->options [ PostmanOptions::FALLBACK_SMTP_USE_AUTH ] ) ) {
408
+ return $this->options [ PostmanOptions::FALLBACK_SMTP_USE_AUTH ];
409
+ }
410
+ }
411
+
412
+ public function getFallbackUsername() {
413
+ if ( defined( 'POST_SMTP_FALLBACK_AUTH_USERNAME' ) ) {
414
+ return POST_SMTP_FALLBACK_AUTH_USERNAME;
415
+ }
416
+
417
+ if ( isset( $this->options [ PostmanOptions::FALLBACK_SMTP_USERNAME ] ) ) {
418
+ return $this->options [ PostmanOptions::FALLBACK_SMTP_USERNAME ];
419
+ }
420
+ }
421
+
422
+
423
+ public function getFallbackPassword() {
424
+ if ( defined( 'POST_SMTP_FALLBACK_AUTH_PASSWORD' ) ) {
425
+ return POST_SMTP_FALLBACK_AUTH_PASSWORD;
426
+ }
427
+
428
+ if ( isset( $this->options [ PostmanOptions::FALLBACK_SMTP_PASSWORD ] ) ) {
429
+ return base64_decode( $this->options [ PostmanOptions::FALLBACK_SMTP_PASSWORD ] );
430
+ }
431
+ }
432
+
433
+ // End Fallback
434
+
435
  public function getMandrillApiKey() {
436
  if ( defined( 'POST_SMTP_API_KEY' ) ) {
437
  return POST_SMTP_API_KEY;
518
  if ( isset( $this->options [ PostmanOptions::PREVENT_MESSAGE_SENDER_NAME_OVERRIDE ] ) ) {
519
  return $this->options [ PostmanOptions::PREVENT_MESSAGE_SENDER_NAME_OVERRIDE ]; }
520
  }
521
+
522
  public function isEmailValidationDisabled() {
523
  if ( isset( $this->options [ PostmanOptions::DISABLE_EMAIL_VALIDAITON ] ) ) {
524
  return $this->options [ PostmanOptions::DISABLE_EMAIL_VALIDAITON ]; }
525
  }
526
+
527
  /**
528
  * (non-PHPdoc)
529
  *
534
  return $this->isPluginSenderEmailEnforced();
535
  }
536
  public function isPluginSenderEmailEnforced() {
537
+
538
+ if ( $this->is_fallback ) {
539
+ return true;
540
+ }
541
+
542
  if ( $this->isNew() ) {
543
  return self::DEFAULT_PLUGIN_MESSAGE_SENDER_EMAIL_ENFORCED; }
544
  if ( isset( $this->options [ PostmanOptions::PREVENT_MESSAGE_SENDER_EMAIL_OVERRIDE ] ) ) {
Postman/PostmanUtils.php CHANGED
@@ -36,6 +36,10 @@ class PostmanUtils {
36
  * @return string
37
  */
38
  public static function getPageUrl( $slug ) {
 
 
 
 
39
  return get_admin_url() . 'admin.php?page=' . $slug;
40
  }
41
 
@@ -393,6 +397,7 @@ class PostmanUtils {
393
  if ( $logger->isTrace() ) {
394
  $logger->trace( 'Registering admin menu ' . $callbackName );
395
  }
 
396
  add_action( 'admin_menu', array(
397
  $viewController,
398
  $callbackName,
36
  * @return string
37
  */
38
  public static function getPageUrl( $slug ) {
39
+ if ( is_network_admin() ) {
40
+ return network_admin_url( 'admin.php?page=' . $slug );
41
+ }
42
+
43
  return get_admin_url() . 'admin.php?page=' . $slug;
44
  }
45
 
397
  if ( $logger->isTrace() ) {
398
  $logger->trace( 'Registering admin menu ' . $callbackName );
399
  }
400
+
401
  add_action( 'admin_menu', array(
402
  $viewController,
403
  $callbackName,
Postman/PostmanViewController.php CHANGED
@@ -38,10 +38,12 @@ if ( ! class_exists( 'PostmanViewController' ) ) {
38
  add_action( 'admin_init', array( $this, 'registerStylesAndScripts' ), 0 );
39
  add_action( 'wp_ajax_delete_lock_file', array( $this, 'delete_lock_file' ) );
40
  add_action( 'wp_ajax_dismiss_version_notify', array( $this, 'dismiss_version_notify' ) );
 
41
  //add_action( 'admin_init', array( $this, 'do_activation_redirect' ) );
42
 
43
  }
44
 
 
45
  function dismiss_version_notify() {
46
  check_ajax_referer( 'postsmtp', 'security' );
47
 
@@ -307,7 +309,7 @@ if ( ! class_exists( 'PostmanViewController' ) ) {
307
  echo '
308
  <div class="updated settings-error notice is-dismissible">
309
  <p>
310
- <strong>Version ' . $version . ' We have a new Chrome Extension:</strong> <a target="_blank" href="https://postmansmtp.com/post-smtp-1-9-6-new-chrome-extension/">Read Here</a>
311
  </p>
312
  <button style="z-index: 100;" data-version="'. $version . '" data-security="' . wp_create_nonce('postsmtp') .'" type="button" class="notice-dismiss postman-release-message">
313
  <span class="screen-reader-text">Dismiss this notice.</span>
38
  add_action( 'admin_init', array( $this, 'registerStylesAndScripts' ), 0 );
39
  add_action( 'wp_ajax_delete_lock_file', array( $this, 'delete_lock_file' ) );
40
  add_action( 'wp_ajax_dismiss_version_notify', array( $this, 'dismiss_version_notify' ) );
41
+
42
  //add_action( 'admin_init', array( $this, 'do_activation_redirect' ) );
43
 
44
  }
45
 
46
+
47
  function dismiss_version_notify() {
48
  check_ajax_referer( 'postsmtp', 'security' );
49
 
309
  echo '
310
  <div class="updated settings-error notice is-dismissible">
311
  <p>
312
+ <strong>Version ' . $version . ' The SMTP Fallback ( A backup delivery SMTP ):</strong> <a target="_blank" href="https://postmansmtp.com/post-smtp-1-9-7-the-smtp-fallback/">Read Here</a>
313
  </p>
314
  <button style="z-index: 100;" data-version="'. $version . '" data-security="' . wp_create_nonce('postsmtp') .'" type="button" class="notice-dismiss postman-release-message">
315
  <span class="screen-reader-text">Dismiss this notice.</span>
Postman/PostmanWpMail.php CHANGED
@@ -235,6 +235,13 @@ if ( ! class_exists( 'PostmanWpMail' ) ) {
235
  PostmanEmailLogService::getInstance()->writeFailureLog( $log, $message, $engine->getTranscript(), $transport, $e->getMessage() );
236
  }
237
 
 
 
 
 
 
 
 
238
  $mail_error_data = array(
239
  'to' => $message->getToRecipients(),
240
  'subject' => $message->getSubject(),
@@ -248,9 +255,29 @@ if ( ! class_exists( 'PostmanWpMail' ) ) {
248
 
249
  // return failure
250
  return false;
 
251
  }
252
  }
253
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  /**
255
  * Clean up after sending the mail
256
  *
235
  PostmanEmailLogService::getInstance()->writeFailureLog( $log, $message, $engine->getTranscript(), $transport, $e->getMessage() );
236
  }
237
 
238
+ // Fallback
239
+ if ( $this->fallback( $log, $message, $options ) ) {
240
+
241
+ return true;
242
+
243
+ }
244
+
245
  $mail_error_data = array(
246
  'to' => $message->getToRecipients(),
247
  'subject' => $message->getSubject(),
255
 
256
  // return failure
257
  return false;
258
+
259
  }
260
  }
261
 
262
+ private function fallback( $log, $postMessage,$options ) {
263
+
264
+ if ( ! $options->is_fallback && $options->getFallbackIsEnabled() && $options->getFallbackIsEnabled() == 'yes' ) {
265
+
266
+ $options->is_fallback = true;
267
+
268
+ $status = $this->sendMessage( $postMessage, $log );
269
+
270
+ $options->is_fallback = false;
271
+
272
+ return $status;
273
+
274
+ } else {
275
+ $options->is_fallback = false;
276
+ }
277
+
278
+ return false;
279
+ }
280
+
281
  /**
282
  * Clean up after sending the mail
283
  *
postman-smtp.php CHANGED
@@ -3,14 +3,17 @@
3
  * Plugin Name: Post SMTP
4
  * Plugin URI: https://wordpress.org/plugins/post-smtp/
5
  * Description: Email not reliable? Post SMTP is the first and only WordPress SMTP plugin to implement OAuth 2.0 for Gmail, Hotmail and Yahoo Mail. Setup is a breeze with the Configuration Wizard and integrated Port Tester. Enjoy worry-free delivery even if your password changes!
6
- * Version: 1.9.6
7
- * Author: Jason Hendriks, Yehuda Hassine
8
  * Text Domain: post-smtp
9
  * Author URI: https://postmansmtp.com
10
  * License: GPLv2 or later
11
  * License URI: http://www.gnu.org/licenses/gpl-2.0.html
12
  */
13
 
 
 
 
14
  // The Postman Mail API
15
  //
16
  // filter postman_test_email: before calling wp_mail, implement this filter and return true to disable the success/fail counters
@@ -28,8 +31,9 @@
28
  // -- class autoloading
29
  // -- Add dismiss option for "unconfigured message" .. for multisites
30
  // -- customize sent-mail icon WordPress dashboard
31
- // -- multisite support for site-wide email configuration. allow network admin to choose whether subdomains may override with their own settings. subdomains may override with their own settings.
32
  // -- multiple mailbox support
 
 
33
  /**
34
  * DO some check and Start Postman
35
  */
@@ -122,5 +126,5 @@ function post_start( $startingMemory ) {
122
  */
123
  function post_setupPostman() {
124
  require_once 'Postman/Postman.php';
125
- $kevinCostner = new Postman( __FILE__, '1.9.6' );
126
  }
3
  * Plugin Name: Post SMTP
4
  * Plugin URI: https://wordpress.org/plugins/post-smtp/
5
  * Description: Email not reliable? Post SMTP is the first and only WordPress SMTP plugin to implement OAuth 2.0 for Gmail, Hotmail and Yahoo Mail. Setup is a breeze with the Configuration Wizard and integrated Port Tester. Enjoy worry-free delivery even if your password changes!
6
+ * Version: 1.9.7
7
+ * Author: Yehuda Hassine
8
  * Text Domain: post-smtp
9
  * Author URI: https://postmansmtp.com
10
  * License: GPLv2 or later
11
  * License URI: http://www.gnu.org/licenses/gpl-2.0.html
12
  */
13
 
14
+ /*
15
+ * Post SMTP (aka Postman SMTP) was originally developed by Jason Hendriks
16
+ */
17
  // The Postman Mail API
18
  //
19
  // filter postman_test_email: before calling wp_mail, implement this filter and return true to disable the success/fail counters
31
  // -- class autoloading
32
  // -- Add dismiss option for "unconfigured message" .. for multisites
33
  // -- customize sent-mail icon WordPress dashboard
 
34
  // -- multiple mailbox support
35
+
36
+
37
  /**
38
  * DO some check and Start Postman
39
  */
126
  */
127
  function post_setupPostman() {
128
  require_once 'Postman/Postman.php';
129
+ $kevinCostner = new Postman( __FILE__, '1.9.7' );
130
  }
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === Post SMTP Mailer/Email Log ===
2
- Contributors: yehudah ,jasonhendriks
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=yehuda@myinbox.in&item_name=Donation+for+PostSMTP
4
  Tags: postman smtp, postman, smtp, email, mail, mailer, email log, oauth2, gmail, google apps, hotmail, yahoo, mandrill api, sendgrid api, elastic email, office365, mailgun
5
  Requires at least: 3.9
6
  Tested up to: 5.0.3
7
- Stable tag: 1.9.6
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -12,8 +12,9 @@ Send, log and troubleshoot your Outgoing Email easily. Supports everything: SMTP
12
 
13
  == Description ==
14
 
15
- = Version 1.9.6 released - We have a new Chrome extension =
16
- New Chrome extension and small updates. [Read the detailes here](https://postmansmtp.com/post-smtp-1-9-6-new-chrome-extension/)
 
17
 
18
  = The Only SMTP plugin with chrome Notifications =
19
  Get notified if your emails are failing inside your Chrome browser. [Download here](https://chrome.google.com/webstore/detail/post-smtp-notifications/npklmbkpbknkmbohdbpikeidiaekjoch?hl=en-US)
@@ -92,7 +93,7 @@ SendGrid has a free SMTP plan that you can use to send up to 100 emails per day.
92
 
93
  = CREDITS =
94
 
95
- Post SMTP (aka Postman SMTP) plugin was originally created by Jason Hendriks. It is now owned and maintained by Yehuda Hassine.
96
 
97
  == Installation ==
98
 
@@ -289,13 +290,20 @@ To avoid being flagged as spam, you need to prove your email isn't forged. On a
289
 
290
  == Changelog ==
291
 
 
 
 
 
 
 
 
292
  = 1.9.6 - 2019-01-29
293
  * Added support for our new chrome notification extension.
294
  * few fixes
295
 
296
  = 1.9.5 - 2018-10-02
297
  * Added support for Mailgun Europe region.
298
- * Replace "buggey" mime_content_type php function
299
 
300
  = 1.9.4 - 2018-08-03
301
  The most stupid idea ever remove (auto security select)
1
  === Post SMTP Mailer/Email Log ===
2
+ Contributors: yehudah
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=yehuda@myinbox.in&item_name=Donation+for+PostSMTP
4
  Tags: postman smtp, postman, smtp, email, mail, mailer, email log, oauth2, gmail, google apps, hotmail, yahoo, mandrill api, sendgrid api, elastic email, office365, mailgun
5
  Requires at least: 3.9
6
  Tested up to: 5.0.3
7
+ Stable tag: 1.9.7
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
12
 
13
  == Description ==
14
 
15
+ = Version 1.9.7 released - The SMTP Fallback =
16
+ A fallback is a unique solution only exist on Post SMTP.
17
+ You can configure a backup SMTP, so if your emails are failing your site will keep sending emails !!! [Read the detailes here](https://postmansmtp.com/post-smtp-1-9-7-the-smtp-fallback/)
18
 
19
  = The Only SMTP plugin with chrome Notifications =
20
  Get notified if your emails are failing inside your Chrome browser. [Download here](https://chrome.google.com/webstore/detail/post-smtp-notifications/npklmbkpbknkmbohdbpikeidiaekjoch?hl=en-US)
93
 
94
  = CREDITS =
95
 
96
+ Post SMTP (aka Postman SMTP) plugin was originally created by Jason Hendriks.
97
 
98
  == Installation ==
99
 
290
 
291
  == Changelog ==
292
 
293
+ = 1.9.7 - 2019-02-17
294
+ * New: Fallback Feature - Configure a backup SMTP when emails are failing.
295
+ * New: WordPress Multisite compability - with global settings.
296
+ * New: Email Log capability - give other user cheking the logs.
297
+ * Fixed: compatibility with mailster plugin
298
+ * Fixed: Mandrill exception bug - Thanks to Niels de Blaauw from Level-Level
299
+
300
  = 1.9.6 - 2019-01-29
301
  * Added support for our new chrome notification extension.
302
  * few fixes
303
 
304
  = 1.9.5 - 2018-10-02
305
  * Added support for Mailgun Europe region.
306
+ * Replace "buggy" mime_content_type php function
307
 
308
  = 1.9.4 - 2018-08-03
309
  The most stupid idea ever remove (auto security select)