Greater Atlanta's IT partner since 1989
Microsoft 365
Microsoft 365 mail for WordPress
WordPress 5.8+ · PHP 7.4+
SHA-2560d32555d901360ac130d43686977077d42ca2c836865909d3a6843176e754fcd
Routes all WordPress mail through the Microsoft Graph API using app-only (client credentials) authentication.
Unlike Gravity SMTP, WP Mail SMTP, FluentSMTP and Post SMTP — which all use delegated OAuth and therefore need a licensed user mailbox to sign in as — this plugin authenticates as the application itself. That means it can send from an unlicensed shared mailbox, which is the whole reason it exists.
From header while sending through a real mailbox behind it.From address as Reply-To, so Gravity Forms notifications come from forms@ and replies reach whoever submitted the form.Retry-After when Exchange Online throttles a mailbox.It fails closed. Once a client secret has been saved, a broken configuration stops mail and says so — with an error, a log entry and an admin notice — instead of quietly falling back to unauthenticated PHP mail(). Mail passes through to WordPress only while the plugin has never been configured, so a half-finished install cannot lock an administrator out of password resets.
That matters more than it sounds. A mail plugin that silently degrades is a mail plugin that loses messages nobody notices until a customer complains.
The Entra client secret is encrypted at rest with AES-256-GCM, using a key derived from wp-config.php rather than the database. A stolen database dump alone does not expose it.
The key is unique to each site. It comes from one of three sources, and the settings screen tells you which is in force:
| Source | Survives salt rotation | Stored in the database |
|---|---|---|
AJC_GRAPH_MAILER_KEY constant |
Yes | No |
| WordPress salts (default) | No | No |
| Generated fallback | Yes | Yes |
Defining AJC_GRAPH_MAILER_KEY in wp-config.php is recommended. Without it the key derives from AUTH_KEY and SECURE_AUTH_KEY, and anything that rotates those — a migration plugin, a host-side staging clone, a security plugin's hardening button — makes the stored secret unreadable and stops mail until it is re-entered. The settings screen offers a generated line to paste.
Tenant-side setup happens once per Microsoft 365 tenant, before the plugin is configured in WordPress. Budget about thirty minutes, plus up to two hours of waiting for permission caches to settle before the first send succeeds.
The short version:
Mail.Send in Entra: Entra consent and Exchange RBAC are additive, and an unscoped Entra grant silently defeats the scope.Day-two operations — rotating the secret, adding a second sending mailbox, what each failure mode means and how to recover — are in the operations guide.
The plugin updates itself through WordPress's normal update screen, from this host rather than wordpress.org.
Every release is signed. A package installs only if it came from this host and its checksum matches a release manifest signed with a key held offline. A site that cannot verify a release refuses it and says so, rather than installing it.
openssl and sodium extensionsA&J Computers — joe@ajcomputers.com
Licensed GPL-2.0-or-later.
Talk to the people who build and support it.