Post SMTP Mailer/Email Log


Version 2.0.2 released – Sendgrid code fix and default delivery changes

Read the detailes here

The Only SMTP plugin with chrome Notifications

Get notified if your emails are failing inside your Chrome browser. Download here

WordPress 電子郵件 SMTP 寄件外掛

Postman SMTP (現稱 Post SMTP) 強勢回歸

No need to search for another SMTP plugin anymore.

Post 是次世代 SMTP 郵件程式,可協助傳送 WordPress 網站所產生的電子郵件。Post 是第一個、也是唯一一個支援最新安全標準的外掛。透過 OAuth 2.0 驗證方式,不再需要電子郵件帳號的密碼儲存於有洩漏可能的 WordPress 資料庫中。

[連線測試] 及智慧型 [設定小幫手] 會掃描 SMTP 伺服器,以便檢測防火牆封鎖狀態並處理設定上的錯誤,而內建的 [電子郵件記錄]診斷電子郵件問題的絕佳方式。即使是 GoDaddy 或 Bluehost 這類會封鎖標準 SMTP 通訊埠的主機,在網站無法使用使用 SMTP 通訊協定時,也不能阻擋 Post SMTP 透過 HTTPS 傳送電子郵件

Post SMTP 並不像 WP Bank 或 Easy SMTP 是 WP Mail SMTP 這個外掛的分支專案。它以可進行高負載的 Zend_Mail,取代了 WordPress 預設的 SMTP 函式庫 PHPMailer,而絕不再因為 PHP mail() 導致錯漏郵件


請觀賞設定 Post SMTP 使用 Google/G Suite 或任何 SMTP 服務有多快速簡單的影片。


  • 透過便於使用、功能完整的 [設定小幫手] 完成最合適的設定
  • 以商業級 [連線測試] 工具診斷伺服器問題
  • 記錄、重傳所有傳送失敗的郵件,以及查看郵件傳送失敗的確切原因
  • 支援國際字母HTML 郵件MultiPart/Alternative
  • 支援強制回覆給副本 (cc)、密件副本 (bcc)、收件者 (to) 以及自訂郵件標頭
  • 支援簡單驗證及安全性階層 (SASL):Plain/Login/CRAM-MD5/XOAUTH2 驗證
  • 支援安全性傳輸:SMTPS 以及 STARTTLS (SSL/TLS)
  • 可將設定複製至其他 Post SMTP 執行實體

OAuth 2.0 功能

  • 支援 Gmail、Hotmail 及 Yahoo 個別專有的 OAuth 2.0 實作
  • 設定完畢後便會持續傳送,即使帳號所屬密碼變更也不受影響
  • Gmail:透過 OAuth 2.0 與 Gmail API 的結合效果,Post 可以完成其他外掛無法成功傳送的郵件

API (HTTPS) Email Support

  • Gmail API for sending Gmail and Google Apps email (requires a Google account)
    Often bloggers and small business owners don’t want to use third-party SMTP services. Well you can use your Gmail or G Suite account for SMTP emails.
    Check the guide I wrote

  • Mandrill API for sending any email (requires a Mandrill account)
    Mandrill is an email infrastructure service offered as an add-on for MailChimp that you can use to send personalized, one-to-one e-commerce emails, or automated transactional emails.

  • Mailgun API for sending any email (requires a Mailgun account)
    Mailgun SMTP is a popular SMTP service provider that allows you to send large quantities of emails. They allow you to send your first 10,000 emails for free every month.

  • SendGrid API for sending any email (requires a SendGrid account and PHP 5.3)
    SendGrid has a free SMTP plan that you can use to send up to 100 emails per day. With our native SendGrid SMTP integration, you can easily and securely set up SendGrid SMTP on your WordPress site.

Post SMTP 需要你對本地化予以協助!如果你是非英語系的譯者,歡迎加入本地化的行列!



  • WordPress 3.9 及包含標準 PHP 函式庫 (SPL) 及 iconv 的 PHP 5.6
  • 記憶體:每個閒置處理程序需要 750KB
  • 穩定可靠的自訂網域郵件傳送需要正確的 SPF 記錄
  • 穩定可靠的 SMTP 傳送需要電子郵件服務提供商的存取憑證
  • Outh 2.0 功能需要 Gmail、Hotmail 或 Yahoo Mail 的 OAuth 2.0 憑證


Post SMTP (aka Postman SMTP) plugin was originally created by Jason Hendriks.

授予 OAuth 權限時的錯誤訊息

Please note that the Client ID and Client Secret fields are NOT for your username and password. They are for OAuth Credentials only.

Error authenticating with this Client ID. [Error executing wp_remote_post: The user has blocked requests via HTTP.]

Your WordPress site is configured with WP_HTTP_BLOCK_EXTERNAL to prevent outbound connections. Add a whitelist rule to wp-config.php:

define(‘WP_ACCESSIBLE_HOSTS’, ‘,,’);

Error authenticating with this Client ID. [Error executing wp_remote_post: Failed to connect to xxxx]

There is a firewall on port 443 between you and the OAuth2 server. Open up the port for outbound connections.

Error: redirect_uri_mismatch

  • You did not enter the Redirect URI correctly, watch the instructional video
  • You used an IP address instead of a domain name (not allowed)

Error: invalid_client … no support email

You’ve forgotten to choose an email address in the consent screen.

SMTP 錯誤訊息

