Description
WordPress sends email through PHP mail() by default — unauthenticated, often blocked, and invisible when it fails. MailKite SMTP replaces it with reliable delivery, a free email log, automatic failover, and inbound email.
Free forever. No Pro tier. No locked features. Open source.
Send through any provider
- MailKite (recommended): free tier, ~2-minute setup, open/click tracking, and inbound email. Sign up at mailkite.dev.
- SendGrid, Brevo, Mailgun — bring your own API key.
- Any SMTP server — host, port, TLS/SSL, credentials.
- Routing rules: send WooCommerce receipts via one provider and newsletters via another, by subject or recipient.
Never lose an email
- Automatic failover — if the API provider fails, the email retries through your SMTP server or PHP mail, free.
- Instant failure alerts — email, Slack, Discord, or any webhook, the moment a send fails (rate-limited, no alert storms).
- Email log with resend and CSV export, configurable retention, and one-click resend of failures.
- Weekly summary — sent/failed counts, top errors, and DNS status in your inbox.
Private by design
- Auth-email redaction (on by default): bodies of password-reset and verification emails are never stored, so a leaked database or log page can never leak reset links.
- Stored credentials are encrypted at rest (AES-256-GCM keyed from your wp-config salts).
- No telemetry. No external calls until you connect a provider.
Receive email in WordPress
Send email and receive it too. Turn inbound on (one click — the webhook and its signature verification are installed on your MailKite domain automatically) and you get three things:
- Turn an email into a WordPress action. Every message fires
do_action( 'mailkite_smtp_inbound', $message, $payload ), so your plugins and theme can act on it: open a support ticket, attach a customer’s reply to their WooCommerce order, post to a forum, hand it to an AI agent. - Nothing vanishes. Your site sends from a no-reply address and people reply anyway; bounces and out-of-office notices come back too. Without inbound those are lost silently — with it they land in the Email Log next to the message they answer, and you can reply from WordPress, in-thread, as your own domain.
- Or just forward it. No code: send a copy of everything to an address you already read.
For professionals
- One-click migration from WP Mail SMTP, Easy WP SMTP, FluentSMTP, and Post SMTP.
- WP-CLI:
wp mailkite status|test|log|purge. - Site Health integration and a Domain Health tab (SPF/DMARC checks with weekly drift alerts).
- Settings export/import (secrets excluded) and
wp-config.phpconstants (MAILKITE_API_KEY,MAILKITE_DEFAULT_MAILER) for automated provisioning. - Works with WooCommerce, Contact Form 7, WPForms, and anything using
wp_mail().
External services
This plugin does not contact any external service until you choose a mailer and enter its credentials. Out of the box, with the built-in PHP mailer or your own SMTP server, no data leaves your site to any third party.
When you select an API-based mailer, the email you send — sender, recipients, subject, body, and any attachments — is transmitted to that provider at the moment the email is sent, because that provider is what delivers it. Each service, the host it contacts, and what is sent:
- MailKite — host
api.mailkite.dev(configurable; the plugin contacts whatever host is set as the API base). Used to deliver outbound email through your MailKite account, to report delivery events back into the Email Log, and — if you turn inbound on — to register a webhook so MailKite can deliver received email to your site. Sent when you send mail: the message and its attachments. Sent when you connect your account: your email address (to create an account) or an OAuth authorization, and the domain id you pick for inbound. Received from MailKite: inbound email addressed to your domain. Terms of service · Privacy policy - SendGrid — host
api.sendgrid.com. Used to deliver outbound email with your SendGrid API key. Sent when you send mail: the message and its attachments. Terms of service · Privacy policy - Brevo — host
api.brevo.com. Used to deliver outbound email with your Brevo API key. Sent when you send mail: the message and its attachments. Terms of use · Privacy policy - Mailgun — host
api.mailgun.net, orapi.eu.mailgun.netwhen you select the EU region. Used to deliver outbound email with your Mailgun API key. Sent when you send mail: the message and its attachments. Terms of service · Privacy policy - Your own SMTP server — the host, port, and credentials you configure. Used to deliver outbound email. Sent when you send mail: the message and its attachments. This is your own or your host’s server; no third-party terms apply.
Failure alerts (optional, off unless you configure them)
If you enter an alert webhook URL, the plugin sends a notification to that URL, and only when an email fails to send. What is sent: your site’s hostname, the failed message’s subject line, and the error text reported by the mailer. The message body is never included, and recipients are not sent as a field — though a provider’s error text can itself quote an address it rejected. The URL is yours to choose, so the receiving service is whichever one you point it at — commonly:
- Slack — host
hooks.slack.com, when you paste a Slack incoming-webhook URL. Terms of service · Privacy policy - Discord — host
discord.com, when you paste a Discord webhook URL. Terms of service · Privacy policy - Any other endpoint you supply, including one on your own infrastructure, which receives the same JSON payload.
Leaving the alert webhook field empty means no request is ever made.
FAQ
-
Is this plugin really free?
-
Yes. Every feature is free and always will be — including logs, failover, and alerts. MailKite (the email service) has free and paid plans, but the plugin works fully with your own SMTP server or SendGrid/Brevo/Mailgun keys and never requires a MailKite account.
-
Why are some log entries missing a body?
-
Password-reset, login, and verification emails are stored without their body by default, so a compromised database can never leak reset links. Disable in Settings if you accept the risk.
-
Does it work with WooCommerce / Contact Form 7 / WPForms?
-
Yes — the plugin intercepts
wp_mail(), which they all use. -
How do I receive email into WordPress?
-
Open the Inbound tab, pick your domain, and press “Turn on inbound” — the plugin installs the webhook and its signature verification on your MailKite account for you. Nothing to copy, paste, or configure by hand. Then read arriving mail in the Email Log, handle
mailkite_smtp_inboundin your code, or set a forwarding address. -
Can I reply to email from WordPress?
-
Yes. Received messages get a Reply action in the Email Log. The reply goes out as the address the message was delivered to — your own verified domain, never a spoofed sender — and it threads correctly, so the conversation stays together in the recipient’s mail client. Both halves show under Conversation on the message.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“MailKite SMTP – Multi-Provider SMTP with Failover, Email Logs & Inbound Email” is open source software. The following people have contributed to this plugin.
ContributorsInterested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
0.4.2
- The REST email-log endpoint returns site mail only. It previously selected the log table directly and so could return metadata — recipient, sender, subject — for mail owned by a user’s personal mailbox, which the admin screen and the CSV export already excluded.
- The same site-mail restriction now applies to the WP-CLI log listing, the Site Health failure count and the weekly summary digest.
- Every read of the log tables goes through the log store, where ownership is part of the query, so no caller can drift from the restriction again.
0.4.1
- The inbound webhook route now authenticates in its
permission_callbackrather than inside the handler, so an unauthenticated request is rejected before any handler code runs. - Settings input is sanitized field by field as it arrives, with the function appropriate to each field’s type, in addition to the existing validation before storage.
- Imported settings JSON is sanitized after decoding —
json_decode()parses but does not clean. - The OAuth connect callback carries a WordPress nonce through the
stateround-trip and verifies it, alongside the existing single-use, user-bound state transient. - Every REST route states its capability check inline.
- Readme documents each external service’s host, what is sent and when, and its terms and privacy links — including the optional failure-alert webhooks.
0.4.0
- Received mail is now stored in WordPress, so it stays readable after MailKite’s retention window ends.
- One inbound webhook serves this plugin and MailKite Mailboxes, writing to one set of tables instead of two.
- Mail belonging to a user’s personal mailbox no longer appears in the site-wide Email Log — ownership is enforced in the query, not in the template.
- Retention purges site mail only; personal mailbox mail is never deleted by it.
- A send that falls back to another mailer is labelled as such in the log, instead of reporting plain success.
- Inbound webhooks are registered on the connected MailKite account automatically — no copying URLs by hand.
0.3.0
- Inbound: reply to received mail from the Email Log, threaded (From is forced to the address it was delivered to).
- Log stores the real sender, conversation id and message id; conversation view groups both sides of an exchange.
- Inbound tab explains what inbound is for, with the developer hook, log link and forwarding in one place.
- User mailboxes moved to their own plugin, MailKite Mailboxes — real addresses for WordPress users, an Inbox screen and
[mailkite_inbox].
0.2.0
- SendGrid, Brevo, and Mailgun mailers (bring your own key).
- Automatic failover to SMTP/PHP mail when an API send fails.
- Instant failure alerts: email + Slack/Discord/webhook.
- Routing rules by subject/recipient.
- Inbound email webhook +
mailkite_smtp_inboundhook + forwarding. - Domain Health (SPF/DMARC) with weekly drift alerts; weekly summary email.
- Site Health tests, WP-CLI commands, settings export/import.
- Open/click tracking toggles for MailKite sends; large attachments upload by URL.
0.1.0
- Initial release: MailKite API mailer, generic SMTP mailer, email log with redaction and resend, test emails, force-from, REST API.
