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_mail filter rather than replacing the pluggable function, and builds each message the way WordPress does, so wp_mail_from, wp_mail_content_type, phpmailer_init and 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

What the SendFleet WordPress plugin needs
RequirementDetail
WordPress6.2 or later, single site or multisite
PHP7.4 or later
A SendFleet accountCreate one for free: 50 emails a month, no card.
A verified sending domainOwnership and DKIM records published and verified. See DNS Records.
An API keyFrom the dashboard, API Keys. See Authentication.

How to send WordPress email through SendFleet

  1. 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.
  2. 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.
  3. Create an API key

    In the SendFleet dashboard, create a key under API Keys and copy it. The full key is shown exactly once.
  4. 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.
  5. 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
// 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' );
wp-config.php constants the plugin reads
ConstantWhat it sets
SENDFLEET_API_KEYThe API key. Nothing is stored in the database.
SENDFLEET_FROM_EMAILThe default sender address. Must be on a verified domain.
SENDFLEET_FROM_NAMEThe default sender name.
SENDFLEET_WEBHOOK_SECRETThe signing secret for delivery webhooks.
SENDFLEET_ENCRYPTION_KEYA 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.

How the plugin sends on each kind of domain
DomainRecipients per emailDelivery status in WordPress
BYOCTo, 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 plansExactly one address in To, the rest as Cc, up to 5 in total.Yes, through a webhook (below).
Shared SES, Free plan smoke testOnly 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.

The plugin's webhook endpoint
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

What the plugin does with each kind of failure
ResponseWhat the plugin does
429 rate limitWaits for the window to pass, then retries from the queue. The limit is 60 requests a minute per key.
502 queue_errorRetries once inline, then from a WP-Cron queue with backoff. Nothing was sent.
TimeoutNever retried automatically, because the email may already have been accepted.
Rejected key, used-up plan, suspended accountStops 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
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.

Is there an official SendFleet plugin for WordPress?
Yes. The SendFleet plugin is free on the WordPress.org plugin directory at wordpress.org/plugins/sendfleet. It routes every email WordPress sends through the SendFleet API, over your own Amazon SES account (BYOC) or SendFleet's managed SES, and the only setting it needs is an API key.
Which WordPress plugins does the SendFleet plugin work with?
Anything that sends email through wp_mail(), which is nearly everything: WordPress core, WooCommerce, Easy Digital Downloads, Contact Form 7, WPForms, Gravity Forms, Fluent Forms, Elementor forms, and membership and LMS plugins. The SendFleet plugin uses the pre_wp_mail filter rather than replacing wp_mail(), so wp_mail_from, wp_mail_content_type, phpmailer_init and every other mail filter keep working.
Do I need to deactivate my SMTP plugin to use SendFleet on WordPress?
Yes. Run one mailer at a time. If another plugin replaces wp_mail() entirely, the SendFleet plugin shows a warning, because email may then bypass it. There are no SMTP hosts, ports or passwords to configure for SendFleet: it sends over the HTTPS API.
Which sender address does the SendFleet WordPress plugin use?
If the sender an email already has is on one of your verified SendFleet domains, it is kept. Otherwise the plugin uses your default sender: the address set under SendFleet, Settings in WordPress, or wordpress@ your site's domain when that domain is verified, or wordpress@ your first verified domain. The original address is put in Reply-To, so replies still reach the right person. Domains match exactly, so mail.example.com and example.com are separate domains.
Does the SendFleet WordPress plugin work on the Free plan?
Yes. The Free plan includes 50 emails a month. On a BYOC domain they go to anyone. On a Shared SES domain the Free plan is a smoke test that only delivers to your own SendFleet account address, so the plugin sends emails addressed to you and skips every other recipient, with a note in its log. Add a BYOC domain or choose a Managed plan to email anyone.
Does the SendFleet WordPress plugin store my emails?
Its log stores the recipient, sender, subject and status of each email, never the body, and entries are deleted after 30 days by default. An email waiting in the retry or background queue is held in the WordPress database until it is sent, then its content is deleted. The log can be turned off entirely.