Post SMTP Mailer/Email Log - Version 1.9.5

Version Description

  • 2018-10-02
  • Added support for Mailgun Europe region.
  • Replace "buggey" mime_content_type php function
Download this release

Release Info

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

Code changes from version 1.9.4 to 1.9.5

Postman/Postman-Mail/PostmanMailgunMailEngine.php CHANGED
@@ -1,6 +1,8 @@
1
  <?php
2
  require_once 'mailgun/mailgun.php';
 
3
  use Mailgun\Mailgun;
 
4
 
5
  if ( ! class_exists( 'PostmanMailgunMailEngine' ) ) {
6
 
@@ -18,6 +20,7 @@ if ( ! class_exists( 'PostmanMailgunMailEngine' ) ) {
18
  // the result
19
  private $transcript;
20
 
 
21
  private $apiKey;
22
  private $domainName;
23
  private $mailgunMessage;
@@ -48,6 +51,7 @@ if ( ! class_exists( 'PostmanMailgunMailEngine' ) ) {
48
  */
49
  public function send( PostmanMessage $message ) {
50
  $options = PostmanOptions::getInstance();
 
51
 
52
  // add the Postman signature - append it to whatever the user may have set
53
  if ( ! $options->isStealthModeEnabled() ) {
@@ -161,7 +165,10 @@ if ( ! class_exists( 'PostmanMailgunMailEngine' ) ) {
161
  $this->logger->debug( 'Sending mail' );
162
  }
163
 
164
- $mg = Mailgun::create( $this->apiKey );
 
 
 
165
 
166
  // Make the call to the client.
167
  $result = $this->processSend( $mg );
1
  <?php
2
  require_once 'mailgun/mailgun.php';
3
+
4
  use Mailgun\Mailgun;
5
+ use Mailgun\HttpClientConfigurator;
6
 
7
  if ( ! class_exists( 'PostmanMailgunMailEngine' ) ) {
8
 
20
  // the result
21
  private $transcript;
22
 
23
+ private $api_endpoint;
24
  private $apiKey;
25
  private $domainName;
26
  private $mailgunMessage;
51
  */
52
  public function send( PostmanMessage $message ) {
53
  $options = PostmanOptions::getInstance();
54
+ $this->api_endpoint = ! is_null( $options->getMailgunRegion() ) ? 'https://api.eu.mailgun.net' : 'https://api.mailgun.net';
55
 
56
  // add the Postman signature - append it to whatever the user may have set
57
  if ( ! $options->isStealthModeEnabled() ) {
165
  $this->logger->debug( 'Sending mail' );
166
  }
167
 
168
+ $configurator = new HttpClientConfigurator();
169
+ $configurator->setEndpoint( $this->api_endpoint . '/v3/'. $this->domainName .'/messages');
170
+ $configurator->setApiKey($this->apiKey);
171
+ $mg = Mailgun::configure($configurator);
172
 
173
  // Make the call to the client.
174
  $result = $this->processSend( $mg );
Postman/Postman-Mail/PostmanMailgunTransport.php CHANGED
@@ -9,6 +9,7 @@ class PostmanMailgunTransport extends PostmanAbstractModuleTransport implements
9
  const SLUG = 'mailgun_api';
10
  const PORT = 443;
11
  const HOST = 'api.mailgun.net';
 
12
  const PRIORITY = 8000;
13
  const MAILGUN_AUTH_OPTIONS = 'postman_mailgun_auth_options';
14
  const MAILGUN_AUTH_SECTION = 'postman_mailgun_auth_section';
@@ -43,7 +44,7 @@ class PostmanMailgunTransport extends PostmanAbstractModuleTransport implements
43
  * @return string
44
  */
45
  public function getHostname() {
46
- return self::HOST;
47
  }
48
  /**
49
  * v0.2.1
@@ -128,10 +129,10 @@ class PostmanMailgunTransport extends PostmanAbstractModuleTransport implements
128
  $recommendation ['transport'] = self::SLUG;
129
  $recommendation ['hostname'] = null; // scribe looks this
130
  $recommendation ['label'] = $this->getName();
131
- if ( $hostData->hostname == self::HOST && $hostData->port == self::PORT ) {
132
  $recommendation ['priority'] = self::PRIORITY;
133
  /* translators: where variables are (1) transport name (2) host and (3) port */
134
- $recommendation ['message'] = sprintf( __( ('Postman recommends the %1$s to host %2$s on port %3$d.') ), $this->getName(), self::HOST, self::PORT );
135
  }
136
  return $recommendation;
137
  }
@@ -197,6 +198,11 @@ class PostmanMailgunTransport extends PostmanAbstractModuleTransport implements
197
  $this,
198
  'mailgun_domain_name_callback',
199
  ), PostmanMailgunTransport::MAILGUN_AUTH_OPTIONS, PostmanMailgunTransport::MAILGUN_AUTH_SECTION );
 
 
 
 
 
200
  }
201
  public function printMailgunAuthSectionInfo() {
202
  /* Translators: Where (1) is the service URL and (2) is the service name and (3) is a api key URL */
@@ -214,6 +220,11 @@ class PostmanMailgunTransport extends PostmanAbstractModuleTransport implements
214
  printf( '<input type="text" autocomplete="off" id="mailgun_domain_name" name="postman_options[mailgun_domain_name]" value="%s" size="60" class="required" placeholder="%s"/>', null !== $this->options->getMailgunDomainName() ? esc_attr( $this->options->getMailgunDomainName() ) : '', __( 'Required', Postman::TEXT_DOMAIN ) );
215
  }
216
 
 
 
 
 
 
217
  /**
218
  */
219
  public function registerStylesAndScripts() {
@@ -243,6 +254,10 @@ class PostmanMailgunTransport extends PostmanAbstractModuleTransport implements
243
  printf( '<label for="domain_name">%s</label>', __( 'Domain Name', Postman::TEXT_DOMAIN ) );
244
  print '<br />';
245
  print $this->mailgun_domain_name_callback();
 
 
 
 
246
  print '</section>';
247
  }
248
  }
9
  const SLUG = 'mailgun_api';
10
  const PORT = 443;
11
  const HOST = 'api.mailgun.net';
12
+ const EU_REGION = 'api.eu.mailgun.net';
13
  const PRIORITY = 8000;
14
  const MAILGUN_AUTH_OPTIONS = 'postman_mailgun_auth_options';
15
  const MAILGUN_AUTH_SECTION = 'postman_mailgun_auth_section';
44
  * @return string
45
  */
46
  public function getHostname() {
47
+ return ! is_null( $this->options->getMailgunRegion() ) ? self::EU_REGION : self::HOST;
48
  }
49
  /**
50
  * v0.2.1
129
  $recommendation ['transport'] = self::SLUG;
130
  $recommendation ['hostname'] = null; // scribe looks this
131
  $recommendation ['label'] = $this->getName();
132
+ if ( $hostData->hostname == $this->getHostname() && $hostData->port == self::PORT ) {
133
  $recommendation ['priority'] = self::PRIORITY;
134
  /* translators: where variables are (1) transport name (2) host and (3) port */
135
+ $recommendation ['message'] = sprintf( __( ('Postman recommends the %1$s to host %2$s on port %3$d.') ), $this->getName(), $this->getHostname(), self::PORT );
136
  }
