A promo block in every email your site sends
Your site already sends more email than you think. New-user welcomes, comment notifications, order confirmations, contact form replies. Each one lands in an inbox that opened it on purpose, and the bottom of each one is empty. Internal Mail Ads fills that space with a block you write once: a line about your newest product, a coupon, or a signature with your logo and links.
It went on this site in July 2013, which makes it one of the oldest things here. The 2.0.0 download is new code written for WordPress 7 and PHP 8, one PHP file, one settings page.
How it attaches
The plugin sits on the standard wp_mail filter at priority 999 and inspects each outgoing message. If the email is HTML, your HTML block is wrapped in <div class="internal-mail-ads"> and placed above or below the message as you choose; when the message is a full HTML document the block goes inside <body> rather than after it. If the email is plain text, you get the plain-text version you wrote, or, if you left that empty, the HTML block converted to text with link URLs written out in brackets.
Because it hooks wp_mail(), it works with WooCommerce, form plugins, membership plugins and anything else that sends mail the WordPress way. Mail that goes straight out through an external API, which some SMTP services do, bypasses WordPress and is not touched. That is the main thing this plugin does not do, and there is no way round it from our side.
Keeping it out of system mail
Nobody wants a coupon under a password reset. The skip list leaves alone any email whose subject contains “password”, “reset” or “verification”, and you can add phrases of your own. There is also an “HTML emails only” option that leaves every plain-text email untouched. For anything finer, the internal_mail_ads_apply filter lets you decide per email in code.
The settings page
- Enable tick box, so you can switch it off without deactivating
- HTML block (saved through
wp_kses_post) and an optional plain-text block - Above or below the message
- Skip list, one phrase per line
- “Send me a test email” button, nonce-protected, so you see the result in your own inbox before anyone else does
What changed since 2013
The original page promised twelve months of stats on how your message performed. This build keeps no stats and sends nothing anywhere: no tracking, no external requests. We read the content type from the headers, array or string form, and fall back to the wp_mail_content_type filter that many plugins use. Tested on WordPress 7.1.4 with PHP 8.3 and WP_DEBUG on; needs WordPress 5.0 and PHP 7.4 or newer.






