WP Manifestindependent plugin directory
manifest / email / wp-newslatter-campaigns

WP Newsletter Campaigns

WordPress Newsletter Campaigns plugin

by WP Workspace · github.com/raivis-kalnins/wp-newslatter-campaigns

0stars
0forks

Install

No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:

wp plugin install https://github.com/raivis-kalnins/wp-newslatter-campaigns/archive/refs/heads/master.zip

Readme

WP Newsletter Campaigns

Native WordPress newsletter system, packaged as a single plugin to replace the current Newsletter plugin plus the active Newsletter add-ons and the separate campaign-upload workflow.

Version

2.1.2

  • Detects localhost, *.localhost, 127.x.x.x, and ::1 WordPress URLs and uses hCaptcha's official integration-test sitekey/secret only on those local URLs; saved production credentials remain untouched and are used everywhere else.
  • Fixes local newsletter subscriptions such as wpbase.localhost, where hCaptcha production tokens are rejected by design even after the challenge succeeds.
  • Logs hCaptcha siteverify error codes when WP_DEBUG is enabled and distinguishes key/secret configuration errors from normal rejected/expired tokens.
  • Returns newsletter validation failures in the normal WordPress AJAX JSON envelope instead of HTTP 422, avoiding misleading failed-network errors in the browser console.

2.1.1

  • Waits for the hCaptcha explicit API onload callback before rendering newsletter widgets, preventing the should not render before js api is fully loaded race.
  • Uses the canonical api.hcaptcha.com/siteverify endpoint and includes the configured site key in server-side verification.
  • Keeps verification-service/network failures separate from a failed hCaptcha challenge so the subscribe form no longer reports the misleading generic verification message for transport failures.
  • Uses recaptchacompat=off consistently for the newsletter-owned hCaptcha loader.

2.1.0

  • Removes the remaining legacy brand references and switches the admin accent to classic WordPress blue.
  • Adds a Gutenberg-style block email builder with Media Library images and responsive email-HTML generation.
  • Adds optional newsletter-only custom SMTP, disabled by default, with a transport test and delivery-log integration.
  • When custom SMTP is disabled, the plugin leaves WordPress wp_mail() and any active site mail/SMTP plugin in control.

2.0.0

  • Moves the full newsletter system into the wp-newslatter-campaigns plugin with WP-prefixed hooks, options, tables, admin pages, assets, shortcodes, and internal identifiers.
  • Adds a one-time compatibility import that copies existing data and key settings from the previous plugin namespace into the new WP-prefixed storage.
  • Adds a native Lists screen at /wp-admin/admin.php?page=newsletter_subscription_lists, compatible with the Newsletter plugin's 40-list model.
  • Imports existing newsletter_subscription_lists names, Public/Private state, and Enforced settings when available.
  • Adds normalized subscriber/list membership storage, list counts, Add/Unlink Everyone, Confirm/Unconfirm All, public subscription-form list choices, and enforced-list assignment for new subscribers.
  • Adds campaign audience targeting so a campaign can send to all active subscribers or one configured list.
  • Keeps the existing hCaptcha, delivery queue, campaign upload, reporting, WooCommerce, automation, webhook, bounce, and import/export functionality under the new WP namespace.

1.7.24

  • Prevents WP's fallback hCaptcha loader from racing an asynchronously rendered WS Form hCaptcha field.
  • Shares WP's confirmed API-ready state with WS Form if the fallback loader is required.
  • Waits briefly for the shared hCaptcha API on submit instead of immediately showing a captcha error.

1.7.23

  • Renders the WP invisible hCaptcha widget in its real newsletter-form container so an interactive challenge can be displayed when required.
  • Handles the object returned by asynchronous hcaptcha.execute() and submits only the verified response token.
  • Continues to reuse WS Form's single hCaptcha API instance on shared pages such as Contact.

1.7.22

  • Enforces one visible recipient for every WP Newsletter Campaigns wp_mail() handoff and removes injected To, CC, or BCC headers.
  • Repairs stale GD Mail Queue recipient-log relations by matching WP's unique delivery ID to the correct subscriber.
  • Cleans existing affected WP log entries during the plugin upgrade; actual queued messages remain unchanged.

