Notix
Integrations

Every WordPress email through Notix, with no plugin of ours to install.

There is no Notix WordPress plugin, because WordPress does not need one. Password resets, new-user mail, WooCommerce order emails and form submissions all leave through wp_mail(), and wp_mail() speaks SMTP. Put the Notix relay credentials into any SMTP plugin you already trust, or into a ten-line must-use plugin, and every one of those messages goes out under your verified domain, tracked, suppressed and reported like an API send.

What you need

Three things, one of them optional.

A verified domain.

Add the domain your site sends from, publish the SPF, DKIM and DMARC records Notix gives you, and an address on it becomes a valid From. The relay refuses an unverified From rather than sending it; that one fact explains most “it stopped working” tickets on this page.

An API key.

Created under API keys in the dashboard, shown once. It is the SMTP password. Make one for the site alone, so revoking it when the site is retired or the key leaks costs nothing else.

An SMTP plugin, or not.

WP Mail SMTP and FluentSMTP both have an “Other SMTP” option that takes the four relay values. If you would rather not add a plugin, the must-use plugin below does the same job on the phpmailer_init hook.

The free plan covers 5,000 emails a month and 200 a day, which is more than most sites send, and it does not ask for a card.

With a plugin

Four fields in WP Mail SMTP or FluentSMTP.

Both plugins expose the same fields under their “Other SMTP” mailer. Host smtp.usenotix.dev, port 465 with SSL or 587 with TLS, username notix, an API key as the password. Then send the plugin’s test email and look for it in the Notix dashboard.

  1. Choose the Other SMTP mailer.

    In WP Mail SMTP, that is Settings, General, Mailer. In FluentSMTP, add a connection and pick Other SMTP. Neither plugin lists Notix by name, and the generic option is all the relay needs.

  2. Fill in the relay values.

    Encryption SSL goes with port 465 (TLS from the first byte); encryption TLS goes with port 587 (STARTTLS). Leave Auto TLS on and authentication on. The username is the fixed string notix; the password is the API key.

    WP Mail SMTP, Other SMTP mailer
    WP Mail SMTP, Settings, General, Mailer: Other SMTP
    
    SMTP Host:       smtp.usenotix.dev
    Encryption:      SSL           (or TLS, with the port below set to 587)
    SMTP Port:       465           (587 with TLS)
    Auto TLS:        on
    Authentication:  on
    SMTP Username:   notix
    SMTP Password:   an API key from the Notix dashboard, API keys
    
    From Email:      receipts@acme.com   (a domain you verified in Notix)
    Force From Email: on
    
  3. Set and force the From address.

    Put an address on your verified domain in the From Email field and turn on the force option. Without it, WooCommerce, Contact Form 7 and WordPress itself each supply their own From, and any one of them on an unverified domain is refused.

  4. Send the test email.

    Both plugins have a test tab. A successful send appears in the Notix dashboard within seconds with its status; a refused one shows the relay’s reason in the plugin’s log, and it is almost always the From domain.

Keep the key out of the database

Constants in wp-config.php.

A settings screen stores the password in wp_options, where every database backup and every plugin with option access can read it. WP Mail SMTP reads its WPMS_* constants from wp-config.php instead when WPMS_ON is defined, and greys the fields out. FluentSMTP asks, when you save a connection, whether to keep the credentials in the database or in constants it names for you; choose the constants.

wp-config.php, WP Mail SMTP constants
<?php
// wp-config.php, above "That's all, stop editing!"
//
// With WPMS_ON set, WP Mail SMTP reads these instead of the database and
// shows the fields greyed out in its settings screen. The key is never
// stored in wp_options, so a database dump or a plugin that reads options
// cannot leak it.

define( 'WPMS_ON', true );

define( 'WPMS_MAILER', 'smtp' );
define( 'WPMS_SMTP_HOST', 'smtp.usenotix.dev' );
define( 'WPMS_SMTP_PORT', 465 );
define( 'WPMS_SSL', 'ssl' );            // 'tls' if you use port 587
define( 'WPMS_SMTP_AUTOTLS', true );
define( 'WPMS_SMTP_AUTH', true );
define( 'WPMS_SMTP_USER', 'notix' );
define( 'WPMS_SMTP_PASS', getenv( 'NOTIX_API_KEY' ) ); // or the key as a string

define( 'WPMS_MAIL_FROM', 'receipts@acme.com' );   // on a domain verified in Notix
define( 'WPMS_MAIL_FROM_FORCE', true );
define( 'WPMS_MAIL_FROM_NAME', 'Acme' );
define( 'WPMS_MAIL_FROM_NAME_FORCE', true );
Without a plugin

A must-use plugin on phpmailer_init.

WordPress fires phpmailer_init with the PHPMailer instance just before every send. A file in wp-content/mu-plugins that points it at the relay is the whole integration: it loads before ordinary plugins, cannot be deactivated from the admin, and adds no settings screen to protect.

wp-content/mu-plugins/notix-smtp.php
<?php
/**
 * Plugin Name: Notix SMTP
 * Description: Sends every wp_mail() through the Notix SMTP relay.
 *
 * Save as wp-content/mu-plugins/notix-smtp.php. Must-use plugins load
 * before everything else and cannot be switched off from the admin.
 */

add_action( 'phpmailer_init', function ( $phpmailer ) {
    $phpmailer->isSMTP();
    $phpmailer->Host       = 'smtp.usenotix.dev';
    $phpmailer->Port       = 465;
    $phpmailer->SMTPSecure = 'ssl';          // 'tls' with Port 587
    $phpmailer->SMTPAuth   = true;
    $phpmailer->Username   = 'notix';
    // The password is a Notix API key. Read it from the environment or a
    // constant you define in wp-config.php; never commit it.
    $phpmailer->Password   = defined( 'NOTIX_API_KEY' ) ? NOTIX_API_KEY : getenv( 'NOTIX_API_KEY' );
} );

