MevvMail documentation

Deliver the email, then be able to prove it.

MevvMail takes over wp_mail(), sends through the connections you configure, retries what fails and records every attempt in a table in your own database. This guide covers installation, the connection screen field by field, the order the chain is walked in, the log, the WooCommerce order box, the Pro screens and what to check when a message does not arrive.

What it does

WordPress hands every email to the server’s own mail() function, which is unauthenticated. Mailboxes treat that mail as suspicious, and when it is refused nobody is told: wp_mail() returns false, the page carries on, and the password reset or the order confirmation is simply gone.

MevvMail replaces that path. It sends through an authenticated connection you configure, walks a list of connections in priority order until one accepts the message, retries the ones that fail, and shows the delivery status of a WooCommerce order right on the order screen.

Use it when
Your store sends order, account or invoice email and you need to be able to answer “did it go out?” with a record rather than a guess.
It changes nothing until you configure it
With no connection defined the filter hands the send straight back to WordPress. Activating the plugin never silently takes over a working mail path.
It is not a sending service
MevvMail does not resell delivery and has no quota of its own. You bring your own SMTP server or your own provider account, and the plugin uses it.

Requirements: WordPress 6.0 or newer and PHP 8.1 or newer. WooCommerce is optional — without it everything works the same and only the order box is missing.

Installation

  1. Install the free MevvMail plugin: upload the zip through Plugins → Add New, or copy the mevvmail directory into /wp-content/plugins/.
  2. Activate it. Nothing is taken over yet.
  3. Open MevvMail → Connections and add your first connection.
  4. Press Send test email and confirm the message arrives.
  5. Optional but recommended: add a second connection with a lower priority as a fallback.
  6. Only if you want the Pro surfaces: install MevvMail Pro as a second plugin and activate your MEVM licence under MevvMail → License.

Keep the free plugin active when Pro is installed. Delivery, failover and the log live in the free plugin, so an expired licence never stops your store sending email.

Connections

A connection is one way out of your site. Ten types are available and every one of them is in the free plugin, with no feature held back and no send limit imposed by us.

SMTPPHP mail()BrevoSendGridMailgunPostmarkSparkPostElastic EmailSMTP2GOResend

The fields on the screen

Name
Your own label for the connection. It is what the log shows in the Connection column, so give it a name you will recognise at three in the morning.
Provider
Pick the type. The rest of the form changes with it: SMTP asks for a host, port, encryption and credentials, while an API provider asks for a key and, for Mailgun and SparkPost, a region.
Priority
A number. The chain is walked from the lowest priority upwards, so your main connection gets the smallest number and the fallback a larger one.
From name and From address
The sender the message goes out as. Use an address on a domain whose SPF, DKIM and DMARC records point at the provider you are sending through, or the mailbox will still be suspicious of perfectly delivered mail.
Force this sender on every email
Off by default. When it is on, this connection overrides whatever sender the message carried. Useful when a plugin sends as an address your provider will not authorise; harmful if you actually rely on per-plugin senders.
Active
An inactive connection is skipped by the chain and left on the screen. This is how you take one provider out of service without losing its settings.

Saved secrets are never printed back into the form. The password and API key fields show “Saved — leave blank to keep it”: type a value only when you are replacing it.

Test it before you trust it

Send test email sends a real message through that one connection and writes the result to the log like any other send. If it fails, the log carries the provider’s own reply — which is almost always the sentence that tells you what is wrong.

The chain, and what happens when it fails

When WordPress produces an email, MevvMail walks your connections in priority order and stops at the first one that accepts the message. A provider that is rate limiting, out of quota or down costs you an attempt, not the email. The whole walk is recorded as one log entry, not one per connection: a single email should not read as three separate failures.

When every connection has refused, the entry is logged as failed and queued for retry. It is tried three more times — after one minute, five minutes and thirty minutes — and then it stops. An address that does not exist will not start existing on the fortieth attempt.

Retries are scheduled with WP-Cron, which only runs when somebody visits the site. On a quiet site a retry can happen later than the minute it was scheduled for. If that matters, switch to a real server cron the usual way — DISABLE_WP_CRON in wp-config.php plus a wp-cron.php call from crontab. Nothing in MevvMail needs changing for that.

A chain worth having

  • Two connections at two different providers protect you from one provider’s bad day. Two connections at the same provider do not.
  • Keep one SMTP connection in the chain, or emails carrying attachments have nowhere to go (see below).
  • PHP mail() is a reasonable last resort but a poor first choice: it is the unauthenticated path the plugin exists to replace.

The email log

Every attempt is recorded in a table in your own database. Nothing about your email is sent to us — there is no telemetry, no analytics and no content scanning anywhere in the plugin.

What is recorded
Time, recipients, subject, status, the connection that handled it, the part of the site that produced it, the provider’s own reply and the attempt count.
Filters
By status (sent, failed, pending), by source and by date. The three of them together are usually the whole of a support investigation.
Source
A message can carry a label saying which plugin produced it — a form, a recovery email, a WooCommerce notification. The label is recorded in its own column and taken off the message before it goes out, so it never reaches the person receiving the email.
Resend
Any entry can be sent again from the list. It goes back through the chain from the top, so a connection that has since been fixed is used.
Store the email body
On by default. Switch it off and the log keeps headers only. Such an entry can then be inspected but not resent — and a send that fails is not queued for the retry ladder either, because in both cases nothing was kept to send.
Keep log entries for
7, 30, 90 days or forever. Older entries are removed on a schedule.