Communication Error [334] – make sure the Envelope From Email is the same account used to create the Client ID.

  • This is almost always caused by being logged in to Google/Microsoft/Yahoo with a different user than the one Post is configured to send mail with. Logout and try again with the correct user
  • Login to Webmail and see if there is an “Unusual Activity” warning waiting for your attention


  • Your host may have installed a firewall between you and the server. Ask them to open the ports.
  • Your may have tried to (incorrectly) use SSL over port 587. Check your encryption and port settings.

Operation Timed out

  • Your host may have poor connectivity to the mail server. Try doubling the Read Timeout.
  • Your host may have installed a firewall (DROP packets) between you and the server. Ask them to open the ports.
  • Your may have tried to (incorrectly) use TLS over port 465. Check your encryption and port settings.

Connection refused

Your host has likely installed a firewall (REJECT packets) between you and the server. Ask them to open the ports.

503 Bad sequence of commands

You configured TLS security when you should have selected no security.

XOAUTH2 authentication mechanism not supported

You may be on a Virtual Private Server that is playing havoc with your communications. Jump ship.

Mail ends up in the Spam folder

To avoid being flagged as spam, you need to prove your email isn’t forged. On a custom domain, its up to YOU to set that up:

  • Ensure you are using the correct SMTP server with authentication – the correct SMTP server is the one defined by your email service’s SPF record
  • If you use a custom domain name for email, add an SPF record to your DNS zone file. The SPF is specific to your email provider, for example Google
  • If you use a custom domain name for email, add a DKIM record to your DNS zone file and upload your Domain Key (a digital signature) to, for example Google


  • WordPress Dashboard showing both the Post widget and At a Glance widget
  • Main Settings screen - shows Main Menu and current status (new installation)
  • Setup Wizard (step 1) - Import data from other plugins
  • Setup Wizard (step 4) - Connectivity Test
  • Manual Configuration - Account Settings: Password Authentication
  • Manual Configuration - Account Settings: OAuth 2.0 Authentication
  • Manual Configuration - Message Settings
  • Manual Configuration - Advanced Settings
  • Test Email utility screen - Oops! Wrong password
  • 電子郵件記錄畫面
  • [連線測試] 工具畫面
  • Diagnostic Information screen
  • 電子郵件記錄篩選程式


若要穩定可靠地傳送電子郵件,你必須使用指派給該電子郵件的 SMTP 伺服器。如果 Post 無法連線至正確的 SMTP 伺服器,請要求主機服務提供商為你使用的主機開啟必要的通訊埠,或建立一個受到主機商管理的電子郵件帳號,不然就更換主機服務提供商。

使用 [連線測試] 工具能讓你知道哪些是可使用的通訊埠,以及你下一步可以進行的操作。

簡易安裝與設定 (建議所有使用者採用)

  1. 透過 WordPress 管理後台的 [外掛] 選單安裝並啟用 Post 外掛。
  2. 在 WordPress 管理後台的 [設定] 選單中按一下 [Post SMTP]。
  3. 按一下 [設定小幫手] 並依照說明完成所有設定步驟。

手動設定密碼驗證 (僅供中階使用者參考)

  1. Choose configure manually
  2. In ‘Transport’, choose ‘SMTP’
  3. In ‘Outgoing Mail Server Hostname’, enter the SMTP Server’s hostname
  4. In ‘Outgoing Mail Server Port’, enter the SMTP Server’s port
  5. In ‘Security’ choose the appropriate type (a good guess is SMTPS for port 465, STARTTLS otherwise)
  6. In ‘Authentication’, choose the authentication type (a good guess is ‘Plain’)
  7. If your Authentication method is not ‘None’, enter your username (probably your email address) and password.
  8. Choose the ‘Message’ tab.
  9. In ‘Envelope From Address’ enter your email address. This MUST be the same address you login to webmail with.
  10. In ‘Message From Address’ enter your email address. Or this can be an alias, mailing list, or group email if you wish.
  11. 點擊 [儲存變更] 按鈕。
  12. 傳送一封測試用電子郵件。

手動設定 OAuth 2.0 驗證 (僅供高階使用者參考)

  1. Choose configure manually
  2. In ‘Transport’, choose ‘SMTP’
  3. In ‘Outgoing Mail Server Hostname’, enter the SMTP Server’s hostname
  4. In ‘Outgoing Mail Server Port’, enter the SMTP Server’s port
  5. In ‘Security’ choose the appropriate type (a good guess is SMTPS for port 465, StartTLS otherwise)
  6. In ‘Authentication’ choose ‘OAuth 2.0’
  7. Post will give you a link to the Client ID maintenance page of your email service provider. Create a Client ID for your WordPress site.. instructions for this are detailed in the FAQ
  8. Copy your generated Client ID and Client secret into the plugin’s Settings page.
  9. Choose the ‘Message’ tab.
  10. In ‘Envelope From Address’ enter your email address. This MUST be the same address you login to webmail with.
  11. In ‘Message From Address’ enter your email address. Or this can be an alias, mailing list, or group email if you wish.
  12. 點擊 [儲存變更] 按鈕。
  13. Choose the ‘Request OAuth2 Permission’ link and follow the instructions.
  14. 傳送一封測試用電子郵件。

Post is developed on OS X with PHP 5.5.14 and Apache 2.4.9. Post is tested in a Red Hat OpenShift environment with PHP 5.3.3 and Apache 2.2.15 with Gmail, Hotmail and Yahoo Mail (US). Post is tested with


Postman SMTP 還在嗎?

我可以這麼說,大約從 2015 年 11 月 8 日左右,原開發者 Jason 就停止了對 Postman SMTP 外掛的維護。


What is OAuth 2.0?

