Vora SMTP

Description

WordPress sends mail with PHP’s mail() function by default. Most hosts send it from an address the receiving server cannot verify, so password resets, order receipts and contact form notifications quietly land in spam or vanish.

Vora SMTP replaces that with a real authenticated connection. You point it at a mail service you already control, and every message WordPress sends goes out over that connection instead.

Sending methods

  • Generic SMTP — any provider that gives you a host, port, username and password, with TLS, SSL or unencrypted connections.
  • Gmail and Google Workspace — connect over OAuth 2.0 by registering your own Google app. No password is stored, and no app password is needed.
  • PHP Mail — the server’s own mail() function, with nothing to configure. Deliverability is the weakest of the three, which is why it exists mainly as a safety net rather than a first choice.

Automatic fallback

A mail provider can stop accepting messages for reasons that have nothing to do with your site: an expired credential, a rate limit, an outage, a DNS failure. When that happens the message is normally lost, and nobody finds out until a customer says they never got their receipt.

  • If a send fails, the plugin immediately retries it through a second sending method of your choice.
  • PHP Mail is the default fallback, because it needs no credentials and no connection to a third party, so it is still available when the configured provider is not.
  • Fallback covers every sending method, including Generic SMTP.
  • The log records which method actually delivered each message, so a send rescued by the fallback is never credited to the provider that failed.
  • Turn it off, or point it at a different method, on the Providers screen.

Failure alerts

Optionally email a chosen address whenever a message cannot be delivered, including the recipient, the sending method used and the error the mail server returned. Alerts cannot loop: a failing alert never triggers another alert.

Email log, with preview and resend

Every message the plugin handles is recorded, so you can prove what was sent, see exactly what it looked like, and send it again without asking the customer to trigger it a second time.

  • Preview — open any logged message and read it as the recipient saw it. HTML email is rendered in a sandboxed frame, so a message can be inspected safely without its markup, styles or scripts touching your admin screen. Storing message bodies is optional and off by default, so you choose whether the log keeps content or only metadata.
  • Resend — send any logged message again with one click, to the original recipient, using your current sending method. Useful when a receipt failed while a provider was down, or when a password reset never arrived.
  • Searchable history filtered by status, provider, recipient or subject.
  • The real error text returned by the mail server when a message fails, not a generic failure notice.
  • A record of which sending method actually delivered each message, including when a fallback rescued it.
  • Automatic pruning of entries older than a configurable number of days, so the log cannot grow without limit.

Sender identity

Set the From name and address once and optionally force every message on the site to use them, which stops other plugins overriding your sender details. The plugin also repairs invalid defaults such as wordpress@localhost that cause outright send failures on local and staging installs.

Diagnostics

A dashboard summarises messages sent, failures and success rate. You can send a test message to any address and see exactly what the mail server said if it does not arrive.

Privacy

Credentials and OAuth tokens are stored in your own database and are never transmitted anywhere except to the mail provider you configure. The plugin collects no analytics and phones no home. See the External services section below for the full list of endpoints it contacts.

Source code and build process

The plugin’s admin screen is a React application. The file it loads at runtime, build/index.jsx.js, is generated and minified, so the complete, unminified, human-readable source it is built from ships inside this plugin — no external download is needed to read, study, modify or fork it.

  • Source: admin/src/ (index.jsx, App.jsx, api.js and components/), documented in admin/src/README.md
  • Build configuration: package.json
  • Generated output: build/index.jsx.js and build/index.jsx.asset.php

Nothing else in the plugin is compiled, minified or obfuscated. All PHP and all CSS (assets/admin.css) is the original source, formatted as written.

To rebuild the generated file from the included source:

  1. Install Node.js 18 or newer, which includes npm.
  2. From the plugin directory, install the build tooling: npm install
  3. Produce the production build: npm run build

That regenerates build/index.jsx.js and build/index.jsx.asset.php from admin/src/. Use npm run start instead for an unminified watch build while developing, and npm run lint to run ESLint over the sources.

The build uses @wordpress/scripts, WordPress’s own official, free and open source build toolchain (a wrapper around webpack and Babel). It is declared in package.json, is fetched by npm install, and there is no custom webpack configuration — the entry point and output path are the two arguments in the build script.

External services

This plugin connects to the following third party services. It contacts only the services required by the sending method you configure, and makes no outbound request to any third party at all when you use Generic SMTP or PHP Mail.

Google OAuth 2.0

Used when you connect a Gmail or Google Workspace account, to exchange an authorisation code for an access token and to refresh that token when it expires.

  • Endpoint: https://oauth2.googleapis.com/token
  • Data sent: your Google app’s client ID and client secret, the authorisation code returned by Google’s consent screen, and your refresh token.
  • When: only when you click Connect, and afterwards whenever a stored access token has expired.
  • Terms of service: https://policies.google.com/terms
  • Privacy policy: https://policies.google.com/privacy

Gmail API

Used to transmit outgoing email when Gmail is the active sending method.

  • Endpoint: https://gmail.googleapis.com/gmail/v1/users/me/messages/send
  • Data sent: the message itself, including recipients, subject, body, headers and attachments.
  • When: each time WordPress sends an email while Gmail is selected.
  • Terms of service: https://policies.google.com/terms
  • Privacy policy: https://policies.google.com/privacy

Microsoft identity platform

This plugin on its own offers no Microsoft 365 sending method, so out of the box it never contacts these endpoints. The OAuth code that does so ships here and is used when the Vora SMTP Pro add-on supplies the Microsoft 365 provider. It is declared for completeness, because the requests are made by this plugin’s code.

