Integrations
WordPress Plugin
The official SendFleet plugin sends every email WordPress sends through the SendFleet API: password resets, new-user emails, WooCommerce orders, contact forms and anything else that calls wp_mail(). Setup is one field, your API key.
What the plugin does
- Takes over wp_mail() cleanly. It uses the
pre_wp_mailfilter rather than replacing the pluggable function, and builds each message the way WordPress does, sowp_mail_from,wp_mail_content_type,phpmailer_initand every other mail filter keep working, WooCommerce's plain-text alternative included. - Always sends from a verified domain. If another plugin sets a sender on a domain your account cannot send from, the email goes out from your default sender with the original address in Reply-To.
- HTML, plain text and attachments. A plain-text part is generated for HTML-only emails. Attachments are checked against the API limits first, and a file that would be refused is left out and noted in the log rather than failing the whole email.
- Retries that cannot double-send. Rate limits, 502 queue_error and other failures where SendFleet confirms nothing was sent are retried from a queue with backoff. A timeout is never retried automatically, because the email may already have been accepted.
- Circuit breakers. A rejected key, a used-up plan or a suspended account stops further API calls at once instead of retrying into the same refusal.
- An email log without bodies. Recipient, sender, subject, status, sending mode, SendFleet message ID and the plugin that sent it. Bodies are never stored, and entries are deleted after 30 days by default.
- Built for operations. Site Health checks, a WP-CLI command, wp-config.php constants for every secret, encrypted key storage, multisite support, optional background sending through WP-Cron, an optional fallback to the default mailer, and personal data export and erasure.
Requirements
| Requirement | Detail |
|---|---|
| WordPress | 6.2 or later, single site or multisite |
| PHP | 7.4 or later |
| A SendFleet account | Create one for free: 50 emails a month, no card. |
| A verified sending domain | Ownership and DKIM records published and verified. See DNS Records. |
| An API key | From the dashboard, API Keys. See Authentication. |
How to send WordPress email through SendFleet
Install and activate the plugin
In WordPress, go to Plugins, then Add New, search for SendFleet, then choose Install and Activate. The plugin is free on the WordPress.org directory.Verify a sending domain
In the SendFleet dashboard, add your domain under Domains, publish the DNS records it shows you, and choose Verify all records. The plugin can only send from a verified domain.Create an API key
In the SendFleet dashboard, create a key under API Keys and copy it. The full key is shown exactly once.Connect WordPress
In WordPress, open SendFleet in the admin menu, paste the key and choose Connect. The plugin checks the key, reads your plan and verified domains, and picks a sender address on one of them.Send a test email
Send a test email from the same screen. From then on every email WordPress sends through wp_mail() goes through SendFleet.
Keep the API key out of the database
A key pasted on the settings screen is stored encrypted in the options table, with a key derived from your site's security salts. To keep it out of the database entirely, define it in wp-config.php instead. A constant always wins over the saved setting, and on multisite one constant serves the whole network.
// wp-config.php, above "That's all, stop editing!" define( 'SENDFLEET_API_KEY', 'abcd1234.your-secret-part' ); // Optional define( 'SENDFLEET_FROM_EMAIL', 'hello@yourdomain.com' ); define( 'SENDFLEET_FROM_NAME', 'Your Site' ); define( 'SENDFLEET_WEBHOOK_SECRET', 'the-signing-secret-from-the-dashboard' );
| Constant | What it sets |
|---|---|
SENDFLEET_API_KEY | The API key. Nothing is stored in the database. |
SENDFLEET_FROM_EMAIL | The default sender address. Must be on a verified domain. |
SENDFLEET_FROM_NAME | The default sender name. |
SENDFLEET_WEBHOOK_SECRET | The signing secret for delivery webhooks. |
SENDFLEET_ENCRYPTION_KEY | A custom key for encrypting stored secrets, instead of one derived from the salts. |
Sending modes and recipients
The plugin reads your plan and your verified domains from GET /v1/me and follows the same rules as the API, so an email the API would refuse is handled before it is sent.
| Domain | Recipients per email | Delivery status in WordPress |
|---|---|---|
| BYOC | To, Cc and Bcc together, up to 50 per message. Longer lists are split into several messages. | No. BYOC events stay in your own AWS account. |
| Shared SES, Managed plans | Exactly one address in To, the rest as Cc, up to 5 in total. | Yes, through a webhook (below). |
| Shared SES, Free plan smoke test | Only your own SendFleet account address. Other recipients are skipped and listed in the log. | No. |
Each recipient counts as one send against your monthly allowance, exactly as on the API. See Plans and Limits.
Delivery status and suppressions
On Managed plans the plugin can show delivered, bounced and complained statuses in its log, and keeps a local suppression list so the site stops spending sends on addresses that will never accept mail. Copy the endpoint URL from SendFleet, Settings, Webhooks in WordPress into the SendFleet dashboard, select the events you want, and paste the signing secret back into the plugin.
https://your-site.example/wp-json/sendfleet/v1/webhook
Every event is checked against its HMAC signature before it is accepted. The payloads are the ones documented on Webhooks.
When SendFleet refuses or cannot be reached
| Response | What the plugin does |
|---|---|
| 429 rate limit | Waits for the window to pass, then retries from the queue. The limit is 60 requests a minute per key. |
502 queue_error | Retries once inline, then from a WP-Cron queue with backoff. Nothing was sent. |
| Timeout | Never retried automatically, because the email may already have been accepted. |
| Rejected key, used-up plan, suspended account | Stops calling the API until the problem is fixed, instead of retrying into the same refusal. |
With the optional fallback turned on, an email SendFleet cannot take is sent the default WordPress way instead. The full list of responses is on Error Codes.
WP-CLI
wp sendfleet status [--refresh] # connection, account and queue status wp sendfleet connect <key> # check and save an API key wp sendfleet test [<to>] # test email, to your account address by default wp sendfleet queue [list|run] # list or process the retry and background queue wp sendfleet refresh # fetch fresh account data from GET /v1/me wp sendfleet purge-log [--older-than=N] # delete finished email log entries
Frequently asked questions
Installing, sending and what the plugin keeps.