=== Dualsend SMTP Failover ===
Contributors: cshubh832
Tags: smtp, email, mail, wp-mail, deliverability
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.1.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Send WordPress email through an SMTP server or provider API, with an automatic fallback server, connection tests and a debug log.

== Description ==

WordPress sends email with PHP's `mail()` function by default, which many hosts block or send to spam. Dualsend SMTP Failover routes your email through a mail server you choose, over SMTP or a provider API, and switches to a second server when the first one fails.

= How delivery works =

1. The **Primary SMTP Server** (API first when set to API mode, then SMTP).
2. The **Fallback SMTP Server**, while its switch is on, in the same way, with no waiting in the page.
3. Background retries, when both servers fail: the email waits in a queue and is tried again every **Retry Interval** minutes, up to **Maximum Retries** times.
4. WordPress itself, as a last resort after the last retry, or at once when Maximum Retries is 0.

Each server gets one attempt per pass and the next route is tried straight away, so a failing server never holds up a page.

= Features =

* Primary and fallback mail servers, each over SMTP or a provider API
* Automatic failover, with no waiting in the page
* Background retries with an adjustable interval and number of retries
* Connection and credential tests on the settings screen
* A test message that follows the same route as your real email
* Optional debug log, with passwords and API keys masked and no message bodies
* Works with Contact Form 7, WooCommerce and any plugin that sends through `wp_mail()`

API providers: Brevo, Elastic Email, MailerSend, Mailgun, Mailjet, Mandrill, Postmark, Resend, SendGrid, SendLayer, SMTP.com, SMTP2GO, SparkPost. Any other provider, such as Amazon SES, Gmail, Microsoft 365 or Zoho Mail, works over SMTP.

== External services ==

This plugin does not contact any service on its own. It has no telemetry, no license check and no connection to the plugin author. It connects only to the email provider you configure, when it sends your mail or when you press a test button. It sends that provider the message itself: recipients, subject, body and your sender address. With plain SMTP it connects only to the host you entered.