A modern replacement for traditional password-based authentication. Post supports the OAuth 2.0 implementations of all three major e-mail providers: Gmail, Hotmail and Yahoo Mail.

How does OAuth 2.0 work?

Post requests a limited access OAuth 2.0 token (valet key) to access the APIs (enter the house) and perform a specific service (handle Gmail, stay out of Google Docs) with no need for you to surrender your username and password credentials (master house key).

Once access is granted, Post commandeers the WordPress wp_mail() function to provide an incredibly stable mail sub-system.

Can’t I just tell Google to allow less secure apps and keep using my old password?

Google does have a setting to allow less secure apps but this option is not available if you’re using Google Apps to manage a domain.

There are many reasons why OAuth 2.0 is better than any password-based mechanism:

  • Post will never ask for your password, so your password can’t be stolen
  • If you change your password regularly, you will never have to update Post’s configuration
  • You have tighter control over the data Post has access to. For Google users it can never access your Calendar or Docs or YouTube; for Yahoo users it can never access your Flickr
  • If your WordPress site gets hacked, you can revoke Post’s email access without impacting any other application or website that has access to your account

NEVER give out your Gmail, Microsoft or Yahoo password to a 3rd-party or 3rd-party program that you don’t fully trust.

What is a Client ID?

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.

How do I get a Google Client ID? (For Gmail users only!)

Go to Configure Post SMTP with Gmail\Gsuite OAuth

How do I get a Microsoft Client ID? (For Hotmail/Live/ users only!)
  1. Go to Microsoft account Developer Center and select ‘Create application’.
  2. In the ‘Application name’ field enter ‘Post SMTP’. Select ‘I accept.’
  3. Select ‘API Settings’ from under ‘Settings’.
  4. In ‘Redirect URL’, enter the redirect URI given by Post (either from the wizard, or from the manual configuration page). Select Save.
  5. Select ‘App Settings’ from under ‘Settings’.
  6. Enter the Client ID and Client Secret displayed here into Post’s settings page.
How do I get a Yahoo Client ID? (For Yahoo Mail users only!)
  1. Go to Yahoo Developer Network and select ‘Create an App’.
  2. In the ‘Application Name’ field enter ‘Post SMTP’. For ‘Application Type’ choose ‘Web Application’.
  3. In ‘Home Page URL’, enter the ‘Home Page URL’ given by Post.
  4. In ‘Callback Domain’, enter the ‘Callback Domain’ given by Post.
  5. Under ‘API Permissions’ choose ‘Mail’. Under ‘Mail’ choose ‘Read/Write’
  6. Click ‘Create App’
  7. Enter the Client ID and Client Secret displayed here into Post’s settings page.
How can I revoke Post’s OAuth 2.0 access?


Failsafe Delivery and Great Support

Post SMTP is the bees knees, I use this on every website I touch. It's my opinion that bugs are unavoidable and one of the most important ways to judge whether you can trust your project to a plugin is how the developer/team responds to those bugs. Post SMTP recently had a small hiccup that caused some emails to fail to deliver and here's what happened: - The plugin caught my failed emails in its log. - The developer responded to my email within an hour asking for more information and attempting to help any way possible. - He offered a workaround temporary solution almost immediately - I was then able to 'resend' all of the emails directly from Post SMTP - He sent me a dev version of the plugin that fixed the problem within a day - That patch went live in another day. A++++ can't recommend enough

helps with lame godaddy hosting

This is a very helpful plugin for the site that my client is hosting on Godummy, er, I mean, Godaddy. Email simply would not send from several contact forms without this helpful add-on. Updates are regular and helpful. Bravo! Thanks to the Author!


Hi, I just updated and I get an error ??? Warning: require_once(Phpmailer/PostsmtpMailer.php): failed to open stream: No such file or directory in Fatal error: require_once(): Failed opening required 'Phpmailer/PostsmtpMailer.php' (include_path='.:/opt/plesk/php/7.3/share/pear') in

Great plugin!

There is a lot of big SMTP plugins available, and I tried many of them, and always be unsatisfied. I find this plugin and made a try and everything was PERFECT! Even better, I contact the owner of the plugin and I get quick efficient answers. So I can only recommend this plugin!
閱讀全部 130 則使用者評論


Post SMTP Mailer/Email Log 外掛為開源軟體。以下人員為這個外掛做出了重大貢獻。


Post SMTP Mailer/Email Log 外掛目前已有 7 個本地化語言版本。 感謝全部譯者為這個外掛做出的貢獻。

將 Post SMTP Mailer/Email Log 外掛本地化為台灣繁體中文版


任何人均可瀏覽程式碼、查看 SVN 存放庫,或透過 RSS 訂閱開發記錄


= 2.0.2 – 2019-05-19
* Fixed: Sendgrid code fix.
* Fixed: Default method (nothing configured) will use the default mail on the server and not SMTP.

= 2.0.1 – 2019-05-15
* New: Mailer Type – Added an option to send without overwrite the ‘wp_mail’ function, better compability to WordPress delivery. hopefully will be the default in the future.
* Updated: Sendgrid API was upgraded and rewritten to the new version.
* Fixed: Message-Id header was missing on SMTP
* Fixed: Email logger optimization – better query for large amount of records.
* Fixed: The localization was fixed to match translation system ( Thanks to Niels de Blaauw from Level-Level ).
* Fixed: Code and optimization ( Thanks to Niels de Blaauw from Level-Level ).

= 1.9.8 – 2019-02-18
* New: a new from field to the fallback – Can’t trust the username as “from” value (email address).

= 1.9.7 – 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

= 1.9.6 – 2019-01-29
* Added support for our new chrome notification extension.
* few fixes

