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