diff --git a/changelog.txt b/changelog.txt
index b49f2d2..d9c7fa2 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,3 +1,9 @@
+= 2.2.3 =
+
+* CRITICAL FIX: Overridden get_emails_per_run() to bypass Newsletter's internal calculation
+* FIXED: Newsletter was calculating batch = speed / 12, resulting in only 8-16 emails per execution
+* FIXED: Plugin now directly returns configured batch_size for proper queue loading
+
= 2.2.2 =
* FIXED: Newsletter now correctly respects configured batch_size when enqueuing emails
diff --git a/includes/class-plugin.php b/includes/class-plugin.php
index caf1a71..406a102 100644
--- a/includes/class-plugin.php
+++ b/includes/class-plugin.php
@@ -126,6 +126,9 @@ class Plugin extends \NewsletterMailerAddon {
// Load text domain.
add_action( 'init', array( $this, 'load_textdomain' ) );
+ // Force batch size in Newsletter cron.
+ add_filter( 'newsletter_max_emails', array( $this, 'filter_max_emails' ), 999 );
+
// Register admin pages.
if ( is_admin() ) {
require_once ROBOTSTXT_SMTP_NEWSLETTER_PATH . 'admin/class-settings-page.php';
@@ -138,6 +141,25 @@ class Plugin extends \NewsletterMailerAddon {
}
}
+ /**
+ * Filter Newsletter's max emails per execution.
+ *
+ * Forces Newsletter to use our configured batch_size.
+ *
+ * @param int $max_emails Newsletter's calculated max emails.
+ *
+ * @return int Our configured batch_size.
+ */
+ public function filter_max_emails( $max_emails ) {
+ // Only apply if our addon is enabled.
+ $settings = $this->get_settings();
+ if ( empty( $settings['enabled'] ) ) {
+ return $max_emails;
+ }
+
+ return absint( $settings['batch_size'] ?? 10 );
+ }
+
/**
* Load plugin text domain for translations.
*
@@ -172,10 +194,19 @@ class Plugin extends \NewsletterMailerAddon {
// Calculate optimal speed (emails per hour) based on rate limits.
$speed = $this->calculate_optimal_speed( $smtp_settings );
+ // CRITICAL: For queue-based architecture, speed must be high enough
+ // that Newsletter loads all emails at once. Newsletter calculates
+ // batch_size = speed / (60 / cron_interval). With default 5-minute cron:
+ // batch_size = speed / 12. To get batch_size = configured value,
+ // we need: speed = batch_size * 12.
+ $batch_size = $settings['batch_size'] ?? 10;
+ $speed_multiplier = 12; // Assumes 5-minute cron (12 executions per hour).
+ $calculated_speed = max( $speed, $batch_size * $speed_multiplier );
+
// Newsletter expects 'turbo' for batch_size and 'speed' for emails/hour.
$mailer_options = array(
- 'turbo' => $settings['batch_size'] ?? 10,
- 'speed' => $speed,
+ 'turbo' => $batch_size,
+ 'speed' => $calculated_speed,
);
// Detect if Amazon SES is active.
@@ -188,6 +219,47 @@ class Plugin extends \NewsletterMailerAddon {
}
}
+ /**
+ * Get maximum emails per execution.
+ *
+ * Newsletter checks this method to determine batch size.
+ *
+ * @return int
+ */
+ public function get_max_emails() {
+ $settings = $this->get_settings();
+ return absint( $settings['batch_size'] ?? 10 );
+ }
+
+ /**
+ * Get batch size.
+ *
+ * Alternative method that Newsletter may check.
+ *
+ * @return int
+ */
+ public function get_batch() {
+ return $this->get_max_emails();
+ }
+
+ /**
+ * Override Newsletter's calculation of emails per run.
+ *
+ * Newsletter normally calculates: batch = speed / runs_per_hour
+ * For queue-based architecture, we want to enqueue all emails at once.
+ *
+ * @return int Configured batch_size.
+ */
+ public function get_emails_per_run() {
+ $settings = $this->get_settings();
+ if ( empty( $settings['enabled'] ) ) {
+ // If addon is disabled, use parent's calculation.
+ return parent::get_emails_per_run();
+ }
+
+ return absint( $settings['batch_size'] ?? 10 );
+ }
+
/**
* Calculate optimal speed (emails per hour) based on rate limits.
*
diff --git a/readme.txt b/readme.txt
index 8af6fc1..5ad8569 100644
--- a/readme.txt
+++ b/readme.txt
@@ -4,7 +4,7 @@ Tags: newsletter, smtp, email, bulk, queue, worker, amazonses, statistics
Requires at least: 4.7
Tested up to: 6.9
Requires PHP: 7.2
-Stable tag: 2.2.2
+Stable tag: 2.2.3
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
@@ -141,6 +141,11 @@ Yes. The plugin integrates with ROBOTSTXT SMTP rate limiting system to ensure yo
== Changelog ==
+= 2.2.3 =
+* CRITICAL FIX: Overridden get_emails_per_run() to bypass Newsletter's internal calculation
+* FIXED: Newsletter was calculating batch = speed / 12, resulting in only 8-16 emails per execution
+* FIXED: Plugin now directly returns configured batch_size for proper queue loading
+
= 2.2.2 =
* FIXED: Newsletter now correctly respects configured batch_size when enqueuing emails
* FIXED: Emails are now enqueued all at once to database instead of gradually
@@ -180,6 +185,9 @@ Yes. The plugin integrates with ROBOTSTXT SMTP rate limiting system to ensure yo
== Upgrade Notice ==
+= 2.2.3 =
+CRITICAL: Fixed Newsletter loading only 8-16 emails per execution. Now correctly loads all emails based on configured batch_size.
+
= 2.2.2 =
Fixed batch size enforcement - emails now enqueue correctly all at once instead of gradually.
diff --git a/robotstxt-smtp-newsletter.php b/robotstxt-smtp-newsletter.php
index 4b47c2e..949ee33 100644
--- a/robotstxt-smtp-newsletter.php
+++ b/robotstxt-smtp-newsletter.php
@@ -3,7 +3,7 @@
* Plugin Name: Newsletter - SMTP (by ROBOTSTXT)
* Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-newsletter
* Description: Integrates ROBOTSTXT SMTP configuration with Newsletter plugin for efficient bulk email delivery with database-backed queue and external workers.
- * Version: 2.2.2
+ * Version: 2.2.3
* Requires at least: 4.7
* Requires PHP: 7.2
* Security: robotstxt@robotstxt.es
@@ -25,7 +25,7 @@ if ( ! defined( 'ABSPATH' ) ) {
}
// Plugin constants.
-define( 'ROBOTSTXT_SMTP_NEWSLETTER_VERSION', '2.2.2' );
+define( 'ROBOTSTXT_SMTP_NEWSLETTER_VERSION', '2.2.3' );
define( 'ROBOTSTXT_SMTP_NEWSLETTER_FILE', __FILE__ );
define( 'ROBOTSTXT_SMTP_NEWSLETTER_PATH', plugin_dir_path( __FILE__ ) );
define( 'ROBOTSTXT_SMTP_NEWSLETTER_URL', plugin_dir_url( __FILE__ ) );
diff --git a/update.json b/update.json
index ad0107c..a1423ce 100644
--- a/update.json
+++ b/update.json
@@ -1,19 +1,19 @@
{
"name": "Newsletter - SMTP (by ROBOTSTXT)",
"slug": "robotstxt-smtp-newsletter",
- "version": "2.2.2",
+ "version": "2.2.3",
"author": "ROBOTSTXT",
"homepage": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-newsletter",
- "download_url": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-newsletter/releases/download/2.2.2/robotstxt-smtp-newsletter-2.2.2.zip",
+ "download_url": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-newsletter/releases/download/2.2.3/robotstxt-smtp-newsletter-2.2.3.zip",
"requires": "4.7",
"tested": "6.9",
"requires_php": "7.2",
"last_updated": "2026-02-16",
"description": "Integrates ROBOTSTXT SMTP configuration with Newsletter plugin for reliable bulk email delivery with database-backed queue and external workers. Provides persistent email queue, parallel processing, automatic retry, and comprehensive campaign statistics.",
- "changelog": "
2.2.2 - 2026-02-16
- Fixed: Newsletter now correctly respects configured batch_size when enqueuing emails
- Fixed: Emails are now enqueued all at once to database instead of gradually
- Improved: Added public $batch property that Newsletter reads directly
- Improved: Added get_batch_size() method for Newsletter compatibility
- Technical: Mailers expose batch_size through multiple interfaces for Newsletter compatibility
2.2.1 - 2026-02-16
- Added: MultiSite detection in settings page with tailored worker commands
- Added: Worker script now supports --url parameter for MultiSite environments
- Improved: Settings page automatically displays installation-specific worker setup instructions
- Improved: Worker documentation with MultiSite usage examples
- Improved: README with dedicated MultiSite Installations section
- Technical: Worker script parses --url parameter and sets appropriate $_SERVER variables
- Technical: Settings page uses is_multisite() and get_site_url() for detection and URL generation
2.2.0 - 2026-02-16
- MAJOR: Database-backed email queue for persistent, reliable email delivery
- MAJOR: External CLI worker script for asynchronous email processing
- Added: Queue Status widget with real-time statistics (pending, processing, sent, failed)
- Added: Recent Campaigns section with key metrics in settings page
- Added: Email Queue admin page to view all queued and sent emails
- Added: Statistics admin page with campaign performance metrics
- Added: Parallel worker support for high-volume sending (10+ workers simultaneously)
- Added: Automatic retry with exponential backoff (up to 3 attempts: 5min → 15min → 30min)
- Added: Campaign statistics tracking (start time, duration, speed, success rate)
- Changed: Emails are now queued to database instead of sent immediately
- Changed: Settings page reorganized with Queue Status, Recent Campaigns, and Worker Configuration sections
- Changed: Campaign statistics now grouped by unique Newsletter ID instead of campaign name
- Removed: max_per_connection setting (no longer needed with worker architecture)
- Removed: Direct PHPMailer usage (replaced with wp_mail() in workers)
- Fixed: Duplicate campaign statistics for campaigns with same name but different IDs
- Fixed: Worker command documentation (corrected parallel worker syntax)
- BREAKING: Manual worker setup required - emails no longer send automatically
- BREAKING: System cron or process supervisor required for production use
- Technical: New database tables for queue and statistics with automatic creation on activation
- Technical: Microsecond precision timestamps for accurate performance metrics
- Security: CLI-only worker script with SQL injection prevention and capability checks
2.1.0 - 2026-02-09
- Changed: Uninstall behavior: plugin no longer performs cleanup on uninstall, all data cleanup is now handled by the core SMTP plugin
- Changed: This ensures Newsletter configuration is preserved when only the add-on is removed, and properly cleaned when the core plugin is uninstalled
- Technical: Simplified uninstall.php to delegate all cleanup responsibility to core SMTP plugin
2.0.1 - 2026-01-29
- Changed: Removed Network requirement from plugin headers to allow single-site activation
2.0.0 - 2026-01-29
- Changed: Updated compatibility with SMTP (by ROBOTSTXT) plugin 2.0.0
- Changed: Enhanced integration with core SMTP plugin security improvements
- Improved: Better error handling and validation
1.0.0 - 2026-01-29
- Added: Initial release with SMTPKeepAlive support
- Added: Amazon SES API integration for optimized delivery
- Performance: 20-30x faster bulk email sending compared to standard wp_mail()
",
+ "changelog": "2.2.3 - 2026-02-16
- CRITICAL: Overridden get_emails_per_run() to bypass Newsletter's internal calculation
- Fixed: Newsletter was calculating batch = speed / 12, resulting in only 8-16 emails per execution
- Fixed: Plugin now directly returns configured batch_size for proper queue loading
- Technical: Added get_emails_per_run() override in Plugin class
2.2.2 - 2026-02-16
- Fixed: Newsletter now correctly respects configured batch_size when enqueuing emails
- Fixed: Emails are now enqueued all at once to database instead of gradually
- Improved: Added public $batch property that Newsletter reads directly
- Improved: Added get_batch_size() method for Newsletter compatibility
- Technical: Mailers expose batch_size through multiple interfaces for Newsletter compatibility
2.2.1 - 2026-02-16
- Added: MultiSite detection in settings page with tailored worker commands
- Added: Worker script now supports --url parameter for MultiSite environments
- Improved: Settings page automatically displays installation-specific worker setup instructions
- Improved: Worker documentation with MultiSite usage examples
- Improved: README with dedicated MultiSite Installations section
- Technical: Worker script parses --url parameter and sets appropriate $_SERVER variables
- Technical: Settings page uses is_multisite() and get_site_url() for detection and URL generation
2.2.0 - 2026-02-16
- MAJOR: Database-backed email queue for persistent, reliable email delivery
- MAJOR: External CLI worker script for asynchronous email processing
- Added: Queue Status widget with real-time statistics (pending, processing, sent, failed)
- Added: Recent Campaigns section with key metrics in settings page
- Added: Email Queue admin page to view all queued and sent emails
- Added: Statistics admin page with campaign performance metrics
- Added: Parallel worker support for high-volume sending (10+ workers simultaneously)
- Added: Automatic retry with exponential backoff (up to 3 attempts: 5min → 15min → 30min)
- Added: Campaign statistics tracking (start time, duration, speed, success rate)
- Changed: Emails are now queued to database instead of sent immediately
- Changed: Settings page reorganized with Queue Status, Recent Campaigns, and Worker Configuration sections
- Changed: Campaign statistics now grouped by unique Newsletter ID instead of campaign name
- Removed: max_per_connection setting (no longer needed with worker architecture)
- Removed: Direct PHPMailer usage (replaced with wp_mail() in workers)
- Fixed: Duplicate campaign statistics for campaigns with same name but different IDs
- Fixed: Worker command documentation (corrected parallel worker syntax)
- BREAKING: Manual worker setup required - emails no longer send automatically
- BREAKING: System cron or process supervisor required for production use
- Technical: New database tables for queue and statistics with automatic creation on activation
- Technical: Microsecond precision timestamps for accurate performance metrics
- Security: CLI-only worker script with SQL injection prevention and capability checks
2.1.0 - 2026-02-09
- Changed: Uninstall behavior: plugin no longer performs cleanup on uninstall, all data cleanup is now handled by the core SMTP plugin
- Changed: This ensures Newsletter configuration is preserved when only the add-on is removed, and properly cleaned when the core plugin is uninstalled
- Technical: Simplified uninstall.php to delegate all cleanup responsibility to core SMTP plugin
2.0.1 - 2026-01-29
- Changed: Removed Network requirement from plugin headers to allow single-site activation
2.0.0 - 2026-01-29
- Changed: Updated compatibility with SMTP (by ROBOTSTXT) plugin 2.0.0
- Changed: Enhanced integration with core SMTP plugin security improvements
- Improved: Better error handling and validation
1.0.0 - 2026-01-29
- Added: Initial release with SMTPKeepAlive support
- Added: Amazon SES API integration for optimized delivery
- Performance: 20-30x faster bulk email sending compared to standard wp_mail()
",
"sections": {
- "description": "Integrates ROBOTSTXT SMTP configuration with Newsletter plugin for reliable bulk email delivery with database-backed queue and external workers. Version 2.2.2 fixes batch size enforcement to ensure all emails are enqueued at once. Emails are queued to database and processed by external CLI workers, providing reliability, scalability, and detailed monitoring.",
- "changelog": "2.2.2 - 2026-02-16
- Fixed: Batch size enforcement - emails now enqueue correctly all at once
- Improved: Newsletter compatibility with $batch property and get_batch_size() method
2.2.1 - 2026-02-16
- Added: MultiSite detection with tailored worker commands
- Added: Worker --url parameter support for MultiSite
- Improved: Installation-specific worker setup instructions
2.2.0 - 2026-02-16
- MAJOR: Database-backed email queue for persistent, reliable email delivery
- MAJOR: External CLI worker script for asynchronous email processing
- Added: Queue Status widget with real-time statistics
- Added: Recent Campaigns section with key metrics
- Added: Email Queue admin page
- Added: Statistics admin page with campaign metrics
- Added: Parallel worker support (10+ workers)
- Added: Automatic retry with exponential backoff
- Changed: Emails queued to database instead of sent immediately
- Changed: Campaign statistics grouped by Newsletter ID
- Removed: max_per_connection setting
- Fixed: Duplicate campaign statistics
- BREAKING: Manual worker setup required
"
+ "description": "Integrates ROBOTSTXT SMTP configuration with Newsletter plugin for reliable bulk email delivery with database-backed queue and external workers. Version 2.2.3 fixes critical batch loading issue where Newsletter was only loading 8-16 emails per execution. Emails are queued to database and processed by external CLI workers, providing reliability, scalability, and detailed monitoring.",
+ "changelog": "2.2.3 - 2026-02-16
- CRITICAL: Fixed Newsletter loading only 8-16 emails per execution
- Fixed: Overridden get_emails_per_run() to return configured batch_size directly
2.2.2 - 2026-02-16
- Fixed: Batch size enforcement - emails now enqueue correctly all at once
- Improved: Newsletter compatibility with $batch property and get_batch_size() method
2.2.1 - 2026-02-16
- Added: MultiSite detection with tailored worker commands
- Added: Worker --url parameter support for MultiSite
- Improved: Installation-specific worker setup instructions
2.2.0 - 2026-02-16
- MAJOR: Database-backed email queue for persistent, reliable email delivery
- MAJOR: External CLI worker script for asynchronous email processing
- Added: Queue Status widget with real-time statistics
- Added: Recent Campaigns section with key metrics
- Added: Email Queue admin page
- Added: Statistics admin page with campaign metrics
- Added: Parallel worker support (10+ workers)
- Added: Automatic retry with exponential backoff
- Changed: Emails queued to database instead of sent immediately
- Changed: Campaign statistics grouped by Newsletter ID
- Removed: max_per_connection setting
- Fixed: Duplicate campaign statistics
- BREAKING: Manual worker setup required
"
},
"banners": {
"low": "",