= 1.9.5 – 2018-10-02
* Added support for Mailgun Europe region.
* Replace “buggy” mime_content_type php function

= 1.9.4 – 2018-08-03
The most stupid idea ever remove (auto security select)

= 1.9.3 – 2018-07-26
Removed auto configure for port 25 (can be TLS)

= 1.9.2 – 2018-07-23
Removed deprecated functions from 7.2 + comment unready feature

= 1.9.1 – 2018-07-22
Syntx stupid mistake

= 1.9.0 – 2018-07-22
* Better support for secure delivery
* Support for constants auth (inside wp-config), check the detailes our Blog
* Automatic encryption select base on the port input – 25, 465, 587, 2525

= 1.8.9 – 2018-04-24
* Sendgrid bug

= 1.8.8 – 2018-04-24
* file added to svn – contactform7

= 1.8.6 – 2018-04-24
* Fix lockfile erros
* Contact form 7 integration
* PHP 5.6 requirement

= 1.8.5 – 2018-04-19
* Remove Beta Woocommerce integration
* Better check for WPML less then version 3.9

= 1.8.4 – 2018-04-18
* New: Multiple notification options to failed emails
* Upgrade: The Gmail code was upgraded and code change to support large attachments
* Add: Fix release lock file error
* Change: “Not configured…” message is now dismissible

= 1.8.3 – 2018-03-21
* Fix: SendGrid API Call Structure (The previous try didn’t work)

= 1.8.2 – 2018-03-21
* Fix: SendGrid API Call Structure

= 1.8.1 – 2018-03-20
* New: Sendgrid API & Client Version 6
* New: Add email log ‘send to’ column
* Fix: fallback emails on hosting require the ‘-f’ parameter
* Fix: Using hostname insted of an IP
* Fix: Remove mailgun test folder ( virustotal issue )
* Fix: Additional bugs collected from support tickets.
* Added: added filters to from_name and from_email filters (local connection)
* change hostname extrect logic

= 1.8 – 2017-12-24
* New: Mailgun API integration
* New: New filter controls
* New: WPML conflict fix
* Fix: Minor old bugs

1.7.10 – 2017-11-21

* Fixed: bug while detecting transcript error

= 1.7.9 – 2017-11-20
* Fixed: misspled false
* Fixed: feedback form
* Fixed: Some localization strings
* Removed: deprecated function
* New: Option to input emails when resend email
* Added: explain message on email log filter

= 1.7.8 – 2017-11-17
* = Menu Items grouping =
* Fixed: IP detection error in some web hosts
* Fixed: Link open in new page attribute = _blank
* Fixed: Replace deprecated PHP 7 functions.
* Updated: Validator TLD’s list
* Added: Email log date and search filter.
* Added: Alert on sending error (Fallback to local mail)
* Added: Email body preview (not raw)

= 1.7.7 – 2017-10-17
* Fixed: Error sending files with sendgrid
* Fixed: Wrong attachments format in Mandrill
* Fixed: Wrong Sender Header in Mandrill

= 1.7.6 – 2017-10-17
* Missing sendgrid files
* Fixed: Localization slug

1.7.5 – 2017-10-07

  • Fixed: security issue (XSS)
  • Fixed: Small bug with Google API

1.7.2 – 2015-11-08

  • [Ticket] – v1.7 ignores the content-type header set in the Additional Headers. Fixed.
  • [Ticket] – Fixed an issue where v1.7 admin screens crash for non-admin users when Post is not configured. Fixed a multiste issue where v1.7 site admins lose access to their Post settings screen. Special thank-you to Domi2015 for giving me access for testing! 🙂
  • Localized jQuery Validation messages
  • Localized MyMail messages
  • Put the local translation files back, as WordPress on-line translations do not work as advertised

1.7.1 – 2015-11-05

  • [Ticket] – the Optimizepress plugin calls wp_mail before the WordPress init hook, before Post is fully initialized, so I made a change to accomodate this behavior
  • [Ticket] – v1.7 admin screen may become inaccessible after upgrading. Fixed.
  • [Ticket] – v1.7 breaks compatibility with WordPress Leads. Fixed.

1.7.0 “Iliana” – 2015-11-03

  • Happy Halowe’en! 30,000 installations! – 2015-10-31
  • Integrated Mandrill API
  • Integrated SendGrid API
  • Language files have been removed from the plugin as translations are now performed on-line. If you are a non-English speaker please constribute!
  • Post commandeers email when activated and sends using the WordPress default of localhost:25 – this is for people who want to use it to diagnose email problems without configuring SMTP
  • Re-send failed e-mails from the Email Log screen
  • Added an internal ‘manage_Post_smtp’ capability for advanced management with, for example, User Role Editor
  • [Ticket][Ticket] Added an import/export tab to the Advanced Configuration screen for those who want to duplicate settings between sites.
  • [Ticket] Added option to disable e-mail address validation
  • [Ticket] Fix for fatal error when using a non-administrator in the admin menu.

1.6.24 – 2015-09-10

  • 20,000 installations! – 2015-09-09
  • Translated into Greek, thank-you Michael Kotsarinis!
  • Diagnostic Test displays all the wp_mail-related hooks of active plugins and themes
  • When validating e-mail addresses, Post will disclose which field has a validation issue in the error message
  • Default log entries bumped from 10 to 250
  • [Ticket] Added nasty fake input field hack to prevent browsers from autofilling username/password fields.
  • [Ticket] Added a warning to the Email Log for emails that have an empty subject line
  • [Ticket] Test Email detects Ajax errors and displays them in the Status window
  • [Ticket] Removed the references to images in Post’s copy of jquery-ui.css causing HTTP 404
  • [Ticket] Fixed an Ajax name collision with the plugin MemberPress
  • [Ticket] Some sites can not handle International (UTF-8) characters in the Test Email. Fixed.
  • [Ticket] Fix for PHP Notice: Undefined offset: 1 in Post-smtp/Post/Post-Mail/google-api-php-client-1.1.2/autoload.php on line 22
  • [Ticket] Silenced PHP warnings in Zend_Mail from ini_set

