Inklura Mail
Inklura Mail — route wp_mail through bext managed email, with a log. Multisite + self-updating.
by webdesign29 · github.com/webdesign29/inklura-mail · website
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/webdesign29/inklura-mail/releases/download/v0.2.0/inklura-mail.zipReadme
Inklura Mail
Route WordPress transactional email through the bext managed email send service — reliable delivery without configuring SMTP, and a fallback to native
wp_mailwhenever bext can't take the message.
inklura-mail is a small, dependency-free WordPress plugin (part of the Inklura
suite) for sites served behind bext. It hooks wp_mail, maps the message to
bext's email/send API over loopback, and short-circuits delivery on success. If
anything goes wrong — bext unreachable, no SMTP configured, attachment too large —
it fails open and lets WordPress send the message the normal way, so nothing is
ever silently dropped.
Safe by default: routing is off until you enable it, every bext call fails open,
and the plugin never edits wp-config.php.
Features
| Feature | What it does |
|---|---|
| bext routing | Hooks pre_wp_mail, builds a {to,cc,bcc,subject,html\|text,reply_to,from,attachments} payload from the wp_mail $atts, and POSTs it to http://127.0.0.1/__bext/sdk/email/send with X-Bext-App-Id. On HTTP 200 + {ok:true} it short-circuits; otherwise WordPress sends it. |
| Multipart | HTML messages are sent with a derived plain-text alternative (so non-HTML clients get a readable body). Honors both an explicit Content-Type header and the wp_mail_content_type filter. |
| Retry on transient failure | On a transient bext failure (timeout, 429, 5xx, unreachable) the message is re-attempted in the background — via the bext queue if reachable, else a wp-cron event — up to a max-attempts cap with growing backoff. WordPress still delivers immediately as a fallback, so nothing waits on a retry. Permanent failures (4xx / ok:false) are not retried. |
| From / Reply-To | Optional From name / From email applied via the wp_mail_from / wp_mail_from_name filters (works for native sends too), plus a default Reply-To used when a message sets none. |
| Mail log | A per-blog custom table of sends — recipient, subject, time, via (bext|wp), status (sent|fallback|failed), error note, and attempts — with search (recipient/subject), status/transport filters, pagination, and a per-entry detail view. Capped (default 500 rows) and auto-pruned. Toggleable + clearable in wp-admin. |
| Send stats | Sent / fallback / failed / total counts over the last 7 days, on the Mail Log page. |
| Send test email | A one-click button on the settings page (admin-post + nonce) that emails the site admin and reports the result. |
| Attachment guard | Bounds total attachment size (base64 inflates ~33% and is held in memory); oversized batches fall back to native wp_mail, which streams from disk. |
| Multisite | Per-blog settings, log table, and retry cron; the X-Bext-App-Id disambiguates subdirectory-multisite blogs (host or host-path). Optional network-defaults page (with Enforce). |
| Auto-update | Self-hosted updates for normal-plugin installs — "update available" + one-click update from a manifest, like a wordpress.org plugin. |
Install
Put the repository in wp-content/plugins/inklura-mail/ and activate Inklura Mail,
or upload the built ZIP (bin/build-zip.sh) via Plugins → Add New → Upload.
Configure
Open Inklura Mail in wp-admin:
- Tick Route email through bext.
- (Optional) Set a From name / From email override and a default Reply-To.
- (Optional) Toggle the mail log and set max log rows / max send attempts.
- Use Send test email to verify delivery end-to-end.
The Mail Log page (left-hand menu) shows 7-day stats and a searchable, filterable, paginated table; click any subject for the full entry detail.
Power users can lock config in wp-config.php:
define( 'INKLURA_MAIL_ENABLE', true ); // master kill switch (false to fully disable)
define( 'INKLURA_MAIL_DISABLE', false ); // force routing off, keep the rest
define( 'INKLURA_MAIL_APP_ID', 'my-app' ); // override X-Bext-App-Id
define( 'INKLURA_MAIL_ENDPOINT', 'http://127.0.0.1' ); // override loopback base
Filters
| Filter | Purpose |
|---|---|
inklura/inklura-mail/routing_enabled |
Force routing on/off in code. |
inklura/inklura-mail/endpoint_base |
Change the bext base origin. |
inklura/inklura-mail/request_timeout |
Send request timeout (seconds, default 8). |
inklura/inklura-mail/max_attachment_bytes |
Attachment size cap (default 15 MiB). |
inklura/inklura-mail/text_alternative |
Customize / suppress the derived plain-text body for HTML mail. |
inklura/inklura-mail/max_attempts |
Total send attempts cap (default 3). |
inklura/inklura-mail/retry_backoff |
Seconds to wait before the next retry (per attempt). |
inklura/inklura-mail/use_bext_queue |
Use the bext queue for retries vs. wp-cron only (default true). |
inklura/inklura-mail/log_max_entries |
Mail-log cap (overrides the setting; default 500). |
inklura/inklura-mail/update_manifest_url |
Update manifest URL. |
inklura/inklura-mail/fallback |
Action fired when a bext send is skipped/failed. |
Testing
for t in tests/unit/*.php; do php "$t"; done # WP-free unit tests
CI lints on PHP 7.4 / 8.1 / 8.3 and runs the unit tests.
Sponsors
Inklura Mail is built and maintained with the support of:
- webdesign29 — web agency (Brest, France).
- Inklura — WordPress-compatible CMS & hosting.
Interested in sponsoring? Use the Sponsor button or open an issue.
License
GPL-2.0-or-later — see LICENSE.
Read the full README on GitHub →