{"id":365075,"date":"2026-09-07T12:44:17","date_gmt":"2026-09-07T12:44:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/appideas-email-holinator\/"},"modified":"2026-09-07T12:44:05","modified_gmt":"2026-09-07T12:44:05","slug":"appideas-email-holinator","status":"publish","type":"plugin","link":"https:\/\/es-co.wordpress.org\/plugins\/appideas-email-holinator\/","author":17424463,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.2","stable_tag":"1.3.2","tested":"7.1","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"APPideas Email Holinator","header_author":"appideasdotcom","header_description":"Hold outbound email before it leaves this site, and keep a log of what was stopped.","assets_banners_color":"6d93af","last_updated":"2026-09-07 12:44:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/appideas.com\/email-holinator\/","header_author_uri":"https:\/\/appideas.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":67,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.2":{"tag":"1.3.2","author":"appideasdotcom","date":"2026-09-07 12:44:05","revision":3684923}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3684923,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3684923,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3684923,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3684923,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3684923,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.3.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3684923,"resolution":"1","location":"assets","locale":"","width":2880,"height":1800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3684923,"resolution":"2","location":"assets","locale":"","width":1940,"height":484},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3684923,"resolution":"3","location":"assets","locale":"","width":2880,"height":1800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3684923,"resolution":"4","location":"assets","locale":"","width":2880,"height":1800},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3684923,"resolution":"5","location":"assets","locale":"","width":2880,"height":1760}},"screenshots":{"1":"The email log: every message the site tried to send, held before it left, with search, sort and a CSV download.","2":"The toolbar panel: Block and Log are one hover away from every wp-admin screen, and the icon turns red while mail is being held.","3":"A held message opened in the reader, shown the way it would have arrived, with resend and print.","4":"The Tools tab: what the two switches are doing right now, and a real test message sent through them with a step-by-step transcript.","5":"Get PRO: what the paid add-on adds."}},"plugin_section":[],"plugin_tags":[734,267,1522,6696,19979],"plugin_category":[41],"plugin_contributors":[279573],"plugin_business_model":[],"class_list":["post-365075","plugin","type-plugin","status-publish","hentry","plugin_tags-development","plugin_tags-email","plugin_tags-logging","plugin_tags-smtp","plugin_tags-staging","plugin_category-communication","plugin_contributors-appideasdotcom","plugin_committers-appideasdotcom"],"banners":{"banner":"https:\/\/ps.w.org\/appideas-email-holinator\/assets\/banner-772x250.png?rev=3684923","banner_2x":"https:\/\/ps.w.org\/appideas-email-holinator\/assets\/banner-1544x500.png?rev=3684923","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/appideas-email-holinator\/assets\/icon.svg?rev=3684923","icon":"https:\/\/ps.w.org\/appideas-email-holinator\/assets\/icon.svg?rev=3684923","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/appideas-email-holinator\/assets\/screenshot-1.png?rev=3684923","caption":"The email log: every message the site tried to send, held before it left, with search, sort and a CSV download."},{"src":"https:\/\/ps.w.org\/appideas-email-holinator\/assets\/screenshot-2.png?rev=3684923","caption":"The toolbar panel: Block and Log are one hover away from every wp-admin screen, and the icon turns red while mail is being held."},{"src":"https:\/\/ps.w.org\/appideas-email-holinator\/assets\/screenshot-3.png?rev=3684923","caption":"A held message opened in the reader, shown the way it would have arrived, with resend and print."},{"src":"https:\/\/ps.w.org\/appideas-email-holinator\/assets\/screenshot-4.png?rev=3684923","caption":"The Tools tab: what the two switches are doing right now, and a real test message sent through them with a step-by-step transcript."},{"src":"https:\/\/ps.w.org\/appideas-email-holinator\/assets\/screenshot-5.png?rev=3684923","caption":"Get PRO: what the paid add-on adds."}],"raw_content":"<!--section=description-->\n<p>APPideas Email Holinator stops this site sending email, and records the messages it\nheld so you can see exactly what would have gone out.<\/p>\n\n<p>The two switches that matter \u2014 <strong>Block emails<\/strong> and <strong>Log emails<\/strong> \u2014 are pinned to\nthe admin toolbar, one hover away from every screen in wp-admin. The toolbar icon\nturns orange while mail is being logged and red while it is being held, so you can\ntell at a glance what the site is doing with its email.<\/p>\n\n<p>It adds one wp-admin screen and that toolbar item, and nothing else: no\npublic-facing frontend, no dashboard widgets, and no changes to the body of any\nother admin page.<\/p>\n\n<h4>Holding<\/h4>\n\n<ul>\n<li>Block emails holds everything that goes out through wp_mail(), before it reaches any mail transport \u2014 WordPress's own, or an SMTP plugin's.<\/li>\n<li>On WordPress's own mail path a held message is answered as sent, so a held password reset or order confirmation does not turn into an error message on a site that was never meant to send it.<\/li>\n<li>Two constants for wp-config.php, AIEH_PERMAHOLE and AIEH_PERMALOG, force a switch on and lock it in the toolbar \u2014 for a development site seeded from production data, where forgetting once is once too many.<\/li>\n<\/ul>\n\n<h4>The log<\/h4>\n\n<ul>\n<li>Log emails records every message sent through wp_mail() \u2014 sender, recipients, subject and body \u2014 held or not, and the Holinator screen lists them newest first with search, sort and a CSV download.<\/li>\n<li>Open a message to read it the way it would have arrived, with an HTML body rendered in a sandbox; resend it exactly as it was sent, or open a print-friendly view.<\/li>\n<li>A message the mail transport rejected is recorded as failed, with the transport's own error, and the log keeps the newest 1,000 messages.<\/li>\n<\/ul>\n\n<h4>Tools<\/h4>\n\n<ul>\n<li>A status card shows what the two switches are doing right now, and updates the moment a switch is flipped in the toolbar.<\/li>\n<li>Send a real test message through the current settings and read a step-by-step transcript of what happened to it.<\/li>\n<\/ul>\n\n<h4>External services<\/h4>\n\n<p>This plugin contacts no external service. Nothing is sent to APPideas or to any third\nparty, and there is no analytics, telemetry, licence check, or update service of any\nkind.<\/p>\n\n<h4>APPideas Email Holinator PRO adds<\/h4>\n\n<ul>\n<li>An allow list \u2014 the accounts and roles you name still get their mail while everything else stays held.<\/li>\n<li>A block list \u2014 mail goes out as usual, and only the accounts and roles you name are held.<\/li>\n<li>Forwarding \u2014 messages that match are redirected to one address you can read, and the log records where each one actually went.<\/li>\n<li>Rules are written against the WordPress users and roles you already manage, and act on messages with a single recipient.<\/li>\n<\/ul>\n\n<p>PRO installs alongside this plugin rather than replacing it, and adds its controls to\nthe Tools tab of this plugin's own screen. See https:\/\/appideas.com\/email-holinator\/<\/p>\n\n<h3>Test Analysis<\/h3>\n\n\n\n\n  Suite\n  Metric\n  v 1.3.2\n\n\n\n\n  PHP (PHPUnit)\n  Line coverage\n  99.36 %\n\n\n  PHP (PHPUnit)\n  Tests\n  304\n\n\n  JavaScript (Jest)\n  Statement coverage\n  98.48 %\n\n\n  JavaScript (Jest)\n  Branch coverage\n  93.06 %\n\n\n  JavaScript (Jest)\n  Tests\n  315\n\n\n  End-to-end (Playwright)\n  Tests\n  203\n\n\n\n\n<p>Version 1.3.2 lints clean \u2014 zero errors, zero warnings, and zero suppressions \u2014 against\nWordPress Coding Standards 3.4.1 on PHP_CodeSniffer 3.13.5, PHPCompatibilityWP 2.1.8\nchecked from PHP 7.4 upward, and @wordpress\/eslint-plugin 22.22.0 on ESLint 8.57.1. Plugin\nCheck 2.1.0 reports no errors against the shipped files, across every check category; its\n26 warnings are the direct-database-query notices on the one file that owns the log table\nand two for reading WordPress's own mail filters, each reviewed and kept on purpose.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install it from the Plugins\nscreen in wp-admin.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Hover the Holinator icon in the admin toolbar for the two switches, or open\n<strong>Tools \u2192 Holinator<\/strong> for the log.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20change%20how%20my%20site%20sends%20email%3F\"><h3>Does this change how my site sends email?<\/h3><\/dt>\n<dd><p>Only while it is active. Deactivating the plugin restores WordPress's normal\nbehaviour immediately.<\/p><\/dd>\n<dt id=\"does%20it%20send%20anything%20anywhere%3F\"><h3>Does it send anything anywhere?<\/h3><\/dt>\n<dd><p>No. The plugin makes no outbound requests of any kind.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20smtp%20plugin%3F\"><h3>Does it work with my SMTP plugin?<\/h3><\/dt>\n<dd><p>Yes. A message is held before it reaches any mail transport, WordPress's own or a\nplugin's. The test suite sends real messages through WP Mail SMTP, Easy WP SMTP and\nFluentSMTP, and reproduces the hook orders Post SMTP and Mailgun use.<\/p><\/dd>\n<dt id=\"what%20can%20it%20not%20catch%3F\"><h3>What can it not catch?<\/h3><\/dt>\n<dd><p>A plugin that calls PHP's own mail() function, or talks to a mail service directly,\nnever goes through wp_mail(), so WordPress offers no hook to hold it. That is rare;\nwhatever uses wp_mail() \u2014 WordPress itself, WooCommerce, form plugins and SMTP\nplugins \u2014 is held.<\/p><\/dd>\n<dt id=\"how%20many%20messages%20does%20the%20log%20keep%3F\"><h3>How many messages does the log keep?<\/h3><\/dt>\n<dd><p>The newest 1,000. When a new message arrives past that, the oldest is removed.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20a%20multisite%20network%3F\"><h3>Does it work on a multisite network?<\/h3><\/dt>\n<dd><p>Yes. Each site has its own switches and its own log, and deleting the plugin from\nthe network removes every site's data.<\/p><\/dd>\n<dt id=\"where%20do%20i%20find%20it%3F\"><h3>Where do I find it?<\/h3><\/dt>\n<dd><p>Hover the Holinator icon in the admin toolbar for the two switches, or open\nTools \u2192 Holinator for the log, the Tools tab and Get PRO.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<li>Block emails now holds outbound mail before it leaves the site \u2014 every message WordPress sends through wp_mail().<\/li>\n<li>Log emails records every message WordPress sends through wp_mail(), and the Holinator screen lists them with a reader that shows each one the way it would have arrived.<\/li>\n<li>Logged messages can be opened and deleted one at a time, and the log keeps the newest 1,000.<\/li>\n<li>The log screen can search, sort, and download its contents as a CSV file.<\/li>\n<li>A stored message can be resent exactly as it was sent, or opened in a print-friendly view.<\/li>\n<li>A new Tools screen shows what the two switches are doing right now, and can send a real test message through them to see exactly what happens.<\/li>\n<li>AIEH_PERMAHOLE and AIEH_PERMALOG, set in wp-config.php, force Block and Log on and lock the toolbar switches \u2014 for a dev site seeded from production data.<\/li>\n<li>Flipping a switch in the toolbar now confirms on screen that the change was saved.<\/li>\n<\/ul>","raw_excerpt":"Hold outbound email before it leaves this site, and keep a log of what was stopped.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/365075","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=365075"}],"author":[{"embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/appideasdotcom"}],"wp:attachment":[{"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=365075"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=365075"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=365075"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=365075"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=365075"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=365075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}