137
  return $recommendation;
138
  }
198
  $this,
199
  'mailgun_domain_name_callback',
200
  ), PostmanMailgunTransport::MAILGUN_AUTH_OPTIONS, PostmanMailgunTransport::MAILGUN_AUTH_SECTION );
201
+
202
+ add_settings_field( PostmanOptions::MAILGUN_REGION, __( 'Mailgun Europe Region?', Postman::TEXT_DOMAIN ), array(
203
+ $this,
204
+ 'mailgun_region_callback',
205
+ ), PostmanMailgunTransport::MAILGUN_AUTH_OPTIONS, PostmanMailgunTransport::MAILGUN_AUTH_SECTION );
206
  }
207
  public function printMailgunAuthSectionInfo() {
208
  /* Translators: Where (1) is the service URL and (2) is the service name and (3) is a api key URL */
220
  printf( '<input type="text" autocomplete="off" id="mailgun_domain_name" name="postman_options[mailgun_domain_name]" value="%s" size="60" class="required" placeholder="%s"/>', null !== $this->options->getMailgunDomainName() ? esc_attr( $this->options->getMailgunDomainName() ) : '', __( 'Required', Postman::TEXT_DOMAIN ) );
221
  }
222
 
223
+ function mailgun_region_callback() {
224
+ $value = $this->options->getMailgunRegion();
225
+ printf( '<input type="checkbox" id="mailgun_region" name="postman_options[mailgun_region]"%s />', null !== $value ? ' checked' : '' );
226
+ }
227
+
228
  /**
229
  */