1.6.23 – 2015-06-27

  • 10,000 installations! – 2015-06-27
  • 9,000 installations! – 2015-06-20
  • [Ticket] Causes bbPress or Buddy Press to generate warning messages. Fixed.
  • [Ticket] User reported error “Fatal error: Internal Zend error – Missing class information” – Whoops, used ‘require’ PostState.php instead of ‘require_once’ PostState.php which was causing errors. Fixed.
  • [Ticket] [Ticket] MyMail Newsletter Plugin for WordPress refuses to use wp_mail. I don’t want to make this a habit, but I’ve integrated Post with MyMail’s proprietary delivery mechanism.
  • [Ticket] Found an environment where the plugin’s call to new Exception was creating PHP Fatal errors. Fixed.
  • [Ticket] Perform validation on all email headers before sending message
  • The Gmail API transport displays a copy of the payload during the Send Email Test and saves this payload to the Email Log
  • No longer shows the Javascript pop-up if the error is caused by the user cancelling everything (by checking JSON response.responseText for null)

1.6.22 – 2015-06-14

  • Finally realized that for the last five months I’ve been relying on register_activation_hook to fire during plugin updates – and it doesn’t. Lovely. Well this change should eliminate all the “update doesn’t work!” bugs for good.
  • [Ticket] I enable Strict mode when I code Post to ensure it’s error free and I forgot to turn it off. This was causing all plugins and themes to show their warnings. Fixed.
  • [Ticket] I didn’t thoroughly test the Gmail API, causing “Catchable fatal error: Argument 1 passed to PostGmailApiModuleTransport::getAuthenticationType() must be an instance of PostOptions, none given.” Fixed.
  • [Ticket] I didn’t thoroughly test the Gmail API, it wasn’t warning the user if the Envelope Sender Address is missing. Fixed.
  • [Ticket][Ticket] Found a problem in the Activation Handler. It was re-encoding passwords when it shouldn’t have been. Fixed.

1.6.18 – 2015-06-13

  • 8,000 installations! Big milestone! The author of Contact Form 7 has officially endorsed Post SMTP as the SMTP plugin of choice! You can’t wipe the smile from my face 😀
  • [Ticket] Post is determining the current user’s admin capability incorrectly. Fixed.
  • [Ticket] Added an additional From field, the Envelope From Address, so users can use a different From address than the Account address (for example, to use a Google Apps’ Group email address)
  • Added a uniqueness (based on site URL) to the lock filename in case this is shared hosting
  • Persistence-level updates now run across all subsites on a multisite installation

1.6.17 – 2015-06-08

  • You know you’re having a really bad day when you have to have do three releases. Fix for “Fatal error: Call to a member function addError() on a non-object”. This happens when wp_mail is blocked by another plugin and a non-admin user accesses the site.
  • [Ticket] Fixed a bug “Fatal error: Cannot redeclare IsNullOrEmptyString()” I introduced in v1.6.15
  • Added Cc and Bcc addresses to Email Log
  • [Ticket][Ticket] Force a Logout of Google before launching the Developers Console so it’s obvious to the user which account is being used
  • Now using Google Developers Console Gmail Wizard URL in place of Google Developers Console URL to simplify Client ID creation
  • [Ticket] Removing the BCC header in the case of the Gmail API was incorrect and causing lost recipients. Fixed.
  • Fixed a compatibility issue (PHP Fatal Error) with the Post Gmail API Extension

1.6.14 – 2015-06-05

  • [Ticket] Fixed a bug (PHP Warning) I introduced in v1.6.13
  • 7,000 installations!
  • Translated into Dutch, thank-you Louise
  • [Ticket] Add process-locking to make sure the OAuth2 token is refreshed synchronously
  • Use the Zend_Mail setReturnPath option to communicate the Mail-From and Sender as the SMTP account, allowing arbitrary addresses in the From header
  • [Ticket] Added Emoji lock icons to Dashboard and Main Setting screens to indicate security
  • [Ticket] Emails from the Email Users plugin were causing undeliverable errors – fixed by removing the SMTP Return-Path header that Email Users injects

1.6.12 – 2015-05-30

  • 6,000 installations! – 2015-05-26
  • Post now calls wp_mail when sending a test email. This marks the beginning of the “Post API”
  • Shaved admin memory use from ~6MB to ~4MB; Non-admin memory use holds at ~2MB
  • Now loading the Sent Email post type for all admin screens, in case other custom post type-related plugins (e.g. WordPress Importer) need it
  • Wasn’t comfortable how plugin_data was being retrieved, so reverted back to hard-coded plugin name and version
  • Save original wp_mail parameters to Email Log so that a Resend action can be implemented
  • [Ticket] Removed sanitize_text_field from the PostSanitizer to prevent corruption of some passwords
  • [Ticket] Removed the WordPress function call wp_slash – systems that don’t support it can now use logging
  • A lot of general code clean-up and memory optimizations

