{"id":373161,"date":"2026-09-25T07:02:55","date_gmt":"2026-09-25T07:02:55","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/wt-smtp\/"},"modified":"2026-09-25T07:02:34","modified_gmt":"2026-09-25T07:02:34","slug":"wt-smtp","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/wt-smtp\/","author":23487023,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.7","stable_tag":"1.0.7","tested":"7.1.2","requires":"6.7","requires_php":"8.1","requires_plugins":null,"header_name":"WT SMTP","header_author":"webmasters.team","header_description":"Lightweight SMTP with first-class diagnostics \u2014 connect any mail provider, log delivery, troubleshoot from one panel (DNS health check, test email, copy-to-clipboard diagnostic).","assets_banners_color":"dba4b0","last_updated":"2026-09-25 07:02:34","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/webmasters.team\/","header_plugin_uri":"","header_author_uri":"https:\/\/webmasters.team\/en\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":33,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.7":{"tag":"1.0.7","author":"webmastersteam","date":"2026-09-25 07:02:34","revision":3712544}},"upgrade_notice":{"1.0.7":"<p>Requires PHP 8.1 or newer.<\/p>","1.0.6":"<p>Internal identifiers renamed to a unique prefix (wtsmtp). If you defined WT_SMTP_KEY or hooked wt_smtp\/after_send, use WTSMTP_KEY and wtsmtp\/after_send instead.<\/p>","1.0.4":"<p>Confirmed compatible with WordPress 7.1. No code changes.<\/p>","1.0.3":"<p>Minimum WordPress version is now 6.7. System Status diagnostics use wp_get_wp_version(). No data changes.<\/p>","1.0.2":"<p>Minor compatibility update for the System Status panel. No behaviour or data changes - safe upgrade.<\/p>","1.0.1":"<p>Pre-approval Plugin Check hardening. No behavioural change \u2014 safe upgrade.<\/p>","1.0.0":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3712544,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3712544,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3712544,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3712544,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.7"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings page \u2014 SMTP connection, provider presets, From override.","2":"System status panel with live DNS health check (SPF, DKIM, DMARC, MX).","3":"Mail Log \u2014 every outgoing email with sent \/ failed status and resend."}},"plugin_section":[],"plugin_tags":[94,17561,267,212757,6696],"plugin_category":[41,59],"plugin_contributors":[261801],"plugin_business_model":[],"class_list":["post-373161","plugin","type-plugin","status-publish","hentry","plugin_tags-debug","plugin_tags-deliverability","plugin_tags-email","plugin_tags-mail-log","plugin_tags-smtp","plugin_category-communication","plugin_category-utilities-and-tools","plugin_contributors-webmastersteam","plugin_committers-webmastersteam"],"banners":{"banner":"https:\/\/ps.w.org\/wt-smtp\/assets\/banner-772x250.png?rev=3712544","banner_2x":"https:\/\/ps.w.org\/wt-smtp\/assets\/banner-1544x500.png?rev=3712544","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wt-smtp\/assets\/icon-128x128.png?rev=3712544","icon_2x":"https:\/\/ps.w.org\/wt-smtp\/assets\/icon-256x256.png?rev=3712544","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>WT Waitlist<\/strong> sends back-in-stock emails, <strong>WT Hardening<\/strong> logs security events, and now <strong>WT SMTP<\/strong> makes sure those emails actually arrive \u2014 and tells you exactly why they do not.<\/p>\n\n<p>Built by the <a href=\"https:\/\/webmasters.team\">webmasters.team<\/a> team. Open-source, no external dependencies, no Pro upsell.<\/p>\n\n<h4>Why another SMTP plugin?<\/h4>\n\n<p>Because most SMTP plugins tell you whether a send returned <code>true<\/code> or <code>false<\/code>. WT SMTP tells you <strong>why mail goes to spam before you even press Send<\/strong>: the Settings page runs a live SPF \/ DKIM \/ DMARC \/ MX check against your From domain and surfaces missing records inline. No external tool, no copy-pasting domain names into third-party validators.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Drop-in SMTP<\/strong> for any provider \u2014 generic host\/port\/encryption\/auth, plus one-click presets for Gmail, Outlook \/ Microsoft365, SendGrid, Brevo, Mailgun, Amazon SES and MailHog (dev).<\/li>\n<li><strong>AES-256 password encryption at rest<\/strong> when you define <code>WTSMTP_KEY<\/code> in <code>wp-config.php<\/code> \u2014 falls back to plaintext storage with a visible warning if the key is missing.<\/li>\n<li><strong>Mail log<\/strong> in a dedicated table (<code>{prefix}_wtsmtp_log<\/code>) \u2014 metadata only, no bodies or attachments \u2014 with one-click resend for failed messages and configurable retention (default 30 days).<\/li>\n<li><strong>Live DNS health check<\/strong> for the From domain \u2014 MX, SPF, DMARC, plus DKIM probing for any selectors you configure (defaults: <code>default<\/code>, <code>google<\/code>, <code>selector1<\/code>). Cached for 1 hour to keep the Settings page snappy.<\/li>\n<li><strong>Test email<\/strong> with full PHPMailer <code>ErrorInfo<\/code> surfaced on failure \u2014 the actual reason <code>wp_mail()<\/code> returned <code>false<\/code>.<\/li>\n<li><strong>Conflict detection<\/strong> \u2014 warns when another SMTP plugin (WP Mail SMTP, FluentSMTP, Post SMTP, Easy WP SMTP\u2026) is also active and would fight over <code>phpmailer_init<\/code>.<\/li>\n<li><strong>Copy diagnostic info<\/strong> \u2014 paste-ready text block with environment, config, log counts, DNS results and conflict notes for support tickets.<\/li>\n<li><strong>GDPR-friendly recipient anonymization<\/strong> in the log (e.g. <code>j***@example.com<\/code>) \u2014 opt-in.<\/li>\n<li><strong>Zero external dependencies<\/strong> \u2014 no Composer, no JS framework, no call-home.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>WT SMTP sends your site's outgoing email through an SMTP server, and it can look up your domain's email DNS records for the built-in deliverability diagnostic. Both are described below.<\/p>\n\n<h4>Your SMTP server \/ provider<\/h4>\n\n<p>When WordPress sends an email (<code>wp_mail()<\/code>), WT SMTP hands the message to the SMTP server you configure under Settings -&gt; WT SMTP. The email (its headers, subject, recipients and body) and the SMTP username and password you entered are transmitted to that server whenever WordPress sends a message.<\/p>\n\n<p>The SMTP server can be your own mail server or a third-party provider. For convenience the plugin ships connection presets for the providers below; choosing a preset only fills in the host and port. You still enter your own credentials, and nothing is sent anywhere until WordPress actually sends an email:<\/p>\n\n<ul>\n<li>Gmail \/ Google Workspace - terms: https:\/\/policies.google.com\/terms - privacy: https:\/\/policies.google.com\/privacy<\/li>\n<li>Microsoft 365 \/ Outlook - terms: https:\/\/www.microsoft.com\/servicesagreement - privacy: https:\/\/privacy.microsoft.com\/privacystatement<\/li>\n<li>SendGrid (Twilio) - terms: https:\/\/www.twilio.com\/legal\/tos - privacy: https:\/\/www.twilio.com\/legal\/privacy<\/li>\n<li>Brevo (Sendinblue) - terms: https:\/\/www.brevo.com\/legal\/termsofuse\/ - privacy: https:\/\/www.brevo.com\/legal\/privacypolicy\/<\/li>\n<li>Mailgun - terms: https:\/\/www.mailgun.com\/legal\/terms\/ - privacy: https:\/\/www.mailgun.com\/legal\/privacy-policy\/<\/li>\n<li>Amazon SES - terms: https:\/\/aws.amazon.com\/service-terms\/ - privacy: https:\/\/aws.amazon.com\/privacy\/<\/li>\n<\/ul>\n\n<p>If you use a different SMTP server, its own terms and privacy policy apply. WT SMTP does not send your data to webmasters.team or any of its own servers.<\/p>\n\n<h4>Domain DNS lookup (deliverability diagnostic)<\/h4>\n\n<p>The optional \"DNS health check\" on the settings screen performs standard public DNS lookups (MX, SPF, DMARC and DKIM records) for your site's own email domain, using PHP's <code>dns_get_record()<\/code>. It is a normal DNS query and the result is cached for one hour. No personal data is sent, and the lookup only runs when you open the diagnostic.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate <strong>WT SMTP<\/strong>.<\/li>\n<li>Open <strong>WT SMTP \u2192 Settings<\/strong> in the admin.<\/li>\n<li>(Recommended) Add <code>define('WTSMTP_KEY', 'a long random string');<\/code> to <code>wp-config.php<\/code> to enable AES-256 password encryption.<\/li>\n<li>Pick a provider preset (or enter your own host), add credentials, set the From email, save.<\/li>\n<li>Click <strong>Send test email to admin<\/strong> to verify the pipeline.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20do%20i%20get%20smtp%20credentials%3F\"><h3>Where do I get SMTP credentials?<\/h3><\/dt>\n<dd><p>From your mail provider. Most providers (Gmail, Outlook, Brevo, SendGrid, Mailgun, Amazon SES) require an <strong>app password<\/strong> or <strong>API-key-as-password<\/strong>, not your regular account password.<\/p><\/dd>\n<dt id=\"why%20is%20the%20password%20stored%20in%20plaintext%3F\"><h3>Why is the password stored in plaintext?<\/h3><\/dt>\n<dd><p>It is not \u2014 if you defined <code>WTSMTP_KEY<\/code> in <code>wp-config.php<\/code>. Without it, the plugin falls back to plaintext and shows a visible warning in the Settings panel. Defining the key takes 30 seconds and is strongly recommended.<\/p><\/dd>\n<dt id=\"the%20dns%20health%20check%20shows%20%22dns%20lookups%20blocked%20by%20host%22.%20what%20now%3F\"><h3>The DNS health check shows \"DNS lookups blocked by host\". What now?<\/h3><\/dt>\n<dd><p>Some low-cost shared hosts disable <code>dns_get_record()<\/code>. Use an external DNS lookup tool (<a href=\"https:\/\/mxtoolbox.com\/\">mxtoolbox.com<\/a>) for your From domain, or move to a host that allows DNS queries. The rest of the plugin still works.<\/p><\/dd>\n<dt id=\"i%20see%20%22wp%20mail%20smtp%20is%20also%20active%22%20in%20the%20system%20status.\"><h3>I see \"WP Mail SMTP is also active\" in the System status.<\/h3><\/dt>\n<dd><p>Two SMTP plugins on one site will fight over the <code>phpmailer_init<\/code> hook \u2014 only one wins, and you cannot predict which. Disable one.<\/p><\/dd>\n<dt id=\"will%20this%20slow%20down%20my%20site%3F\"><h3>Will this slow down my site?<\/h3><\/dt>\n<dd><p>No. SMTP wire-up only happens when <code>wp_mail()<\/code> is actually called. The DNS health check is cached for 1 hour. Logging is a single INSERT per send.<\/p><\/dd>\n<dt id=\"can%20i%20forward%20the%20log%20to%20my%20own%20monitoring%3F\"><h3>Can I forward the log to my own monitoring?<\/h3><\/dt>\n<dd><p>Yes. Hook the <code>wtsmtp\/after_send<\/code> action (fires after each log INSERT) and pipe the row anywhere you like.<\/p><\/dd>\n<dt id=\"will%20old%20log%20entries%20clog%20the%20database%3F\"><h3>Will old log entries clog the database?<\/h3><\/dt>\n<dd><p>No. The plugin schedules a daily purge of entries older than the configured retention (default 30 days).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Fix: raised the minimum PHP version to 8.1 to match the code (the plugin uses readonly properties, introduced in PHP 8.1); this prevents a parse error when activated on PHP 8.0.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Housekeeping: renamed internal code identifiers (defines, options, hooks, transients, admin-page slugs) to the unique <code>wtsmtp<\/code> prefix to avoid conflicts. The public action hook is now <code>wtsmtp\/after_send<\/code>; the encryption constant is now <code>WTSMTP_KEY<\/code>.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Docs: documented the external services the plugin uses (the configured SMTP server\/provider and the domain DNS deliverability lookup).<\/li>\n<li>New: the documented <code>wtsmtp\/after_send<\/code> action now fires after each mail-log entry is written.<\/li>\n<li>Housekeeping: moved \"Tested up to\" out of the main plugin file (readme is the single source), removed the plugin header URI.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Compatibility: tested up to WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Raised the minimum required WordPress version to 6.7 and use <code>wp_get_wp_version()<\/code> (the recommended replacement for the global <code>$wp_version<\/code>) for the WordPress version shown in the System Status diagnostics. No user-facing change.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Compatibility: use <code>wp_get_wp_version()<\/code> (WordPress 6.7+) instead of reading the global <code>$wp_version<\/code> in the System Status diagnostics, with a fallback for older cores. No user-facing behaviour change.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Pre-approval hardening: addressed Plugin Check findings on the initial submission. No user-facing behaviour change.\n\n<ul>\n<li>Explicit <code>wp_unslash()<\/code> + <code>absint()<\/code> on all <code>$_GET<\/code> reads in the Mail Log list table.<\/li>\n<li>Documented <code>phpcs:ignore<\/code> annotations on nonce checks that happen later in the same flow (Mail Log resend, list-table filters).<\/li>\n<li>Class-level <code>phpcs:disable<\/code> with rationale on the mail-log repository \u2014 every query targets the plugin's own <code>{prefix}_wtsmtp_log<\/code> table built from <code>$wpdb-&gt;prefix<\/code>, no user-controlled identifiers anywhere.<\/li>\n<li>Same annotation on the <code>uninstall.php<\/code> DROP TABLE.<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<p>First public release.<\/p>\n\n<ul>\n<li>SMTP configuration with one-click provider presets (Gmail, Outlook \/ Microsoft365, SendGrid, Brevo, Mailgun, Amazon SES, MailHog).<\/li>\n<li>AES-256 password encryption at rest using <code>WTSMTP_KEY<\/code> (fallback to <code>AUTH_KEY<\/code> or plaintext with a warning).<\/li>\n<li>Custom mail-log table (<code>{prefix}_wtsmtp_log<\/code>) \u2014 metadata only, no bodies or attachments.<\/li>\n<li>Mail log admin screen with filtering, search, bulk delete and one-click resend.<\/li>\n<li>Test email AJAX with PHPMailer <code>ErrorInfo<\/code> surfaced on failure.<\/li>\n<li>Live DNS health check (MX \/ SPF \/ DMARC \/ DKIM with configurable selectors).<\/li>\n<li>Conflict detection for other SMTP plugins (WP Mail SMTP, FluentSMTP, Post SMTP, Easy WP SMTP, WP SMTP, WP Mail Bank).<\/li>\n<li>Copy-to-clipboard support diagnostic snippet.<\/li>\n<li>Opt-in GDPR recipient anonymization in the log.<\/li>\n<li>Daily purge cron with configurable retention (default 30 days).<\/li>\n<\/ul>","raw_excerpt":"Lightweight SMTP for WordPress with first-class diagnostics \u2014 connect any mail provider, log delivery, troubleshoot from one panel.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/373161","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=373161"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/webmastersteam"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=373161"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=373161"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=373161"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=373161"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=373161"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=373161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}