-
released this
2026-05-23 12:00:01 +02:00 | 69 commits to main since this release🚧 Alpha — do not use in production yet. The Newsletter module is feature-complete enough to test end-to-end but hasn't seen real-world send loads. Field testing welcome; feedback / bug reports via GitHub issues.
What's in this release
The Newsletter module ships with everything needed to actually run a campaign on a small list:
- Subscribe forms with double-opt-in confirmation, RFC 8058 one-click unsubscribe, captcha + honeypot + time-trap, customisable templates.
- Categories + Lists: opt-out by category at the recipient level; manual lists for targeting.
- Per-recipient preferences page (public token URL + WP-profile section + Gutenberg block + shortcode).
- Onboarding templates (confirmation / reminder / refuse-acknowledgment) edited in the block editor with a token registry.
- Trash + refuse polish for subscribers.
- Newsletter authoring via inline cards on the Newsletters admin view — every newsletter's settings, audience, sender identity, schedule, and send actions live on its card. Gutenberg is content-only. Send button is state-aware: "Send now" ⇄ "Schedule" ⇄ "Unschedule" (red).
- Send pipeline with chunked recipient materialization, claim-based send loop (race-safe between AJAX and Cron), per-recipient status snapshot, real-time progress bar.
- WP-Cron safety-net + pause/resume/abort + scheduled-send cron handoff.
- SMTP circuit-breaker: consecutive-failure threshold trips the newsletter to `paused` with a red banner explaining "fix SMTP then Resume". "Retry failed (N)" bulk action re-queues failed recipients for another attempt.
- Logging integration: failures are kept in the logs table, successes are pruned by default (data already lives in `newsletter_recipients`), per-newsletter "Log every send" override. Logs page has a tri-state Newsletter filter. Recipients drawer cross-links to each failed row's log entry.
- WP-Cron health diagnostic at the bottom of the Newsletters view: last observed tick, next scheduled tick, `DISABLE_WP_CRON` flag, colour-coded verdict, manual Refresh button + opt-in 10s auto-refresh toggle. Tooltip explains what a cron is for non-technical users.
- Live clock-tick + adaptive server-poll on the cards: relative-time displays update every second when a deadline is imminent, fall back to minute/hour cadence further out. Server-poll runs every 10s only when an interesting card exists; pauses when the tab is hidden; localStorage dedup so multiple tabs don't multiply server load.
- Inline LRob tip when the site relies on pseudo-cron, suggesting a server cron for reliability.
Other changes
- Logging module schema migration v1→v2 (renamed reserved `campaign_id` → `newsletter_id`).
- French translation sweep — 1113 entries, only the .po file header left untranslated.
- `release.sh` polish: JS syntax check via `node --check`, dead-CSS scan with peel-once heuristic, per-language msgfmt stats, file-type + LoC stats.
Coming next
- Step 9 — Tracking: image-rewriter (primary open signal via media URLs) + GIF fallback for image-less emails + link rewriter for clicks + per-subscriber lifetime stats + "Cold subscribers" sub-tab with optional auto-cleanup.
- Step 10 — Bounce handling.
- Step 11 — Import wizard (CSV / JSON full-restore / Newsletter-plugin importer).
Install
- Download `lrob-email-toolkit-0.3.0.zip` below.
- Upload via WP admin → Plugins → Add New → Upload Plugin.
- Enable the Newsletter module under Email Toolkit. (Requires SMTP module to be enabled for actual sending.)
The auto-updater (shipped in 0.2.0) will pick this release up automatically on existing installs within an hour.
Requires
- WordPress 6.0+
- PHP 8.1+
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads