WP Manifestindependent plugin directory
manifest / email / inklura-mail

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

0stars
0forks

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.zip

Readme

Inklura Mail

Route WordPress transactional email through the bext managed email send service — reliable delivery without configuring SMTP, and a fallback to native wp_mail whenever 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:

  1. Tick Route email through bext.
  2. (Optional) Set a From name / From email override and a default Reply-To.
  3. (Optional) Toggle the mail log and set max log rows / max send attempts.
  4. 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 →

Releases

TagPublishedAssetDownloads
v0.2.0 Jun 13, 2026 inklura-mail.zip 0
v0.1.0 Jun 13, 2026 inklura-mail.zip 0