230
  public function registerStylesAndScripts() {
254
  printf( '<label for="domain_name">%s</label>', __( 'Domain Name', Postman::TEXT_DOMAIN ) );
255
  print '<br />';
256
  print $this->mailgun_domain_name_callback();
257
+ print '<br />';
258
+ printf( '<label for="mailgun_region">%s</label>', __( 'Mailgun Europe Region?', Postman::TEXT_DOMAIN ) );
259
+ print '<br />';
260
+ print $this->mailgun_region_callback();
261
  print '</section>';
262
  }
263
  }
Postman/Postman-Mail/PostmanSendGridMailEngine.php CHANGED
@@ -260,9 +260,10 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) {
260
 
261
  $file_name = basename( $file );
262
  $file_parts = explode( '.', $file_name );
 
263
  $attachments[] = array(
264
  'content' => base64_encode( file_get_contents( $file ) ),
265
- 'type' => mime_content_type( $file ),
266
  'file_name' => $file_name,
267
  'disposition' => 'attachment',
268
  'id' => $file_parts[0],
@@ -279,4 +280,3 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) {
279
  }
280
  }
281
  }
282
-
260
 
261
  $file_name = basename( $file );
262
  $file_parts = explode( '.', $file_name );
263
+ $file_type = wp_check_filetype( $file );
264
  $attachments[] = array(
265
  'content' => base64_encode( file_get_contents( $file ) ),
266
+ 'type' => $file_type['type'],
267
  'file_name' => $file_name,
268
  'disposition' => 'attachment',
269
  'id' => $file_parts[0],
280
  }
281
  }
282
  }
 