1.7.21

  • Defers the hCaptcha API to WS Form on pages containing a WS Form shortcode or block, preventing two competing api.js loads.
  • Reuses WS Form's loaded hCaptcha singleton for WP Newsletter Campaigns forms on the same page.
  • Waits for WS Form's hCaptcha onload signal before rendering a WP Newsletter Campaigns widget.
  • Loads the WP hCaptcha API as a fallback when the detected WS Form does not contain an hCaptcha field.

1.7.20

  • Disables WP Newsletter Campaigns's private SMTP, PHPMailer, and From-identity overrides.
  • Sends welcome, proof, demo, live, retry, and background messages exclusively through WordPress wp_mail().
  • Supports GD Mail Queue or another administrator-selected WordPress mail plugin as the sole queue and delivery owner.
  • Removes direct SMTP credentials and Mailpit transport controls from WP Newsletter Campaigns Settings while preserving WP recipient scheduling, personalisation, unsubscribe handling, and delivery handoff logs.

1.7.19

  • Sends a one-time branded welcome email after a new visitor successfully subscribes through a WP newsletter form.
  • Adds editable welcome-email subject, heading, message, and an enable/disable control in Newsletter Settings.
  • Records welcome-email transport results in the existing delivery log and avoids repeat emails for addresses that are already active subscribers.
  • Exposes template artwork and CTA filters so the WordPress child theme can supply its current logo, mascot, and prizes URL.

1.7.16

  • Removes the separate WordPress global wp_mail path that was used only by live Mailpit sends.
  • Live, unsent-retry, and background live delivery now call the exact same fresh per-recipient PHPMailer/SMTP routine as the working Demo Subscribers action.
  • Keeps the same local live HTML preparation, visible To recipient, unique Message-ID, one-second pacing, and recipient-level logs.
  • Fixes the missing local-capture mode variable in the Demo Subscribers completion notice.
  • No Docker, Compose, Mailpit, or environment changes.

1.7.14

  • Removes the Mailpit HTTP API from all newsletter delivery decisions.
  • Proof, demo, live, and Send to unsent subscribers now use the same fresh per-recipient SMTP routine.
  • Local Mailpit delivery uses SMTP host mailpit and SMTP port 1025; http://mailpit.localhost/ is only the browser inbox.
  • Existing saved Mailpit API preferences are disabled automatically during the plugin upgrade.
  • Keeps unique visible To headers, Message-IDs, queue logging, retries, and one-recipient transactions.

1.7.12

  • Live sends through Mailpit/local capture now use the same proven per-recipient header context as Demo Subscriber sends.
  • Local live tests keep the personalized unsubscribe link in the HTML body but omit external-list transport headers that are unnecessary in a capture inbox.
  • Real SMTP/Post SMTP live sends continue to include List-Unsubscribe and List-ID headers.
  • Small live lists remain synchronous and paced one recipient at a time; Docker and Mailpit configuration are not changed.

1.7.11

1.7.11 Mailpit endpoint routing fix

  • Separates the browser Mailpit URL from the server-side API endpoint.
  • Automatically maps mailpit.localhost to the Docker/network API URL http://mailpit:8025.
  • Retries the internal Mailpit endpoint when a configured browser URL returns the WordPress 404 page or non-JSON content.
  • Uses the same Mailpit API base for sending and stored-message verification, preventing cross-instance verification.
  • Truncates HTML proxy errors in delivery logs and immediately returns failed attempts to retry instead of leaving misleading processing rows.

1.7.9 Mailpit verification compatibility

  • Prevents a successful Mailpit Send API insert from being changed to retry when the optional single-message read-back route returns 404.
  • Retries the detail route briefly and falls back to the Mailpit message-list endpoint.
  • Treats the database ID returned by /api/v1/send as the capture confirmation when read-back is unavailable, while preserving a verification note in the delivery log.
  • Still fails safely if Mailpit returns a stored message with a different recipient.

1.7.8 verified Mailpit API capture

  • Uses Mailpit's HTTP send API automatically when a Mailpit/local capture host is configured.
  • Requires Mailpit to return a real database message ID, then reads the stored message back and verifies the exact To recipient.
  • Logs the Mailpit message ID, API endpoint, recipient, and Message-ID for every proof, demo, and live-test message.
  • Treats an API or verification failure as a failed recipient so it can be retried instead of falsely reporting a local capture.
  • Adds optional Mailpit API URL and Basic Authentication settings; http://<smtp-host>:8025 is used automatically when left blank.