Used when you connect a Microsoft 365 account, to exchange an authorisation code for an access token and to refresh it.

  • Endpoints: https://login.microsoftonline.com/, https://graph.microsoft.com/
  • Data sent: your Microsoft app’s client ID, client secret and tenant ID, the authorisation code returned by Microsoft’s consent screen, and your refresh token.
  • When: only when you click Connect, and afterwards whenever a stored access token has expired.
  • Terms of service: https://www.microsoft.com/servicesagreement
  • Privacy policy: https://privacy.microsoft.com/privacystatement

Screenshots

Installation

  1. Upload the plugin to /wp-content/plugins/ and activate it through the Plugins screen.
  2. Go to Vora SMTP Providers and choose your sending method.
  3. Enter the credentials for your SMTP server, or connect a Gmail account over OAuth.
  4. Set your From name and address under Vora SMTP Settings.
  5. Send a test message from Vora SMTP Dashboard to confirm delivery works.

FAQ

Where is the source code for the minified JavaScript?

Inside the plugin, in admin/src/. The admin screen is a React application, and build/index.jsx.js is generated from those files by @wordpress/scripts. Run npm install and then npm run build from the plugin directory to regenerate it. See “Source code and build process” in the Description for the full detail. Nothing else in the plugin is compiled or minified.

Do I still need an email account somewhere?

Yes. This plugin connects WordPress to a mail service you already have. It is not itself a mail service and does not send anything on your behalf.

Where are my credentials stored?

In your own site’s database, in a single WordPress option. They are transmitted only to the provider you configure.

Do I need to create a Google app to use Gmail?

Yes, for the standard setup. You register an OAuth application in Google Cloud Console and paste the client ID and secret into the plugin. This keeps the connection entirely between your site and Google.

Why does my email still go to spam?

Authenticated sending fixes the connection, but receiving servers also check your domain’s DNS. Add SPF and DKIM records for whichever service you send through. Your provider documents the exact values.

My messages fail. How do I find out why?

Send a test message from the Dashboard. The plugin shows the actual error returned by the mail server rather than a generic failure, and the same detail is recorded against each failed entry in the email log.

Does the plugin log the contents of my email?

Only if you enable it. By default the log records metadata such as recipient, subject, provider and status. Storing the full message body is a separate setting, off by default, because it noticeably increases database size.

What happens if I deactivate the plugin?

WordPress reverts to its default mail() behaviour. Your settings and logs are preserved. They are removed only if you delete the plugin, which drops its tables and options.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Vora SMTP” is open source software. The following people have contributed to this plugin.

Contributors

Translate “Vora SMTP” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

1.7.0

  • Added a Disconnect button to the Gmail screen. It revokes the authorisation with Google and deletes every stored token from your site, so you can withdraw access without leaving WordPress.
  • Fixed: Test Connection reported “Google Client ID is not configured” for a Gmail account connected without a local app registration, even though sending worked correctly.
  • The unminified source of the admin screen’s JavaScript, and instructions for rebuilding it, are documented in the readme and shipped in admin/src/.
  • Microsoft 365 sending, and one-click setup for both Gmail and Microsoft 365, have moved to the Vora SMTP Pro add-on, which supplies the hosted relay holding the shared OAuth app. Gmail is unchanged in this plugin and still connects with your own Google Cloud app.
  • The plugin no longer contacts an OAuth relay under any configuration, so that entry has been removed from External services.
  • Added vora_smtp_oneclick_available, vora_smtp_oneclick_start_url and vora_smtp_oauth_refresh so an add-on can supply a connection method the plugin has no credentials for.

1.6.0

  • WPVora is now credited as a contributor alongside the individual maintainers. No functional change.

1.5.0

  • The admin interface is now fully translatable. Every string in the React admin — tabs, provider forms, the email log, the test-email tool and its confirmations — was previously hardcoded English and could not be translated at all.
  • Provider connection results and sending errors are translatable, including the messages returned by each sending method’s connection test.
  • The test email itself is translatable, subject and body.
  • Added languages/vora-smtp.pot with 191 strings for translators, with translators: comments on every string that interpolates a value.
  • Email log delivery states now display translated (“Sent”, “Failed”, “Queued”) while still filtering on the stored English key.
  • Plugin URI updated to the new product page.

1.2.0

  • Renamed to Vora SMTP. The plugin’s display name, menu entry and text domain have changed; its behaviour and settings have not.
  • Internal identifiers now use the vora_smtp prefix throughout, including the settings option, the two database tables, the REST namespace and the OAuth relay constant and filter. Sites upgrading from an earlier build have their settings, email log and queue carried over automatically on activation.
  • Sites that define the OAuth relay constant must rename it from EASYSMCO_OAUTH_RELAY_URL to VORA_SMTP_OAUTH_RELAY_URL, and the matching filter from easysmco_oauth_relay_url to vora_smtp_oauth_relay_url.

1.1.0

  • New “PHP Mail” sending method, using the server’s own mail() function. It needs no credentials, so it works as a last resort when a configured provider is unavailable.
  • PHP Mail is now the fallback provider on new installs, and fallback is enabled by default. Existing sites keep their saved settings.
  • Fallback now also covers SMTP-based providers. Previously a failed Generic SMTP send was never retried.
  • Attachments are no longer dropped when a message is delivered through the Generic SMTP driver.
  • A network failure while connecting a Google or Microsoft account now returns to the Providers screen with an explanation instead of a blank error page, and retries once when the request never left the server.

1.0.0

  • Initial release.