1.6.11 – 2015-05-22

  • [Ticket] Fix for “Fatal error: Call to undefined function spritnf() in PostEmailLogController.php on line 284” – sometimes PHP really sucks compared to Java
  • Added a link to a HowTo Video for configuring Google OAuth 2.0 in the OAuth2 authentication section

1.6.10 – 2015-05-18

  • 5,000 installations!
  • Looks for php_openssl and php_socket in the Pre-Requisites check
  • [Ticket] I hate when you have to have a fix for a fix. It means you need to hire more testers.
  • [Ticket] Changed the way Post performs the API Connectivity Test to more resemble how Google does it
  • [Ticket] Found a host that the Connectivity Test gets confused on : STARTTLS detection was failing. Fixed.
  • [Ticket] Some users insist on running Post in WordPress < 3.6 which has no wp_slash function. Logging is disabled in this case.

1.6.8 – 2015-05-14

  • [Ticket] Found a PHP envrionment that choked in the catch block trying to call a function (get transcript) on an object instantiated in the try (mail engine). Fixed.
  • [Ticket] If wp_mail is called with a recipient list that ends in a comma, Post tries to add an empty address to the message. Fixed.
  • The SMTP Session Transcript was not being saved for errors! Fixed.

1.6.6 – 2015-05-12

  • [Ticket][Ticket][Ticket][Ticket][Ticket] Fixed a long-standing bug where Post would ignore the Grant Code from an OAuth provider if it wasn’t in the very next HttpRequest that the site received. Changed this to use a three-minute window.

1.6.5 – 2015-05-10

  • [Ticket] Fixed a Javascript bug
  • Added an Ajax failure handler to every Ajax post

1.6.4 – 2015-05-08

  • SMTP transport requires a Sender Email Address be set
  • Wizard will not clear the hostname if it comes back null
  • If the host does not support “humanTime”, the Email Log will fall back to an ISO date
  • Added a new advanced option: Transcript size to adjust how much of the transcript is saved in the log
  • The wizard gets confused if the user specified auth type is undefined for the newly chosen socket. for example, a gmail address, with a server, toggling between the gmailapi socket and the mailtrap socket. Fixed.
  • Show a warning on the main setting screen if the Delivery mode is not set to Production

1.6.2 – 2015-05-06

  • 4,000 installations!
  • [Ticket] Some of the changes released in v1.6 broke the Gmail Extension. Fixed.
  • [Ticket] Added a new advanced option: Stealth Mode to hide the Post X-Mailer signature
  • Added a Transcript option in the Email Log
  • Fixed how the Wizard handles new GoDaddy Office-365 supported email