* Brevo: api.brevo.com. [terms](https://www.brevo.com/legal/termsofuse/), [privacy](https://www.brevo.com/legal/privacypolicy/)
* Elastic Email: api.elasticemail.com. [terms](https://elasticemail.com/resources/usage-policies/terms-of-use/), [privacy](https://elasticemail.com/resources/usage-policies/privacy-policy/)
* MailerSend: api.mailersend.com. [terms](https://www.mailersend.com/legal/terms-of-use), [privacy](https://www.mailersend.com/legal/privacy-policy)
* Mailgun: api.mailgun.net or api.eu.mailgun.net. [terms](https://www.mailgun.com/legal/terms/), [privacy](https://www.mailgun.com/legal/privacy-policy/)
* Mailjet: api.mailjet.com. [terms](https://www.mailjet.com/legal/terms/), [privacy](https://www.mailjet.com/legal/privacy-policy/)
* Mandrill: mandrillapp.com. [terms](https://mailchimp.com/legal/terms/), [privacy](https://mailchimp.com/legal/privacy/)
* Postmark: api.postmarkapp.com. [terms](https://postmarkapp.com/terms-of-service), [privacy](https://postmarkapp.com/privacy-policy)
* Resend: api.resend.com. [terms](https://resend.com/legal/terms-of-service), [privacy](https://resend.com/legal/privacy-policy)
* SendGrid: api.sendgrid.com. [terms](https://www.twilio.com/en-us/legal/tos), [privacy](https://www.twilio.com/en-us/legal/privacy)
* SendLayer: console.sendlayer.com. [terms](https://sendlayer.com/terms-of-service/), [privacy](https://sendlayer.com/privacy-policy/)
* SMTP.com: api.smtp.com. [terms](https://www.smtp.com/policies/terms-and-conditions/), [privacy](https://www.smtp.com/policies/privacy-policy/)
* SMTP2GO: api.smtp2go.com. [terms](https://www.smtp2go.com/terms/), [privacy](https://www.smtp2go.com/privacy/)
* SparkPost: api.sparkpost.com or api.eu.sparkpost.com. [terms](https://www.sparkpost.com/policies/tou/), [privacy](https://www.sparkpost.com/policies/privacy/)

**Feedback tab.** Nothing is sent until an administrator fills in the form, ticks the consent box and presses Send feedback. The message then goes through your own mail server to the Dualsend team at cshubham832@gmail.com and iamshubhamchaurasia@gmail.com. It contains the rating, the message, the optional name and email, your site address and the plugin version. At most 3 messages an hour can be sent.

== Installation ==

1. Install the plugin from the plugin directory, or upload it under **Plugins > Add New > Upload Plugin**, and activate it.
2. Go to **Settings > Dualsend SMTP Failover**.
3. Set the From address. It must be on a domain your provider is allowed to send for.
4. Under **Primary SMTP Server**, enter your SMTP details, or choose **API**, pick your provider and paste its API key. Press **Test Connection** or **Test API Connection**.
5. Optionally, set up the **Fallback SMTP Server** the same way.
6. On the **Test** tab, send yourself a test message.

== Frequently Asked Questions ==

= How do background retries work? =

When both servers fail, the email is queued and the page carries on at once. WP-Cron tries it again every Retry Interval minutes (1 to 60, default 5), primary then fallback, up to Maximum Retries times (0 to 10, default 3), then hands it to WordPress mail. At most 100 emails wait at once; when the queue is full, or attachments exceed 10 MB, the email goes to WordPress mail at once. If your site sets `DISABLE_WP_CRON`, run `wp-cron.php` from a real server cron job.

= What does the retry queue store, and for how long? =

While an email waits, it is stored in your WordPress database, body included, which can hold private content such as a password reset link. Attachments are copied to a private uploads folder under random names, with an index.php and an Apache deny rule; on nginx you can add a deny rule for the `dualsend-smtp-failover-queue` folder. Everything is deleted once the email is delivered or handed to WordPress mail, and when the plugin is deleted. Nothing is ever sent to the plugin author. Set Maximum Retries to 0 to store nothing.

= My host blocks SMTP ports. What do I do? =

Use a provider with an API and set the connection type to **API**. API delivery runs over HTTPS, which is not blocked.

= Where are my passwords stored? =

In the WordPress options table, readable only by users who can manage settings. They are never sent back to the browser and are masked in the debug log. Keep API keys scoped to sending only.

= Why did my message land in spam? =

Usually the From address does not match a domain your provider may send for. Set up SPF, DKIM and DMARC with your provider and use a From address on that domain.

= Can I keep another SMTP plugin active? =

Only one plugin sends your email. While Dualsend SMTP Failover has a delivery route, it handles `wp_mail()` first, so the other plugin's mail settings are not used. The settings page shows a notice you can dismiss while another SMTP plugin is active.

= Will it change the sender set by other plugins? =

No. A plugin that sets its own From address keeps it, unless you switch on **Override other plugins**. Until a delivery route is set up, no sender is changed.

== Screenshots ==

1. The Settings tab: the sender identity, the primary SMTP server and the fallback SMTP server, each with a passed connection test.
2. The primary server set to API delivery, with a provider chosen and its API key verified.
3. The Delivery and Diagnostics card, with background retries, the debug log switch and the Save Settings bar.
4. The Test tab, after sending a test message.
5. The Logs tab, showing a message that the fallback server delivered after the primary server failed.
6. The Feedback tab, which sends a rating and a message only when you submit it.

== Changelog ==

= 1.1.1 =
* Changed: the admin stylesheet and script now live in the assets folder. No change to how the plugin looks or works.

= 1.1.0 =
* Changed: the primary server, the fallback server and the delivery options are now on one Settings tab, saved by one button. The fallback server has its own switch and keeps the settings saved by 1.0.0.
* New: immediate failover. Each server gets one attempt, then the next route is tried at once.
* Added background retries. They use Retry Interval and Maximum Retries. Values saved by 1.0.0 are kept. Privacy: a queued email, body included, is kept on your site only until it is delivered or given up.
* New: Test Connection logs in and checks the sender without sending a message, and shows the server's real error.
* New: Cc, Bcc, Reply-To, attachments and plain-text parts are sent over every provider API.
* New: a Feedback tab, and a notice while another SMTP plugin is active.
* New for developers: the dualsend_smtp_failover_mail_queued action, the dualsend_smtp_failover_should_queue, dualsend_smtp_failover_servers and dualsend_smtp_failover_admin_tabs filters. dualsend_smtp_failover_mail_failed now fires after the last retry.
* Fixed: the debug log no longer records any part of a message body.
* Fixed: embedded images (WordPress 6.9 and later) are sent instead of dropped.
* Fixed: activating the plugin before a server is set up no longer changes the sender of WordPress mail.
* Changed: requires WordPress 6.0 or later.

= 1.0.0 =
* First release.

== Upgrade Notice ==

= 1.1.1 =
Housekeeping release. The admin stylesheet and script moved to the assets folder. No change to settings or behavior.

= 1.1.0 =
Failover is now immediate, and email is retried in the background when both servers fail. Your saved settings are kept.

= 1.0.0 =
First release.