// WordPress defaults the sender to wordpress@your-site-host, which is not a
// domain you verified in Notix. Force an address that is.
add_filter( 'wp_mail_from', fn () => 'receipts@acme.com' );
add_filter( 'wp_mail_from_name', fn () => 'Acme' );
optional: log refused sends
<?php
// Optional, in the same mu-plugin: log the relay's reason when a send is
// refused, instead of wp_mail() returning false in silence.
add_action( 'wp_mail_failed', function ( $error ) {
    error_log( 'notix smtp: ' . $error->get_error_message() );
} );

Define NOTIX_API_KEY in wp-config.php or export it in the PHP environment. The same PHPMailer values are the ones the PHP guide uses outside WordPress.

The From address

Where WordPress, WooCommerce and forms get their sender.

The relay sends only from a domain you verified. Every WordPress component has its own idea of the From address, and a message from an unverified one is refused, not sent. This is the section to read when a test email works and an order email does not.

WordPress core.

Defaults to wordpress@ followed by your site’s hostname, which is only a verified domain if you verified that exact host. The wp_mail_from filter in the mu-plugin, or the From Email field in either plugin, replaces it.

WooCommerce.

Uses the “From” name and address under WooCommerce, Settings, Emails, Email sender options, for every order, refund and account email. Set it to the verified domain. When it is not, the order still completes and the customer simply never receives the confirmation, because wp_mail() returns false and WooCommerce does not surface that.

Contact Form 7.

Each form’s Mail tab has a From field, and the template default puts the visitor’s address there on some setups. Use an address on your verified domain as From and put the visitor in Reply-To; Contact Form 7 itself warns when From is not on the site’s domain, for the same authentication reason.

Force it once, everywhere.

WP Mail SMTP’s Force From Email and FluentSMTP’s force sender email rewrite the From on every message before it reaches the relay, whichever plugin set it. Turn it on and the per-plugin settings stop mattering.

What changes

What you get that wp_mail() never gave you.

A status per message.

Delivered, bounced or complained, in the dashboard, for the password reset a customer says never arrived. wp_mail() returns true when PHP handed the message off, and nothing after.

Suppression.

An address that hard-bounced or unsubscribed is skipped on the next send, whichever plugin sends it. Bounced addresses no longer keep damaging the domain’s reputation.

Webhooks.

The same delivery events reach any webhook you register, so an order email that bounced can flag the order in your own system.

Authentication.

Mail leaves under your verified domain with SPF and DKIM in place, instead of from a shared host’s IP that inbox providers have already learned to distrust.

One login to revoke.

The password is an API key. Revoke it in the dashboard and the site stops sending that moment; rotate it and only one settings block changes.

A path to the API.

The key that logs the site in over SMTP also works against the email API, for the day a custom plugin wants idempotency keys or templates managed in Notix.

FAQ

Questions about WordPress and Notix, answered.

Is there a Notix WordPress plugin?
No, and you do not need one. WordPress sends every email through wp_mail(), which hands the message to PHPMailer, and PHPMailer speaks SMTP. Any SMTP plugin, or a ten-line must-use plugin on the phpmailer_init hook, points that at the Notix relay. From there the message is the same tracked send the API makes. A dedicated plugin would only be a settings screen for the same four fields.
Which settings do I put in WP Mail SMTP or FluentSMTP?
Pick the "Other SMTP" mailer. Host smtp.usenotix.dev, port 465 with SSL encryption (or 587 with TLS), authentication on, username notix, and any Notix API key as the password. Set the From email to an address on a domain you verified in Notix and turn on "force from email" so plugins cannot override it with an unverified one.
Where should the API key live?
Not in the database if you can help it. WP Mail SMTP reads WPMS_SMTP_PASS and the other WPMS_* constants from wp-config.php when WPMS_ON is defined, and greys the fields out in its settings screen. FluentSMTP offers the same choice when you save a connection: keep the credentials in the database or in wp-config.php constants it names for you. The mu-plugin on this page reads a constant or an environment variable. Either way, create a key just for the site so revoking it does not touch anything else.
Why does WooCommerce or Contact Form 7 stop sending after I switch?
Almost always the From address. The relay refuses mail from a domain you have not verified in Notix rather than sending it unauthenticated. WooCommerce uses the "From" address under WooCommerce, Settings, Emails; Contact Form 7 uses the From header in each form's Mail tab, and the WordPress default is wordpress@ your site's hostname. Set all of them to a verified domain, or turn on your SMTP plugin's force-from option so every message leaves under the address you configured. Put the visitor's address in Reply-To, not From.
What do I get that wp_mail() alone does not?
A record. Each message shows in the Notix dashboard with delivered, bounced or complained status, the same events reach any webhook you register, and an address that bounced or unsubscribed is suppressed automatically on the next send, whether it came from a password reset, an order email or a form. wp_mail() on a bare host gives you a boolean and no idea what happened after.
Does this cover WooCommerce order emails and password resets?
Yes. Everything WordPress sends goes through wp_mail(): new-user and password-reset mail, comment notifications, WooCommerce's order, refund and account emails, and whatever your form, membership or booking plugins send. If a plugin bypasses wp_mail() with its own mailer (rare, and its settings will say so), point that mailer at the same host and login. Marketing mail to a list belongs on Notix campaigns rather than in a WordPress loop.

Four fields, and every WordPress email is tracked.

Verify your domain, create an API key, paste the relay values into the plugin you already have. The free plan does not ask for a card.