Postman/PostmanConfigTextHelper.php CHANGED
@@ -28,13 +28,10 @@ if ( ! class_exists( 'PostmanAbstractConfigTextHelper' ) ) {
28
  */
29
  abstract class PostmanAbstractConfigTextHelper implements PostmanConfigTextHelper {
30
  public function getOAuthHelp() {
31
- $attention = __( 'Attention' );
32
- /* translators: parameters available are 1=portal-url, 2=portal-name, 3=clientId-name, 4=clientSecret-name, 5=callbackUrl, 6=service-name, 7=portal-application (e.g. Open the Google Developer Console, create a Client ID for web application using the URL's displayed below, and copy the Client ID and Client Secret here.) */
33
- $errorMessage = sprintf( __( 'Open the <a href="%1$s" target="_blank">%2$s</a>, create <b>%7$s</b> with the values displayed below, and copy the generated %3$s and %4$s here.', Postman::TEXT_DOMAIN ), $this->getApplicationPortalUrl(), $this->getApplicationPortalName(), $this->getClientIdLabel(), $this->getClientSecretLabel(), $this->getCallbackUrlLabel(), $this->getOwnerName(), $this->getApplicationDescription() );
34
  $text = sprintf( '<b style="color:red">%s!</b> %s', $attention, $errorMessage );
35
- /* translators: parameters available are 1=clientId-name, 2=service-name, 3=FAQ-URL, 4=Video-URL (e.g. See How do I get a Google Client ID? in the F.A.Q.) */
36
- $howToTemplate = __( 'See <a href="%3$s" target="_blank">How do I get a %1$s %2$s?</a> in the F.A.Q. or <a href="%4$s" target="_blank">watch our How-To video 📺</a>.', Postman::TEXT_DOMAIN );
37
- $text .= sprintf( ' %s', sprintf( $howToTemplate, $this->getOwnerName(), $this->getClientIdLabel(), 'https://wordpress.org/plugins/post-smtp/faq/', 'https://vimeo.com/128589255' ) );
38
  return $text;
39
  }
40
  function isOauthHost() {
28
  */
29
  abstract class PostmanAbstractConfigTextHelper implements PostmanConfigTextHelper {
30
  public function getOAuthHelp() {
31
+ $attention = __( 'Attention', Postman::TEXT_DOMAIN );
32
+ $errorMessage = sprintf( __('Check this article how to configure Gmail/Gsuite OAuth:<a href="%1$s" target="_blank">Read Here</a>', Postman::TEXT_DOMAIN ), 'https://postmansmtp.com/how-to-configure-post-smtp-with-gmailgsuite-using-oauth/' );
 
33
  $text = sprintf( '<b style="color:red">%s!</b> %s', $attention, $errorMessage );
34
+
 
 
35
  return $text;
36
  }
37
  function isOauthHost() {
Postman/PostmanInputSanitizer.php CHANGED
@@ -54,6 +54,7 @@ if ( ! class_exists( 'PostmanInputSanitizer' ) ) {
54
  $this->sanitizeString( 'From Name Override', PostmanOptions::PREVENT_MESSAGE_SENDER_NAME_OVERRIDE, $input, $new_input );
55
  $this->sanitizeString( 'From Email Override', PostmanOptions::PREVENT_MESSAGE_SENDER_EMAIL_OVERRIDE, $input, $new_input );
56
  $this->sanitizeString( 'Disable Email Validation', PostmanOptions::DISABLE_EMAIL_VALIDAITON, $input, $new_input );
 
57
  $this->sanitizeString( 'Forced To Recipients', PostmanOptions::FORCED_TO_RECIPIENTS, $input, $new_input );
58
  $this->sanitizeString( 'Forced CC Recipients', PostmanOptions::FORCED_CC_RECIPIENTS, $input, $new_input );
59
  $this->sanitizeString( 'Forced BCC Recipients', PostmanOptions::FORCED_BCC_RECIPIENTS, $input, $new_input );
54
  $this->sanitizeString( 'From Name Override', PostmanOptions::PREVENT_MESSAGE_SENDER_NAME_OVERRIDE, $input, $new_input );
55
  $this->sanitizeString( 'From Email Override', PostmanOptions::PREVENT_MESSAGE_SENDER_EMAIL_OVERRIDE, $input, $new_input );
56
  $this->sanitizeString( 'Disable Email Validation', PostmanOptions::DISABLE_EMAIL_VALIDAITON, $input, $new_input );
57
+ $this->sanitizeString( 'Mailgun Europe Region', PostmanOptions::MAILGUN_REGION, $input, $new_input );
58
  $this->sanitizeString( 'Forced To Recipients', PostmanOptions::FORCED_TO_RECIPIENTS, $input, $new_input );
59
  $this->sanitizeString( 'Forced CC Recipients', PostmanOptions::FORCED_CC_RECIPIENTS, $input, $new_input );
60
  $this->sanitizeString( 'Forced BCC Recipients', PostmanOptions::FORCED_BCC_RECIPIENTS, $input, $new_input );
Postman/PostmanOptions.php CHANGED
@@ -87,6 +87,7 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
87
  const SENDGRID_API_KEY = 'sendgrid_api_key';
88
  const MAILGUN_API_KEY = 'mailgun_api_key';
89
  const MAILGUN_DOMAIN_NAME = 'mailgun_domain_name';
 
90
  const PREVENT_MESSAGE_SENDER_NAME_OVERRIDE = 'prevent_sender_name_override';
91
  const PREVENT_MESSAGE_SENDER_EMAIL_OVERRIDE = 'prevent_sender_email_override';
92
  const CONNECTION_TIMEOUT = 'connection_timeout';
@@ -317,6 +318,12 @@ if ( ! class_exists( 'PostmanOptions' ) ) {
317
  }
318
  }
319
 
 
 
 
 
 
 
320
  public function getPushoverUser() {
321
  if ( isset( $this->options [ PostmanOptions::PUSHOVER_USER ] ) ) {
322
  return base64_decode( $this->options [ PostmanOptions::PUSHOVER_USER ] );
87
  const SENDGRID_API_KEY = 'sendgrid_api_key';
88
  const MAILGUN_API_KEY = 'mailgun_api_key';
89
  const MAILGUN_DOMAIN_NAME = 'mailgun_domain_name';
90
+ const MAILGUN_REGION = 'mailgun_region';
91
  const PREVENT_MESSAGE_SENDER_NAME_OVERRIDE = 'prevent_sender_name_override';
92
  const PREVENT_MESSAGE_SENDER_EMAIL_OVERRIDE = 'prevent_sender_email_override';
93
  const CONNECTION_TIMEOUT = 'connection_timeout';
318
  }
319
  }
320
 
321
+ public function getMailgunRegion() {
322
+ if ( isset( $this->options [ PostmanOptions::MAILGUN_REGION ] ) ) {
323
+ return $this->options [ PostmanOptions::MAILGUN_REGION ];
324
+ }
325
+ }
326
+
327
  public function getPushoverUser() {
328
  if ( isset( $this->options [ PostmanOptions::PUSHOVER_USER ] ) ) {
329
  return base64_decode( $this->options [ PostmanOptions::PUSHOVER_USER ] );
Postman/PostmanViewController.php CHANGED
@@ -307,7 +307,7 @@ if ( ! class_exists( 'PostmanViewController' ) ) {
307
  echo '
308
  <div class="updated settings-error notice is-dismissible">
309
  <p>
310
- <strong>Version ' . $version . ' I do mistakes too - A must read:</strong> <a target="_blank" href="https://postmansmtp.com/post-smtp-1-9-4-im-only-human/">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>
307
  echo '
308
  <div class="updated settings-error notice is-dismissible">
309
  <p>
310
+ <strong>Version ' . $version . ' Mailgun Europe region support:</strong> <a target="_blank" href="https://postmansmtp.com/post-smtp-1-9-5-mailgun-europe-region-support/">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>
postman-smtp.php CHANGED
@@ -1,10 +1,9 @@
1
  <?php
2
-
3
  /*
4
  * Plugin Name: Post SMTP
5
  * Plugin URI: https://wordpress.org/plugins/post-smtp/
6
  * 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!
7
- * Version: 1.9.4
8
  * Author: Jason Hendriks, Yehuda Hassine
9
  * Text Domain: post-smtp
10
  * Author URI: https://postmansmtp.com
@@ -123,5 +122,5 @@ function post_start( $startingMemory ) {
123
  */
124
  function post_setupPostman() {
125
  require_once 'Postman/Postman.php';
126
- $kevinCostner = new Postman( __FILE__, '1.9.4' );
127
  }
1
  <?php
 
2
  /*
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.5
7
  * Author: Jason Hendriks, Yehuda Hassine
8
  * Text Domain: post-smtp
9
  * Author URI: https://postmansmtp.com
122
  */
123
  function post_setupPostman() {
124
  require_once 'Postman/Postman.php';
125
+ $kevinCostner = new Postman( __FILE__, '1.9.5' );
126
  }
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === Post SMTP Mailer/Email Log ===
2
- Contributors: yehudah, abdullahramzan ,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: 4.9.7
7
- Stable tag: 1.9.4
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -12,8 +12,8 @@ Send, log and troubleshoot your Outgoing Email easily. Supports everything: SMTP
12
 
13
  == Description ==
14
 
15
- = Version 1.9.4 released - A MUST READ FOR EXISTING USERS =
16
- I tryed to do stuff simple and I just the did opposite. [Read the detailes here](https://postmansmtp.com/post-smtp-1-9-4-im-only-human/)
17
 
18
  = WordPress Mail SMTP Plugin =
19
 
@@ -175,18 +175,7 @@ There are many reasons why OAuth 2.0 is better than any password-based mechanism
175
  To use OAuth, your website needs it's own Client ID. The Client ID is used to control authentication and authorization and is tied to the specific URL of your website. If you manage several websites, you will need a different Client ID for each one.
176
 
177
  = How do I get a Google Client ID? (For Gmail users only!) =
178
-
179
- https://vimeo.com/128589255
180
-
181
- 1. Go to [Google Developer's Console](https://www.google.com/accounts/Logout?continue=https://console.developers.google.com/start/api?id=gmail) and login with the same email address that you are configuring Post with.
182
- 1. Choose 'Create a New Project'. This project will be for Post SMTP only.
183
- 1. Select 'Consent Screen' from under 'APIs & auth'. Into 'Email address' choose the correct Gmail address and in 'Product name' put 'Post SMTP'. Choose 'Save'.
184
- 1. Select 'Credentials' from under 'APIs & auth'. Choose 'Create a new Client ID'.
185
- 1. For the 'Application Type' use 'Web application'.
186
- 1. In 'Authorized Javascript origins' enter the 'Javascript Origins' given by Post (either from the wizard[[screenshot]](http://plugins.svn.wordpress.org/Post-smtp/assets/examples/Screen_Shot_2015-03-06_at_2_34_22_PM.png), or from the manual configuration page[[screenshot]](http://plugins.svn.wordpress.org/Post-smtp/assets/examples/Screen_Shot_2015-03-06_at_2_44_48_PM.png)).
187
- 1. In 'Authorized Redirect URIs' enter the 'Redirect URI' given by Post (either from the wizard[[screenshot]](http://plugins.svn.wordpress.org/Post-smtp/assets/examples/Screen_Shot_2015-03-06_at_2_34_22_PM.png), or from the manual configuration page[[screenshot]](http://plugins.svn.wordpress.org/Post-smtp/assets/examples/Screen_Shot_2015-03-06_at_2_44_48_PM.png)).
188
- 1. Choose 'Create Client ID'.
189
- 1. Enter the Client ID and Client Secret displayed here into Post's settings page [screenshot](https://ps.w.org/Post-smtp/assets/screenshot-7.png?rev=1108485).
190
 
191
  = How do I get a Microsoft Client ID? (For Hotmail/Live/Outlook.com users only!) =
192
  1. Go to [Microsoft account Developer Center](https://account.live.com/developers/applications/index) and select 'Create application'.
@@ -296,6 +285,10 @@ To avoid being flagged as spam, you need to prove your email isn't forged. On a
296
 
297
 
298
  == Changelog ==
 
 
 
 
299
  = 1.9.4 - 2018-08-03
300
  The most stupid idea ever remove (auto security select)
301
 
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: 4.9.9
7
+ Stable tag: 1.9.5
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.5 released - Mailgun Europe region support =
16
+ Small updates but important to read. [Read the detailes here](https://postmansmtp.com/post-smtp-1-9-5-mailgun-europe-region-support/)
17
 
18
  = WordPress Mail SMTP Plugin =
19
 
175
  To use OAuth, your website needs it's own Client ID. The Client ID is used to control authentication and authorization and is tied to the specific URL of your website. If you manage several websites, you will need a different Client ID for each one.
176
 
177
  = How do I get a Google Client ID? (For Gmail users only!) =
178
+ Go to [Configure Post SMTP with Gmail\Gsuite OAuth](https://postmansmtp.com/how-to-configure-post-smtp-with-gmailgsuite-using-oauth/)
 
 
 
 
 
 
 
 
 
 
 
179
 
180
  = How do I get a Microsoft Client ID? (For Hotmail/Live/Outlook.com users only!) =
181
  1. Go to [Microsoft account Developer Center](https://account.live.com/developers/applications/index) and select 'Create application'.
285
 
286
 
287
  == Changelog ==
288
+ = 1.9.5 - 2018-10-02
289
+ * Added support for Mailgun Europe region.
290
+ * Replace "buggey" mime_content_type php function
291
+
292
  = 1.9.4 - 2018-08-03
293
  The most stupid idea ever remove (auto security select)
294