{"id":319950,"date":"2026-05-30T10:25:47","date_gmt":"2026-05-30T10:25:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/emerge-mail\/"},"modified":"2026-05-30T10:25:38","modified_gmt":"2026-05-30T10:25:38","slug":"emerge-mail","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/emerge-mail\/","author":18311397,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"Emerge Mail","header_author":"Redigit","header_description":"Self-contained OAuth-native mail for WordPress with direct Gmail and Outlook API delivery.","assets_banners_color":"696c72","last_updated":"2026-05-30 10:25:38","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/emerge.redigit.net\/","header_author_uri":"https:\/\/redigit.net\/","rating":5,"author_block_rating":0,"active_installs":0,"downloads":44,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"redigit","date":"2026-05-30 10:25:38"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3554620,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3554620,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3554620,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3554620,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Connections table with Active radio, per-row From email override, last-error column, Send test and Disconnect actions.","2":"Connect Gmail \/ Connect Microsoft buttons with provider logos.","3":"Sender settings: From name, Reply-To, Bulk sending, and From header options.","4":"Email Controls: opt-in suppression of WordPress core admin\/editor self-notifications.","5":"Suppression Log: every suppressed notification with type filter and bulk delete.","6":"Site-wide admin notice surfaced when a connection has failed recently."}},"plugin_section":[],"plugin_tags":[897,4906,2061,6696,48586],"plugin_category":[38,41],"plugin_contributors":[265055],"plugin_business_model":[],"class_list":["post-319950","plugin","type-plugin","status-publish","hentry","plugin_tags-gmail","plugin_tags-notifications","plugin_tags-oauth","plugin_tags-smtp","plugin_tags-transactional-email","plugin_category-authentication","plugin_category-communication","plugin_contributors-redigit","plugin_committers-redigit"],"banners":{"banner":"https:\/\/ps.w.org\/emerge-mail\/assets\/banner-772x250.png?rev=3554620","banner_2x":"https:\/\/ps.w.org\/emerge-mail\/assets\/banner-1544x500.png?rev=3554620","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/emerge-mail\/assets\/icon-128x128.png?rev=3554620","icon_2x":"https:\/\/ps.w.org\/emerge-mail\/assets\/icon-256x256.png?rev=3554620","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Emerge Mail replaces SMTP plugins for transactional WordPress email. Connect one or more Gmail or Microsoft 365 mailboxes via OAuth, and every <code>wp_mail()<\/code> call your site makes \u2014 password resets, comment notifications, WooCommerce receipts, contact-form submissions \u2014 is delivered through that mailbox's API.<\/p>\n\n<p>Because the From address is your own authenticated mailbox, messages benefit from SPF, DKIM, and DMARC alignment that PHP's <code>mail()<\/code> function cannot provide. This typically results in dramatically better inbox placement than default WordPress mail.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li>OAuth connections to Gmail and to all Microsoft account types (personal Outlook \/ Hotmail \/ Live and Microsoft 365 work\/school accounts).<\/li>\n<li>No SMTP credentials to manage \u2014 you never enter a password into WordPress.<\/li>\n<li>Multiple mailboxes per site with automatic failover. The Active connection sends first; if it fails, the next available connection is tried, with a 10-minute cooldown on failed connections.<\/li>\n<li>Optional bulk-send throttle: when a burst of sends is detected, rotate through your connected mailboxes instead of hammering the Active one.<\/li>\n<li>Per-connection From email override for verified send-as aliases.<\/li>\n<li>Configurable sender defaults: a custom From name and an opt-in \"Reply-To = admin email when sender differs\" setting.<\/li>\n<li>Full <code>wp_mail<\/code> compatibility: To\/Cc\/Bcc (including from headers), HTML bodies, multipart alternative, attachments, custom headers, RFC 2822 address formats including comma-separated lists and quoted display names, non-UTF-8 charsets.<\/li>\n<li>RFC 2047 encoding for non-ASCII subjects and display names.<\/li>\n<li>One-click <strong>Send test<\/strong> button per connection.<\/li>\n<li>Email Controls page: opt-in suppression of WordPress core self-notifications you don't want to receive (comment moderation, automatic updates, new-user registered, etc.) \u2014 recorded to a Suppression Log instead.<\/li>\n<li>Suppression Log page: standard WordPress list table with type filter, bulk delete, and automatic 30-day pruning.<\/li>\n<li>Last-error visibility per connection and a site-wide admin notice on recent failures.<\/li>\n<li>Automatic hourly token refresh (Action Scheduler when available, WP-Cron fallback).<\/li>\n<li>Safe fallback to default WordPress mail delivery on any failure \u2014 the plugin never blocks email.<\/li>\n<li>Extensible via filters: cooldown, bulk thresholds, HTTP timeouts, token-refresh timing, MIME output, suppression catalog.<\/li>\n<\/ul>\n\n<h4>How it works<\/h4>\n\n<p>When you connect a mailbox, an access + refresh token pair is encrypted with a per-site key and stored as a WordPress option. From that point on, your site talks directly to Gmail or Microsoft Graph; no third party sits in the send path.<\/p>\n\n<p>The plugin hooks <code>pre_wp_mail<\/code>. If at least one connection is active, the message is routed through the chosen provider API. If the provider returns an error \u2014 or if no connections are configured \u2014 WordPress's default mail delivery takes over transparently.<\/p>\n\n<h4>What this is not<\/h4>\n\n<ul>\n<li>Not a marketing or bulk email tool. No subscriber lists, no campaigns, no broadcasts.<\/li>\n<li>Not a shared-IP SMTP relay. Each site sends from its own connected mailboxes.<\/li>\n<li>Not a way to spoof arbitrary From addresses. The provider will reject anything that isn't an authorized send-as alias of the connected mailbox.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>To deliver mail, Emerge Mail communicates with three external services. By installing and using this plugin you agree to use of these services. Nothing is contacted until you click <strong>Connect Gmail<\/strong> or <strong>Connect Microsoft<\/strong> in the plugin settings.<\/p>\n\n<h4>1. Emerge OAuth service (emerge.redigit.net)<\/h4>\n\n<p><strong>What it is and what it's used for:<\/strong> A stateless OAuth proxy operated by the plugin author. It exists to broker the OAuth authorization handshake between your WordPress site and Google or Microsoft so the plugin can be authorized to send mail from your mailbox. The proxy holds the OAuth client secrets that Google and Microsoft would otherwise require every site to register individually.<\/p>\n\n<p><strong>What data is sent, when:<\/strong><\/p>\n\n<ul>\n<li>When you click <strong>Connect Gmail<\/strong> or <strong>Connect Microsoft<\/strong>, your browser is redirected to <code>https:\/\/emerge.redigit.net\/oauth\/{provider}\/authorize<\/code> with a PKCE code challenge and a state token generated by your site. No personal data is sent.<\/li>\n<li>When the provider redirects back, your site posts the authorization code and PKCE verifier to <code>https:\/\/emerge.redigit.net\/oauth\/{provider}\/token<\/code> to receive the access and refresh tokens. The tokens are returned directly to your site and stored locally, encrypted, in <code>wp_options<\/code>. The proxy does not persist them.<\/li>\n<li>When an access token nears expiry, your site posts the refresh token to <code>https:\/\/emerge.redigit.net\/oauth\/{provider}\/refresh<\/code> to obtain a new access token. Again, nothing is persisted on the proxy.<\/li>\n<li>No email content, recipient lists, or message metadata is ever sent to the proxy.<\/li>\n<\/ul>\n\n<p><strong>Terms and privacy:<\/strong><\/p>\n\n<ul>\n<li>Terms of Service: <a href=\"https:\/\/emerge.redigit.net\/terms-of-service\">https:\/\/emerge.redigit.net\/terms-of-service<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/emerge.redigit.net\/privacy-policy\">https:\/\/emerge.redigit.net\/privacy-policy<\/a><\/li>\n<\/ul>\n\n<h4>2. Google APIs (Gmail)<\/h4>\n\n<p><strong>What it is and what it's used for:<\/strong> Used only when you connect a Gmail mailbox. Once authorized, the plugin sends every <code>wp_mail()<\/code> message directly to the Gmail API (<code>gmail.googleapis.com<\/code>) from your WordPress site. Periodically the plugin also calls the Google OAuth userinfo endpoint (<code>www.googleapis.com\/oauth2\/v2\/userinfo<\/code>) to verify the access token is still valid.<\/p>\n\n<p><strong>What data is sent, when:<\/strong><\/p>\n\n<ul>\n<li>On each <code>wp_mail()<\/code> call routed through a Gmail connection: the full outbound message (To\/Cc\/Bcc, subject, body, attachments, custom headers) is POSTed to <code>https:\/\/gmail.googleapis.com\/gmail\/v1\/users\/me\/messages\/send<\/code> as a base64-encoded RFC822 message. This is what's required for the message to reach the recipient.<\/li>\n<li>On token validation: a Bearer token is sent to <code>https:\/\/www.googleapis.com\/oauth2\/v2\/userinfo<\/code>. No message data is included.<\/li>\n<\/ul>\n\n<p><strong>Terms and privacy:<\/strong><\/p>\n\n<ul>\n<li>Google Terms of Service: <a href=\"https:\/\/policies.google.com\/terms\">https:\/\/policies.google.com\/terms<\/a><\/li>\n<li>Google Privacy Policy: <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a><\/li>\n<li>Google API Services User Data Policy: <a href=\"https:\/\/developers.google.com\/terms\/api-services-user-data-policy\">https:\/\/developers.google.com\/terms\/api-services-user-data-policy<\/a><\/li>\n<\/ul>\n\n<h4>3. Microsoft Graph (Outlook \/ Microsoft 365)<\/h4>\n\n<p><strong>What it is and what it's used for:<\/strong> Used only when you connect a Microsoft mailbox. Once authorized, the plugin sends every <code>wp_mail()<\/code> message directly to Microsoft Graph (<code>graph.microsoft.com<\/code>) from your WordPress site. Periodically the plugin also calls Graph's <code>\/me<\/code> endpoint to verify the access token is still valid.<\/p>\n\n<p><strong>What data is sent, when:<\/strong><\/p>\n\n<ul>\n<li>On each <code>wp_mail()<\/code> call routed through a Microsoft connection: the full outbound message (To\/Cc\/Bcc, subject, body, attachments, custom headers) is POSTed to <code>https:\/\/graph.microsoft.com\/v1.0\/me\/sendMail<\/code> as a JSON payload. This is what's required for the message to reach the recipient.<\/li>\n<li>On token validation: a Bearer token is sent to <code>https:\/\/graph.microsoft.com\/v1.0\/me<\/code>. No message data is included.<\/li>\n<\/ul>\n\n<p><strong>Terms and privacy:<\/strong><\/p>\n\n<ul>\n<li>Microsoft Services Agreement: <a href=\"https:\/\/www.microsoft.com\/en\/servicesagreement\">https:\/\/www.microsoft.com\/en\/servicesagreement<\/a><\/li>\n<li>Microsoft Privacy Statement: <a href=\"https:\/\/privacy.microsoft.com\/en-us\/privacystatement\">https:\/\/privacy.microsoft.com\/en-us\/privacystatement<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>emerge-mail<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install via the Plugins screen.<\/li>\n<li>Activate the plugin from the Plugins menu.<\/li>\n<li>Click the new <strong>Emerge Mail<\/strong> top-level item in your WordPress admin sidebar.<\/li>\n<li>Click <strong>Connect Gmail<\/strong> or <strong>Connect Microsoft<\/strong> and approve the OAuth consent screen.<\/li>\n<li>Click <strong>Send test<\/strong> on the new connection row to confirm delivery to your administrator email.<\/li>\n<\/ol>\n\n<p>As soon as a connection is active, <code>wp_mail()<\/code> routes through it automatically.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20woocommerce%2C%20contact%20form%207%2C%20wpforms%2C%20etc.%3F\"><h3>Does this work with WooCommerce, Contact Form 7, WPForms, etc.?<\/h3><\/dt>\n<dd><p>Yes. Anything that uses <code>wp_mail()<\/code> \u2014 which is virtually every WordPress plugin that sends email \u2014 works without modification.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20google%20cloud%20or%20microsoft%20azure%20account%3F\"><h3>Do I need a Google Cloud or Microsoft Azure account?<\/h3><\/dt>\n<dd><p>No. Authorization is handled by the Emerge OAuth service. You sign in with your normal Google or Microsoft account; no developer setup is required.<\/p><\/dd>\n<dt id=\"where%20are%20my%20oauth%20tokens%20stored%3F\"><h3>Where are my OAuth tokens stored?<\/h3><\/dt>\n<dd><p>Tokens are encrypted with a key generated locally on your site on first activation and stored as a WordPress option. They never leave your install. The OAuth proxy used during sign-in does not persist tokens.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20an%20access%20token%20expires%3F\"><h3>What happens when an access token expires?<\/h3><\/dt>\n<dd><p>Access tokens expire roughly hourly. The plugin refreshes them automatically \u2014 both on a schedule and inline if a send happens to coincide with an expiry. You don't need to do anything.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20gmail%20or%20microsoft%20is%20unreachable%3F\"><h3>What happens if Gmail or Microsoft is unreachable?<\/h3><\/dt>\n<dd><p>The plugin returns an error from its <code>pre_wp_mail<\/code> hook, which causes WordPress to fall back to its default mail delivery. The failure is recorded in the <strong>Last error<\/strong> column of the settings page and surfaced as an admin notice for 24 hours.<\/p><\/dd>\n<dt id=\"can%20i%20send%20from%20multiple%20mailboxes%3F\"><h3>Can I send from multiple mailboxes?<\/h3><\/dt>\n<dd><p>Yes. Connect as many as you like; the connection marked <strong>Active<\/strong> is used first. If a send fails (or the Active connection is in cooldown after a recent error), the plugin automatically falls through to the next available connection. You can switch the Active mailbox at any time from the Connections table.<\/p>\n\n<p>For high-volume sites, turn on <strong>Bulk sending<\/strong> in Sender settings to spread bursts of sends across all connected mailboxes instead of always hitting the Active one.<\/p><\/dd>\n<dt id=\"can%20i%20override%20the%20from%20email%3F\"><h3>Can I override the From email?<\/h3><\/dt>\n<dd><p>Yes. Enter a different address in the <strong>From email<\/strong> column on the Connections table. It must be a verified send-as alias on the connected mailbox (Gmail: <em>Settings \u2192 Accounts \u2192 Send mail as<\/em>; Microsoft: <em>Mail \u2192 Aliases<\/em> or admin-configured), otherwise the provider will reject the send.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20from%20display%20name%3F\"><h3>Can I customize the From display name?<\/h3><\/dt>\n<dd><p>Yes. Set it in <strong>Sender settings \u2192 From name<\/strong> on the main settings page. Leave it blank to use your site title as the default.<\/p><\/dd>\n<dt id=\"can%20i%20suppress%20noisy%20wordpress%20notifications%20i%20don%27t%20care%20about%3F\"><h3>Can I suppress noisy WordPress notifications I don't care about?<\/h3><\/dt>\n<dd><p>Yes. Open <strong>Emerge Mail \u2192 Email Controls<\/strong> and tick the notifications you want stopped. Eight WordPress core admin\/editor notifications are listed (comment moderation, new comments, password reset notices, new user registrations, and automatic-update results). Suppressed notifications are recorded in <strong>Emerge Mail \u2192 Suppression Log<\/strong> so you still have an audit trail. End-user notifications (password resets, account changes, new-user welcome) are intentionally not listed \u2014 users need those.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20read%20my%20mailbox%3F\"><h3>Does the plugin read my mailbox?<\/h3><\/dt>\n<dd><p>No. The OAuth scope requested is sufficient only to send mail. The plugin does not call any read endpoints and cannot access existing messages.<\/p><\/dd>\n<dt id=\"is%20%60wp_mail%60%20still%20available%20to%20other%20plugins%20after%20activation%3F\"><h3>Is `wp_mail` still available to other plugins after activation?<\/h3><\/dt>\n<dd><p>Yes. <code>wp_mail<\/code> continues to function normally. The plugin only changes how the underlying send is performed; it doesn't change any of <code>wp_mail<\/code>'s public behavior.<\/p><\/dd>\n<dt id=\"will%20the%20plugin%20work%20without%20an%20active%20mailbox%20connection%3F\"><h3>Will the plugin work without an active mailbox connection?<\/h3><\/dt>\n<dd><p>Yes. <code>wp_mail<\/code> falls through to WordPress's default delivery when no connection is available. The plugin never blocks email.<\/p><\/dd>\n<dt id=\"how%20do%20i%20remove%20all%20stored%20data%20on%20uninstall%3F\"><h3>How do I remove all stored data on uninstall?<\/h3><\/dt>\n<dd><p>Deleting the plugin from the Plugins screen runs <code>uninstall.php<\/code>, which removes every stored connection, all encrypted tokens, the per-site encryption key, sender\/control settings, the suppression-log table, and all scheduled jobs.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>OAuth connections to Gmail and to all Microsoft account types (personal Outlook\/Hotmail\/Live and Microsoft 365 work\/school).<\/li>\n<li>Multiple mailboxes per site with active-first routing and automatic failover (with per-connection cooldown after errors).<\/li>\n<li>Optional bulk-send throttle that rotates connections during detected bursts.<\/li>\n<li>Per-connection From email override for verified send-as aliases.<\/li>\n<li>Configurable Sender settings: custom From name (defaults to site title), opt-in Reply-To-to-admin-email when the sender differs, ignore plugin-set From header.<\/li>\n<li>Full <code>wp_mail<\/code> mapping: attachments, Cc\/Bcc from headers, multipart alternative, comma-separated address lists with quoted display names, non-UTF-8 charsets, RFC 2047 header encoding.<\/li>\n<li>Send-test button per connection.<\/li>\n<li>Email Controls page: suppress eight WordPress core admin\/editor self-notifications.<\/li>\n<li>Suppression Log custom table with WP list-table UI, type filter, bulk delete, and daily 30-day pruning.<\/li>\n<li>Per-connection failure visibility on the settings screen plus a site-wide admin notice on recent failures.<\/li>\n<li>Hourly token maintenance via Action Scheduler (WP-Cron fallback).<\/li>\n<li>Safe fallback to default WordPress mail delivery on any provider failure.<\/li>\n<li>Filter hooks for cooldown duration, bulk thresholds, HTTP timeouts and request args, token-refresh timing, final MIME output, Microsoft saveToSentItems, suppression catalog, and log retention.<\/li>\n<\/ul>","raw_excerpt":"Route wp_mail through your own Gmail or Microsoft mailbox using the providers&#039; APIs. No SMTP credentials, no third-party relay, no campaigns.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/319950","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=319950"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/redigit"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=319950"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=319950"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=319950"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=319950"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=319950"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=319950"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}