1.6.1 – 2015-05-04

  • You test and test and test, and there’s always a bug. Fixed a problem in the Port Recommender where it thought STARTTLS was offered when it isn’t (test case:

1.6 – 2015-05-03

  • Fold all code from the Post Gmail Extension back into Post
  • Remove warning from main screen for sender override if it’s already on
  • Delivery mode – production, logging, test
  • Help screens
  • Log all email attempts with error messages (if any)
  • Truncate logs to max amount
  • View all the email attempts, and view a single entry
  • Delete single, delete batch, and delete the entire log on pugin data purge
  • Highlight Logging option to users
  • Obscure password from front-end
  • Ask to see password when typing
  • When the wizard is looking up details on the email address, disable the smtp hostname field
  • Wizard check server ID and warn for MITM ‘attack’
  • Check for GoDaddy SMTP server during Wizard and use that SMTP server
  • Check for Gmail during wizard and remember for gmail api option.
  • Present choices to user when select the auth type and socket in wizard more elegantly (radio buttons?)
  • Warn when using AUTH with NO encryption – done with padlock emoji
  • Add hostname to connectivity test table.
  • Remove hard-coded plugin version number

1.5.13 – 2015-04-22

  • 3,000 installations!

1.5.13 – 2015-04-18

  • Minor fix in Wizard: OAuth labels weren’t updating dynamically (since v1.5.11)
  • Lots of changes at Yahoo’s Developer Network required changes here: updated format of Callback Domain; updated Yahoo Developer Network portal launch link; renamed Consumer Key/Secret to Client ID/Client Secret; updated FAQ for Yahoo Client ID instructions
  • [Ticket] Updated stylesheet to avoid interference from Dating Solutions Plugin (DSP)

1.5.12 – 2015-04-14 – The Jamaican release!

  • [Ticket] PHP 5.2 users: fix test messages that show failures but still get delivered; fix Contact Form 7 submission freezes
  • Translated into Turkish, thank-you ercan yaris

1.5.11 – 2015-04-05

  • 2,000 installations! 😀
  • Commercial-grade improvements to Connectivity Test and Setup Wizard. The new wizard prevents misconfiguration by interrogating the MTA for capabilities and intelligently suggests the best settings for the user. Steve Jobs would be proud.
  • Fixed Wizard’s MSA hostname guess for GoDaddy addresses ( is the MTA not the MSA)
  • Fixed Wizard’s MSA hostname guess for Outlook 365 addresses ( is for their free Hotmail service)
  • Added French/Italian translation for JQuery Validation

1.5.10 – 2015-03-29

  • Fix for Fatal error: Cannot redeclare class PEAR_Common in C:\PHP5\PEAR\PEAR\Common.php – similar to this error in WP Minify

1.5.9 – 2015-03-26

  • Added JQuery tabbed UI for manual configuration screen
  • Added functionality to add to, cc, and bcc recipients to every message
  • Added functionality to add custom headers to every message – useful for Mandrill “SMTP” headers
  • [Ticket] The Setup Wizard will check for IP addresses in the site URL and warn the user when they are about to configure OAuth 2.0 that this will fail.
  • [Ticket] Added functionality to prevent plugins and themes from overriding both the sender name and sender email address
  • [Ticket] Hide PHP warnings from stream_set_timeout() in case the host has disabled this function.

1.5.8 – 2015-03-16

  • 1,000 installations! 😀
  • [Ticket] Post will not shut down if it can’t find OpenSSL. It will just display a warning to the user.

1.5.7 – 2015-03-14

  • [Ticket] renamed Zend framework classes to prevent errors with other plugins using the Zend framework
  • [Ticket] Added ajax error checks, especially for Error 502 : Bad Gateway (from when sending test e-mail
  • Multipart/Alternative was horribly broken, clearly no-one was using it. It’s working now, and Post’s new Test Message is Multipart/Alternative. Thanks to Victor Hung of poofytoo for the use of his cartoon.
  • Add PHP library pre-requisite checks to Binder, Dashboard widget, Admin screen and Admin screen error messages.
  • Translated into Italian, thank-you Andrea Greco
  • Obfuscated e-mail address in Diagnostic Info
  • Fixed Wizard’s SMTP hostname guess for Apple addresses (,,

1.5.5 – 2015-03-11

  • Added a Dashboard Widget to display Post status
  • [Ticket] Added diagnostics check for iconv library
  • Moved the SMTP transcript to it’s own step in the Send Email Test
  • Moved 3rd-party plugin import to the Setup Wizard
  • [Ticket|Ticket] Stopped writing to error log if a language file can’t be found
  • Added the Http User Agent string to the diagnostics

1.5.4 – 2015-03-04 – the Birthday Release

  • [Ticket] Added support for the wp_mail filter – this adds compatibility with plugins like email-log
  • Better diagnostics – includes a port check on the currently configured host:port
  • Fixed a bug where multiple error messages at once overwrite each other
  • [Ticket] Fixed a bug in Sanitizer for cases where WordPress calls sanitize twice in a row – known WP bug

1.5.3 – 2015-02-28

  • Added a dedicated screen for Diagnostics (so that I can add more intensive, slower-running checks like DNS)
  • Fixed port-testing race condition bug in Post Setup Wizard when using Gmail API Extension
  • Fix for error “Fatal error: Cannot redeclare class PostOAuthTokenInterface” when using Gmail API Extension
  • Checks to make sure that the hostname used for SMTP/OAuth 2.0 is one that is supported
  • Removed display_errors=On, Mr. Space Cadet here left it in the previous release by accident

1.5.1 – 2015-02-23

  • Bugs slipped through. In the Wizard, choosing port 465 was not hiding the authentication label. Worse, choosing port 587 was not showing the authentication buttons.
  • In the wizard, if no ports are available for use, the error message was not being displayed.

1.5 – 2015-02-22

  • [Ticket|Ticket] Added support for modular transports. The first external transport is the Post Gmail Extension, which uses the Gmail API to send mail out on the HTTPS port, a convenient way around traditional TCP port blocks for Gmail users
  • [Ticket] Made my debug logging “less agressive” so that broken systems (those that pipe warning messages to STDOUT regardless of the WordPress WP_DEBUG_DISPLAY setting or PHP’s display_errors settings) will no longer experience the Port Test hanging during a check
  • Fixed a bug in the Setup Wizard where it would not use OAuth 2.0 on port 587
  • Fixed a bug where Post refused to send mail with Password authentication and no encryption (who does that??)

1.4.1 – 2015-02-17

  • All text has been externalized in prep for I18N Internationalization and localization
  • Fixed a bug where the Setup Wizard would force OAuth 2.0 configuration, instead of falling back to Password, even if the required port was closed
  • Added more error checking, and more warning messages.
  • Translated into French, thank-you Etienne Provost

1.4 – 2015-02-15

  • Happy Valentine’s Day! Sending Yahoo email now supported with OAuth 2.0 authentication! If the Wizard detects that a Yahoo server has been entered, it automatically configures OAuth 2.0
  • First time users may choose to import settings from any of the Big Four WordPress SMTP plugins (five if you count Easy SMTP Mail, a clone of WP Mail SMTP): Easy WP SMTP, WP Mail Bank, WP Mail SMTP and WP SMTP
  • [Ticket] Suppressed warning messages generated by calls to fsockopen – they were causing the remote Ajax queries to hang
  • The wizard was resetting some settings by accident, namely Connection Timeout, Read Timeout and Reply-To
  • [Ticket] Found an environment where calls to error_log were being displayed in the HTML even after display_errors was disabled. Therefore, disabled error_log calls by default. The log may be re-enabled in Advanced Settings
  • The Bad, Post! screen was messing with the Port Test Ajax call when fsockopen generated an error and debug level is set to E_ALL in php.ini. Therefore added a switch in the configuration “Show Error Screen” that is off by default. When it is off, Port Test works perfect but errors generate a WSOD. When it is on, errors are displayed in the “Bad, Post!” screen but Port Test fails.
  • I heard that some hosts, like WPEngine, do not allow writing to the Http Session. Well that’s balls. I’ve modified the code to write to the database instead.

1.3.4 – 2015-02-11

  • 500 downloads and six 5-star ratings in only three weeks! Cool! 😎
  • Replaced the Google OAuth API with pure PHP code. No more unexpected Google API errors.
  • [Ticket] Enabled overriding of the timeouts in the configuration screen. If Post is intermittently sending mail, doubling the TCP Read Timeout may help
  • Added the SMTP session transcript output when a test message fails to send.
  • Fixed the error: Class ‘Zend_Mail_Protocol_Smtp_Auth_Plain’ not found in /Post/Post-Mail/Zend-1.12.10/Mail/Transport/Smtp.php on line 198
  • Passwords in the database are now Base64-encoded so casual viewing of the database won’t reveal them
  • Fixed a couple minor database upgrade bugs: for new users who use Password Authentication, and for old users that don’t have an expiry token stored
  • Added a version shortcode, mostly for promotion of Post on my own websites
  • Serveal minor tweaks to the user interface, including focus, style, validation, and enabling/disabling inputs where applicable

1.3.2 – 2015-02-10

  • [Ticket] Fixed the error: PHP Fatal error: Call to private PostAuthorizationToken::__construct() This occurs when upgrading from a pre-v1.0 version of Post (when PostAuthorizationToken had a public constructor) to v1.0 or higher
  • [Ticket] Fixed the error PHP Fatal error: Class ‘Google_IO_Stream’ not found in /Post/Post-Auth/google-api-php-client-1.1.2/src/Google/Client.php on line 600 by including Google/IO/Stream.php
  • Post now has a modest fatal error screen, rather than a dreaded white screen of death

1.3 – 2015-02-09

  • Sending Hotmail/Windows Live/ email now supported with OAuth 2.0 authentication! If Wizard detects that a Hotmail server has been entered, it automatically configures OAuth 2.0.
  • Separated Authentication input from Encryption input for finer configuration control
  • Added additional authentication types: plain and CRAM-MD5. ‘basic’ became ‘login’
  • Added Ajax to manual config and wizard screens to allow dynamic OAuth2 redirect url + help text changes in response to hostname changes
  • Removed ‘Allow Plugin to Override Sender’ user input
  • Added Online Support link in menu
  • Clarified text in ‘Run a Port Test’ so people won’t continue to ask me about connection problems (hopefully)

1.2 – 2015-02-04

  • Support for Sender Name and Reply-To. Turns out Google no longer honours the MUA Return-Path header due to Spam. Makes sense, so I’ve decided not to add a Return-Path field to Post’s configuration.
  • Support for WordPress filters wp_mail_from and wp_mail_from_name
  • Disable stats-keeping for email sent by the test function
  • Minor tweaks to the Wizard to support WordPress v3.9

1.1.1 – 2015-02-03

  • [Ticket] Fixed a bug I introduced in 1.1. Thanks to user derrey for catching this one. Zend_Mail crashes when attempting to throw an exception when the ‘from’ standard header was added as a header : “Zend_Mail_Exception code=0 message=Cannot set standard header from addHeader()”

1.1 – 2015-02-03

  • [Ticket] Added support for international characters (the WordPress default is UTF-8) which can be specified with headers or the wp_mail_charset filter
  • Added support for multi-part content type which can be specified with headers or the wp_mail_content_type filter

1.0 – 2015-02-02

  • Overhaul of the UI – A navigation pane is shown at the top of each page and each major function has been separated into its own screen
  • Post now supports sending with basic auth and no auth just like the other SMTP plugins
  • Added a Port Test function so users can have peace of mind whether the plugin is failing (never!) or whether the host has firewalled them
  • [Ticket] Now supports email headers, such as a text/html content-type
  • Now supports email attachments
  • Added a warning if the user has configured OAuth but not requested permission from Google
  • Added a warning if the user is using Google with Basic auth (or worse) and a suggestion to enable OAuth 2.0
  • Recording of successful/failure tally

0.2.7 – 2015-01-29

  • Fixed error: “Undefined variable: authorizationToken” was preventing mail delivery outside of the admin screen.
  • Fixed warning message that Post couldn’t bind to wp_mail immediately after Activation
  • Added prerequisite checks to make sure the PHP environment can handle Post
  • Moved the screenshots and icons out of /trunk and into /assets

0.2.6 – 2015-01-28

  • [Ticket] Fixed “Configure and Authorize the plugin” missing the link address. Thanks to user kaorw for catching ths one.
  • [Ticket] Fixed “Warning: Missing argument 2 for update_option()”. Thanks to user kaorw for catching ths one. Fixed by calling delete_option instead of update_option().
  • [Ticket] Fixed “Fatal error: Call to undefined function str_getcsv()”. Thanks to user micb for catching ths one. This function is not available before PHP 5.3. Fixed by replacing str_getdsv() with custom implementation.

0.2.5 – 2015-01-27

  • [Ticket] Removed the namespace for users with older version of PHP
  • Changed the Post Redirect URI (now includes a trailing ?page=Post) – this means Client ID’s from 0.2.4 or earlier MUST be updated with the new Redirect URI or re-created from scratch.

0.2.4 – 2015-01-25

  • Fixed issues on servers where the plugin is installed as a symbolic link.
  • Better error handling/debugging with php logging and assertions.

0.2.1 – 2015-01-23

  • Fixed an environment-specific error that prevented Post reloading the setting screen after sending a test email

0.2 – 2015-01-20

  • wp_mail() accepts multiple recipients (array and string)
  • display a warning to the user if another plugin is preventing Post from overriding wp_mail
  • paired down the external libraries to only what was required – from 3,700 files to just 75
  • default Gmail port corrected to 465 – previously 465 was hardcoded but 587 was saved to the database
  • Added ‘Delete All Data’ button to erase the stored tokens
  • OpenShift production problem: This environment didn’t like the callback and there were possibly invalid characters in the source script

0.1 – 2015-01-19

  • First release. Happy Fig Newton Day! It was a grueling week-end, studying PHP and OAuth and Googling like a Boss, but it’s done and it works!