1.7.7 Mailpit/local SMTP test mode

  • Allows proof, demo, and live-test campaigns to send through Mailpit, MailHog, smtp4dev, localhost, and port 1025.
  • Labels successful local test transactions as Captured locally instead of treating them as external mailbox delivery.
  • Keeps one recipient per message, unique Message-IDs, recipient-level logs, and full live/demo recipient processing in capture mode.
  • Shows an informational local-test notice rather than blocking campaign actions.
  • External delivery still requires a real provider SMTP host or Post SMTP, but local capture testing remains fully supported.

1.7.6 verified unique MIME identity and adaptive pacing

  • Generates a unique Message-ID from the delivery UUID plus the destination-address fingerprint for every recipient.
  • Validates the actual prepared MIME Message-ID header before opening the SMTP transaction; a missing or reused ID is treated as a send failure rather than falsely queued.
  • Stores and displays the real Message-ID correctly instead of losing angle-bracket IDs during WordPress sanitisation.
  • Adds a unique hidden delivery fingerprint to each HTML and plain-text body to prevent forwarding relays or final mailboxes from collapsing otherwise identical messages.
  • Paces small live and demo lists at one SMTP transaction per second, while 100+ and 1,000+ lists retain the faster configured background-burst throttle.

1.7.4 direct recipient header enforcement

  • Sends every live, demo, and proof message with the subscriber in the visible To: header; no BCC recipient bucket is used.
  • Disables PHPMailer SingleTo compatibility mode for SMTP delivery.
  • Clears To, CC, BCC, and Reply-To state before every individual message.
  • Validates the prepared MIME headers before SMTP submission and refuses any message containing Undisclosed recipients or a BCC recipient.
  • Logs Header To and Recipient mode: direct-to-no-bcc beside the SMTP queue ID.

1.7.3 controlled resend and unsent recovery

  • Removes normal Send live again/Restart live send controls after a campaign has live-send history; repeated demo sends remain available.
  • Adds a restricted Reset to Draft control only at the bottom of the campaign editor for wp_raivis, wp_alan, and wp_soniya.
  • After a restricted reset, the campaign returns to Draft and can be sent live as a fresh campaign.
  • Shows recipient-level unsent rows from the latest live run and adds Send to unsent subscribers, which retries only pending, retrying, processing, or failed active recipients.
  • Previously successful recipients are never included in an unsent retry.

1.7.1 verified local SMTP and Draft reset

  • Uses a fresh isolated PHPMailer instance for every recipient when the built-in local SMTP transport is selected.
  • Marks a local SMTP message accepted only after capturing the actual 2xx reply following DATA; the later 221 connection-close reply is no longer treated as delivery evidence.
  • Records the real SMTP acceptance reply and transaction ID in the sending log without recording authentication commands.
  • Adds Reset to Draft on campaign list and edit screens. Reset cancels pending live jobs, clears the recipient snapshot and progress, and keeps the campaign and delivery logs.

1.7.0 durable live delivery queue

  • Rebuilds every live send as a fresh, validated recipient snapshot instead of reusing stale campaign-recipient rows.
  • Verifies that the number of queued rows exactly matches the number of active live subscribers before sending begins.
  • Processes small lists completely in the current request and starts the first configured burst immediately for large lists.
  • Uses Action Scheduler asynchronous bursts for 100, 1,000, and larger lists, with a one-minute WP-Cron watchdog fallback.
  • Gives every recipient a unique Message-ID and WP delivery ID, preventing relay or mailbox de-duplication between recipients.
  • Keeps atomic per-recipient claiming, retries, hourly limits, and recipient-level delivery logs.
  • New recommended defaults: 20 messages per burst, 5 seconds between bursts, 100 ms between messages, and a 600-message hourly safety limit.

1.6.7 smart live queue and confirmed resend

  • Processes the first configured live batch immediately when an administrator confirms Send live.
  • Uses one controlled burst worker for following batches, with Action Scheduler/WP-Cron fallback and stalled-item recovery.
  • Adds Resume now for a stuck active queue.
  • Adds confirmed Send live again and Restart live send actions. A restart cancels remaining old queue items and intentionally creates a fresh run for all currently active live subscribers.
  • Keeps one recipient per email, per-recipient logs, retry handling, and the hourly safety limit.

Read the full README on GitHub →