0+
June 5, 2026
April 30, 2026
SendForce Mail SMTP is a free, open-source WordPress SMTP plugin that fixes the “WordPress emails not being delivered” problem in minutes. Send WooCommerce order emails, Contact Form 7 / WPForms / Gravity Forms submissions, password resets, registration confirmations, and any other wp_mail() traffic through Amazon SES, SendGrid, Mailgun, Brevo (Sendinblue), Postmark, Zoho ZeptoMail, Gmail API, Microsoft 365, or any standard SMTP server — with full email logging, queue, retry, and failure alerts.
HTTP API sending (recommended — faster and more reliable than SMTP):
SMTP sending (works with any provider, including custom servers):
wp sendforce test, wp sendforce queue process, wp sendforce log list, wp sendforce sysinfo.sendforce_before_send, sendforce_after_send, sendforce_log_entry, sendforce_api_request, sendforce_api_response for extending the plugin without forking.WP_DEBUG_LOG integration — optional mirroring of SMTP and API debug output to debug.log.SendForce Mail SMTP hooks into WordPress’s core wp_mail() function, so it works with every plugin that sends email — including WooCommerce, Easy Digital Downloads, Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Fluent Forms, Forminator, MemberPress, LearnDash, BuddyPress, bbPress, MailPoet (transactional), and any custom plugin or theme that uses wp_mail().
SendForce Mail Relay is an email-delivery plugin. It does NOT connect to any external service automatically. A connection is made ONLY after you explicitly configure a provider and either (a) WordPress sends an outgoing email, or (b) you click “Send Test Email”, or (c) you enable a notification channel and an email-failure alert is dispatched.
For each configured email provider, the data sent on every send is the same set of fields WordPress would otherwise hand to the local mail() function: the recipient address(es), CC, BCC, Reply-To, From name/address, subject, message body, headers, and attachments. No additional telemetry or analytics is transmitted by this plugin.
For each configured notification channel (Telegram, Slack, Discord, Microsoft Teams, Google Chat, Pushover, custom Webhook), the data sent is a short status message you compose in the plugin (default: failed-delivery summary or daily summary).
SendGrid (by Twilio)
* Service: https://sendgrid.com
* When data is sent: every WordPress email when SendGrid is the active connection, plus on test-email click.
* Endpoint: https://api.sendgrid.com/v3/mail/send
* Privacy Policy: https://www.twilio.com/en-us/legal/privacy
* Terms of Service: https://www.twilio.com/en-us/legal/tos
Mailgun (by Sinch)
* Service: https://www.mailgun.com
* When data is sent: same as above, but to Mailgun.
* Endpoint: https://api.mailgun.net/v3/{domain}/messages (US) or https://api.eu.mailgun.net/v3/{domain}/messages (EU).
* Privacy Policy: https://www.mailgun.com/legal/privacy-policy/
* Terms of Service: https://www.mailgun.com/legal/terms/
Amazon SES (AWS Simple Email Service)
* Service: https://aws.amazon.com/ses/
* When data is sent: same.
* Endpoint: https://email.{region}.amazonaws.com/v2/email/outbound-emails (region you select).
* Privacy Policy: https://aws.amazon.com/privacy/
* Terms of Service: https://aws.amazon.com/service-terms/
Brevo (formerly Sendinblue)
* Service: https://www.brevo.com
* Endpoint: https://api.brevo.com/v3/smtp/email
* Privacy Policy: https://www.brevo.com/legal/privacypolicy/
* Terms of Service: https://www.brevo.com/legal/termsofuse/
SparkPost
* Service: https://www.sparkpost.com
* Endpoint: https://api.sparkpost.com/api/v1/transmissions
* Privacy Policy: https://www.sparkpost.com/policies/privacy/
* Terms of Service: https://www.sparkpost.com/policies/tou/
Postmark
* Service: https://postmarkapp.com
* Endpoint: https://api.postmarkapp.com/email
* Privacy Policy: https://postmarkapp.com/privacy-policy
* Terms of Service: https://postmarkapp.com/terms-of-service
Elastic Email
* Service: https://elasticemail.com
* Endpoint: https://api.elasticemail.com/v4/emails
* Privacy Policy: https://elasticemail.com/legal/privacy-policy
* Terms of Service: https://elasticemail.com/legal/terms-of-use
SMTP2GO
* Service: https://www.smtp2go.com
* Endpoint: https://api.smtp2go.com/v3/email/send
* Privacy Policy: https://www.smtp2go.com/privacy/
* Terms of Service: https://www.smtp2go.com/terms/
Netcore Email API (formerly Pepipost)
* Service: https://netcorecloud.com
* Endpoint: https://emailapi.netcorecloud.net/v5/mail/send
* Privacy Policy: https://netcorecloud.com/privacy-policy
* Terms of Service: https://netcorecloud.com (request the latest terms via the contact form on the homepage; Netcore does not publish a stable terms-of-use URL).
SMTP.com
* Service: https://www.smtp.com
* Endpoint: https://api.smtp.com/v4/messages
* Privacy Policy: https://www.smtp.com/policies/privacy-policy/
* Terms of Service: https://www.smtp.com/legal/terms/
SocketLabs
* Service: https://www.socketlabs.com
* Endpoint: https://inject.socketlabs.com/api/v1/email
* Privacy Policy: https://www.socketlabs.com/legal/privacy-policy/
* Terms of Service: https://www.socketlabs.com/legal/
Moosend (by Sitecore)
* Service: https://moosend.com
* Endpoint: https://api.moosend.com/v3/
* Privacy Policy: https://moosend.com/privacy-policy/
* Terms of Service: https://moosend.com/terms/
SendLayer
* Service: https://sendlayer.com
* Endpoint: https://console.sendlayer.com/api/v1/email
* Privacy Policy: https://www.sendlayer.com/privacy-policy/
* Terms of Service: https://www.sendlayer.com/terms-of-service/
Mailjet (by Sinch)
* Service: https://www.mailjet.com
* Endpoint: https://api.mailjet.com/v3.1/send
* Privacy Policy: https://www.sinch.com/legal/privacy-notice/
* Terms of Service: https://www.sinch.com/legal/terms-of-service/
MailerSend
* Service: https://www.mailersend.com
* Endpoint: https://api.mailersend.com/v1/email
* Privacy Policy: https://www.mailersend.com/legal/privacy-policy
* Terms of Service: https://www.mailersend.com/legal/terms-of-use
Mandrill (by Mailchimp)
* Service: https://mailchimp.com/developer/transactional/
* Endpoint: https://mandrillapp.com/api/1.0/messages/send.json
* Privacy Policy: https://mailchimp.com/legal/privacy/
* Terms of Service: https://mailchimp.com/legal/terms/
Resend
* Service: https://resend.com
* Endpoint: https://api.resend.com/emails
* Privacy Policy: https://resend.com/legal/privacy-policy
* Terms of Service: https://resend.com/legal/terms-of-service
Zoho ZeptoMail
* Service: https://www.zoho.com/zeptomail/
* Endpoint: https://api.zeptomail.com/v1.1/email
* Privacy Policy: https://www.zoho.com/privacy.html
* Terms of Service: https://www.zoho.com/zeptomail/terms.html
Microsoft 365 / Outlook (Microsoft Graph API and SMTP)
* Service: https://www.microsoft.com/microsoft-365
* Endpoint (API): https://graph.microsoft.com/v1.0/users/{user}/sendMail (OAuth token from https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token)
* Endpoint (SMTP): smtp.office365.com:587
* Privacy Policy: https://privacy.microsoft.com/en-US/privacystatement
* Terms of Service: https://www.microsoft.com/en-us/servicesagreement/
Gmail / Google Workspace (Gmail API and SMTP)
* Service: https://workspace.google.com
* Endpoint (API): https://gmail.googleapis.com/gmail/v1/users/me/messages/send (OAuth token from https://oauth2.googleapis.com/token)
* Endpoint (SMTP): smtp.gmail.com:587
* Privacy Policy: https://policies.google.com/privacy
* Terms of Service: https://policies.google.com/terms
These services are contacted ONLY when a notification channel is enabled AND a delivery failure (or daily-summary) event triggers an alert. The data sent is the short status text shown in the plugin’s alert preview.
Telegram (Bot API)
* Service: https://telegram.org
* When data is sent: when a Telegram channel is enabled, a failed-delivery alert or daily-summary alert is generated.
* Endpoint: https://api.telegram.org/bot{token}/sendMessage
* Privacy Policy: https://telegram.org/privacy
* Terms of Service: https://telegram.org/tos
Pushover
* Service: https://pushover.net
* Endpoint: https://api.pushover.net/1/messages.json
* Privacy Policy: https://pushover.net/privacy
* Terms of Service: https://pushover.net/terms
Slack (Incoming Webhooks)
* Service: https://slack.com
* Endpoint: the webhook URL you paste (https://hooks.slack.com/services/…).
* Privacy Policy: https://slack.com/trust/privacy/privacy-policy
* Terms of Service: https://slack.com/legal
Discord (Webhooks)
* Service: https://discord.com
* Endpoint: the webhook URL you paste (https://discord.com/api/webhooks/…).
* Privacy Policy: https://discord.com/privacy
* Terms of Service: https://discord.com/terms
Microsoft Teams (Incoming Webhooks)
* Service: https://www.microsoft.com/microsoft-teams/
* Endpoint: the Teams webhook URL you paste.
* Privacy Policy: https://privacy.microsoft.com/en-US/privacystatement
* Terms of Service: https://www.microsoft.com/en-us/servicesagreement/
Google Chat (Incoming Webhooks)
* Service: https://chat.google.com
* Endpoint: the Google Chat webhook URL you paste.
* Privacy Policy: https://policies.google.com/privacy
* Terms of Service: https://workspace.google.com/terms/premier_terms.html
Custom Webhook
* When data is sent: when a custom Webhook channel is enabled and an alert is generated, a JSON payload is POSTed to the URL you paste.
* Endpoint: the URL you paste.
* Privacy Policy / Terms: governed by the operator of the URL you provide.
Chart.js (https://www.chartjs.org) — bundled locally at assets/js/chart.umd.min.js (v4.5.0). Used to render the email-stats chart on the dashboard. Loaded entirely from your own server; no CDN call is made.
SendForce Mail Relay stores the following data in your WordPress database:
Email body logging can be disabled in Settings > Queue & Logging. Log entries are automatically deleted after the configured retention period (default: 30 days). All data is deleted when the plugin is uninstalled.
We recommend adding a note to your site’s privacy policy if you log email content, informing users that outgoing email metadata may be stored.
sendforce-mail-relay folder to the /wp-content/plugins/ directory, or install directly through the WordPress plugin installer.Yes. You need access to an SMTP server or a transactional email provider account. Most providers (Gmail, Outlook, etc.) offer SMTP access. Transactional services like SendGrid, Mailgun, or Amazon SES offer both SMTP and HTTP API access.
Yes. All credentials are encrypted using AES-256-CBC encryption with a key derived from your WordPress security salts before being stored in the database.
When enabled, emails are stored in a database queue instead of being sent immediately. A WP-Cron job processes the queue every 5 minutes, sending emails in batches. Failed emails are retried with exponential backoff (5 min 15 min 45 min).
Yes. SendForce Mail Relay hooks into WordPress’s phpmailer_init action (SMTP mode) or pre_wp_mail filter (API mode). Since every plugin — including WooCommerce, contact form plugins, and membership plugins — sends email via WordPress’s wp_mail() function, SendForce Mail Relay will handle 100% of outgoing emails.
You should only use one SMTP plugin at a time. Please deactivate any other SMTP or email plugins (FluentSMTP, WP Mail SMTP, etc.) before activating SendForce Mail Relay.
By default, SendForce Mail Relay logs: recipient email, subject, headers, status (sent/failed), error message if any, and timestamp. Email body logging is optional and can be disabled in Settings > Queue & Logging for privacy compliance.
All plugin data (database tables, settings, and scheduled events) is completely removed when you delete the plugin through the WordPress admin.
No. SendForce Mail Relay does not collect any data, make any analytics calls, or communicate with any external server except when sending emails through your configured provider.
For the complete release history with full detail on every change, see CHANGELOG.md (also bundled with the plugin) or open the What’s New tab inside SendForce in your WordPress admin. The section below is condensed to fit within WordPress.org’s 5,000-word changelog limit.
sendforce_allow_private_webhook_hosts filter lets self-hosted setups opt back in for legitimate internal collectors.email, email log, gmail, outlook, smtp) to better match how users actually search. gmail and outlook in particular are high-intent searches that match our existing Gmail and Microsoft 365 OAuth flows but weren’t previously tagged.aria-label so screen readers announce them correctly (was relying on title alone, which most assistive tech ignores)._n(), so non-English locales can translate the singular and plural cases separately instead of inheriting the awkward English “(s)” suffix.& in a translation string is a portability gotcha for some PO editors).viewBox (camelCase) to the SVG wp_kses whitelist alongside the existing lowercase viewbox, so channel-logo SVGs render correctly regardless of which casing the source file uses.$current_user to $sendforce_current_user in the Email Test template for prefix consistency with the rest of the file (avoids accidentally shadowing WP’s globally-scoped $current_user in deeply included contexts).provider column to wp_sendforce_logs (varchar(50), indexed). Populated automatically going forward from the captured debug payload (when available) or the active connection’s configured provider. Existing rows are not back-filled; only new log entries get the column populated. dbDelta handles the schema migration on plugin upgrade.<code> tags but didn’t escape the inner content first — so when a bullet contained literal <tag> text inside backticks (very common in technical changelogs), the browser interpreted the embedded text as a real HTML tag and produced floating empty <code> elements that rendered as gray pills against the page background. Fix: esc_html() the raw line before applying the markdown transformations. The two regex rules (**bold** <strong> and backtick <code>) now run on already-escaped text, guaranteeing balanced tags and no HTML injection from bullet content. Affects 1.0.28 only.cron_schedules filter. The filter fires whenever WP looks up scheduled events (which can happen before init, during plugins_loaded or even setup_theme), so calling __( …, 'sendforce-mail-relay' ) there ran the translation function before the textdomain was loaded. Both filter callbacks (in the activator and the mailer) now use a literal English string for the cron schedule’s display label — that label is only shown in dev tools like WP Crontrol or wp-cli cron list, never user-facing, so leaving it untranslated is harmless. Resolves the deprecation notice on sites running WP_DEBUG with WP 6.7 or newer.http:// an inline red warning appears explaining that the alert message (site name, failed recipient, error details) would be sent unencrypted. Catches typos and homemade webhook receivers before save.sendforce_alerts_throttle_seconds to change the window length, set it to 0 to disable throttling entirely.manage_options capability in addition to the existing nonce check. The forms that issued these requests already live on admin-only pages, so a non-admin couldn’t normally obtain a valid nonce — but explicit capability checks match WordPress.org Plugin Check expectations and protect against any future flow that might mint a nonce in a less-restricted context./var/www/example.com/wp-content/uploads/woocommerce_uploads/2026/invoice-12345.pdf were stored verbatim — leaking the server directory layout, shared-hosting username paths, and customer order IDs from WooCommerce invoice filenames. From 1.0.27 the same row stores only invoice-12345.pdf. Existing rows are not rewritten; only new log entries get basename-only.Sending — attachments and multipart_text across all 18 API providers.
wp_mail()‘s 5th argument) are now base64-encoded into each provider’s native JSON schema and delivered through the API.text/plain alternative is included via each provider’s native multipart fields. Improves deliverability — Gmail and other inbox providers favour multipart-alternative messages, and plain-text-only clients get a readable fallback. Previously this setting was silently ignored in API mode for the 16 providers covered here.Content field with no IsContentHtml companion for both parts, so it can’t represent multipart_text — its attachments work, just not the dual-body part.multipart/form-data (not JSON like the other 17), so a new build_multipart_form_data() helper in the base class assembles the request body correctly while still capturing the response into the debug log.prepare_attachments() (base64 + MIME-type detection + safe file reads) and get_plain_text_alt() (HTMLplain conversion when multipart_text is on) — give each provider ~5 lines of mapping code instead of duplicating the same boilerplate 18 times.Email Queue — actual error messages + on-demand processing.
error column. Previously every failure showed a generic “Failed to send email.” message, regardless of whether the cause was an expired OAuth token, an unverified sender domain, a wrong API key, or a network glitch. The queue processor now hooks wp_mail_failed during each send attempt and stores the real WP_Error message (e.g. AADSTS70008: refresh token expired, MessageRejected: Email address is not verified, Domain not found). Users on the Queue tab can finally see WHY a send failed without digging into the Email Log.SendForce_Queue::$bypass_once flag tells the queue interceptor to skip the next wp_mail call, so test sends always go out synchronously regardless of queue mode.Admin — release history and roadmap in one place.
<details>/<summary> so it’s keyboard-accessible and works without JavaScript.?tab=upcoming and ?tab=changelog URLs both still resolve as back-compat aliases so any bookmarks or in-plugin links keep working.build_raw_mime() helper. Full release detail in CHANGELOG.md.AADSTS50011 redirect URI mismatch. Root cause was add_query_arg() not URL-encoding values, leaving & characters bare inside redirect_uri. Switched to http_build_query() with PHP_QUERY_RFC3986.make_request()).Bearer TOKEN / Zoho-enczapikey TOKEN prefixes — auto-stripped before constructing the auth header. All API keys are also auto-trimmed.admin_url filters (Wordfence, LiteSpeed Cache).wp_kses SVG whitelist used for channel logos on the Alerts tab.from_email / from_domain conditions, “via rule” badge in Email Log, starter presets, “What’s Next” roadmap tab, styled confirm dialogs.oauth_email field on newly created connections so the schema is consistent from save time.IsContentHtml flag in both HTML and plain-text paths).next_retry_at) on the next cron run.wp_strip_all_tags on provider errors returned to the browser.wp_mail() returns true on fallback success; clearer recovery message. Suppressed spurious SMTP-warning when active path was API or PHP-Mail.<select> dropdowns with branded styled component (full keyboard support — Arrow/Enter/Escape). Default/Fallback selectors auto-refresh after connection save. Form-control polish (chevron, focus ring, hover, disabled states)..DS_Store file from assets/images/providers/. Added phpcs:ignore annotations with rationale to interpolated table-name $wpdb queries. Restructured WP-CLI log-delete query for proper phpcs handling.<style>/<script> blocks from PHP output (proper enqueue). Surface actual provider HTTP status / response body in failure messages. Added “Raw API request / response” panel to Email Log detail modal. Masked-dots placeholder for saved password/API-key fields. Hardened secret redaction (covers client_secret, response bodies, malformed-JSON fallback). Defused CSV formula injection on log export. Gated on-load DB schema upgrade to admin/WP-CLI. Added confirmation prompts to destructive WP-CLI commands.wp sendforce test, queue, log, sysinfo). Added developer hooks (sendforce_before_send, sendforce_after_send, sendforce_log_entry, sendforce_api_request, sendforce_api_response). Added Developer Debug setting to mirror SMTP/API debug to debug.log. Added raw API request/response capture in new debug_data log column (with Authorization redaction). Email Log export as CSV/JSON. “Copy Debug Info” button on Email Test screen. Replaced stale “SMTP-Manager” User-Agent on Resend with “SendForce-Mail-Relay”.sendforce-mail-relay.php.| Version | Download | Type |
|---|---|---|
| 1.0.33 | Download | Stable |
| 1.0.32 | Download | Stable |
| 1.0.31 | Download | Stable |
| 1.0.30 | Download | Stable |
| 1.0.29 | Download | Stable |
| 1.0.28 | Download | Stable |
| 1.0.27 | Download | Stable |
| 1.0.26 | Download | Stable |
| 1.0.25 | Download | Stable |
| 1.0.24 | Download | Stable |
| 1.0.23 | Download | Stable |
| 1.0.22 | Download | Stable |
| 1.0.21 | Download | Stable |
| 1.0.20 | Download | Stable |
| 1.0.19 | Download | Stable |
| 1.0.18 | Download | Stable |
| 1.0.17 | Download | Stable |
| 1.0.16 | Download | Stable |
| 1.0.15 | Download | Stable |
| 1.0.14 | Download | Stable |
| 1.0.13 | Download | Stable |
| 1.0.12 | Download | Stable |
| 1.0.11 | Download | Stable |
| 1.0.10 | Download | Stable |
| 1.0.9 | Download | Stable |
| 1.0.8 | Download | Stable |
| 1.0.7 | Download | Stable |
| 1.0.6 | Download | Stable |
| 1.0.5 | Download | Stable |
| Development | Download | Trunk |