The log can contain personal data — addresses, subjects and, if you leave the setting on, message bodies. Review the retention setting and the body option against your own obligations before you go live, the same way you would any other store record.

Uninstalling

Deleting the plugin leaves your log and settings alone. There is a single opt-in on the Settings screen — Also delete the log table and all settings when the plugin is deleted — and it is off by default, because the destructive reading of “uninstall” should never be the one you get by accident.

Attachments

In version 1.0.0 attachments travel over SMTP only. The eight API providers do not send them, and this is a deliberate limit rather than a bug: each of those APIs wants a file in a different shape, and shipping eight half-tested encoders was not worth it.

  • An email carrying a file permanently skips API connections and looks for an SMTP one in the chain.
  • With an SMTP connection configured, invoices, tickets and PDFs go out normally.
  • With no SMTP connection configured, such an email is logged as failed rather than delivered without its file — a silent delivery without the invoice would be worse than a visible failure.

The practical rule is one line long: keep one SMTP connection in the chain, whatever else is in it.

WooCommerce orders

With WooCommerce active, each order screen gets a box listing the emails that order produced and the delivery status of each one. The question “did the customer get the confirmation?” is answered against the order instead of by searching a log.

The log also records which WooCommerce email a message was, so a retry that happens half an hour later still knows what it is sending — and, with a Pro licence, which routing rule and which subject line apply to it.

MevvMail works exactly the same on a site without WooCommerce. The order box is simply not there.

What a Pro licence adds

Everything above is in the free plugin: ten connection types, the failover chain, the retry ladder, the log, resend and the WooCommerce order box. Pro is a separate plugin that adds WooCommerce depth on top of delivery.

WooCommerce email designer
A logo, a base colour, a background colour, footer text and a subject line per email type, with a preview of the saved design. The design is applied by the free plugin, so it survives the licence being switched off.
Open tracking
An optional 1×1 pixel served by your own site, recorded as a single timestamp in the Opened column of the log. Off by default. No IP address, email client, referrer, location, device or open count is collected, and no open rate is shown anywhere.
Failure alerts
One email or webhook per outage, after a number of consecutive failures you choose. The alert goes out over the server’s own mail path — so it can still reach you when your connections are the thing that is broken — and it carries no recipient, subject or body from the failed message.
Conditional routing
Rules on the source tag or the WooCommerce email type move a connection to the front of the chain. The chain is never narrowed, so failover keeps working, and the rule still matches on a delayed retry.

The licence is activated under MevvMail → License with a key beginning MEVM. If it expires, the designer, tracking, alerts and routing stop; delivery, failover and the log carry on, because they were never Pro’s to hold.

Open tracking is a hint, not a measurement. A mailbox that blocks images or a proxy that caches them makes the pixel silent or early. That is why only the first open is kept, and why the product shows no open rate.

What leaves your server

Two things, and both are listed here.

  1. Your email, to the provider you configured. Sender, recipients, subject, body, any Reply-To and custom headers, and your own API key so the provider can authenticate you. Nothing is added by MevvMail — no site address, no user data, no identifier of ours — and nothing is sent to any provider until you create a connection of that type.
  2. An update check. Two values, the plugin slug and the installed version number, sent to https://mevvsoft.com/api/v1/license/free-update when WordPress runs its own update check and the cached answer is older than twelve hours. No site address, no email address, no licence key, no plugin list, no usage statistics. The reply is signed and an unsigned one is discarded. The copy distributed through the WordPress Plugin Directory does not contain the updater file at all.

The publisher receives no email content, no recipient addresses, no log records and no analytics from this plugin. The log is a table in your own database, and you decide how long it is kept and whether message bodies are kept at all.

Troubleshooting

The log says sent, but it did not arrive
“Sent” means the connection accepted the message, not that the mailbox filed it in the inbox. Check spam, then check that the From address is on a domain whose SPF, DKIM and DMARC records authorise the provider you are sending through. Most of the mail that vanishes at this stage is authentication, not delivery.
Everything fails on the first connection
Open the entry and read the provider’s own reply: it is stored with the attempt. Wrong port and wrong encryption, an expired key and a sender the provider will not authorise account for most of them.
An email with an attachment failed
Check whether your chain contains an SMTP connection. Without one, an email carrying a file is logged as failed on purpose.
Retries never happen
Two causes. WP-Cron only runs when somebody visits the site, so on a quiet site the retry waits for traffic — or switch to a real server cron. The other is “Store the email body”: with it off there is nothing to retry with, and the failed entry is left alone on purpose.
The Resend button did nothing
That entry was logged without its body, so there is nothing to send. Turn “Store the email body” back on for the entries you may want to resend.
The Pro screens are missing
Check that the free plugin is active, the Pro plugin is active and the licence is activated. All three are required, and the licence screen says which one is not satisfied.

When you write to us, send the plugin versions, the WordPress and PHP versions, the connection type and the exact text of the provider’s reply from the log entry. Remove customer addresses and the message body first; the reply is almost always enough on its own.