robotstxt-smtp-newsletter/includes/class-amazonses-mailer.php
2026-02-18 15:26:06 +00:00

121 lines
2.7 KiB
PHP

<?php
/**
* Queue-based Amazon SES Mailer.
*
* @package ROBOTSTXT_SMTP_Newsletter
*/
namespace Robotstxt_SMTP_Newsletter;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Amazon SES Mailer class.
*
* Enqueues emails to database for asynchronous processing by external workers.
*/
class AmazonSES_Mailer extends \NewsletterMailer {
/**
* Batch size for bulk enqueuing.
*
* SES can handle larger batches than SMTP.
*
* @var int
*/
protected $batch_size = 50;
/**
* Public batch property that Newsletter reads directly.
*
* @var int
*/
public $batch = 50;
/**
* Constructor.
*
* @param array<string, mixed> $options Plugin options.
*/
public function __construct( $options = array() ) {
parent::__construct( 'robotstxt-smtp-newsletter', $options );
// Configure batch_size from turbo (standard Newsletter pattern).
if ( ! empty( $options['turbo'] ) ) {
$this->batch_size = max( 1, (int) $options['turbo'] );
$this->batch = $this->batch_size; // Newsletter reads this directly.
}
}
/**
* Get speed (emails per hour) for Newsletter engine.
*
* @return int
*/
public function get_speed() {
return $this->speed;
}
/**
* Get batch size (emails per execution).
*
* This tells Newsletter how many emails to load and process in each execution.
* Critical for queue-based architecture to enqueue all emails at once.
*
* @return int
*/
public function get_batch_size() {
return $this->batch_size;
}
/**
* Enqueue single email to database.
*
* @param \TNP_Mailer_Message $message Message to enqueue.
*
* @return bool|WP_Error True on success, WP_Error on failure.
*/
public function send( $message ) {
$email = Email_Message::from_newsletter_message( $message );
$queue = Queue::get_instance();
$queue_id = $queue->enqueue( $email );
if ( ! $queue_id ) {
return new \WP_Error( self::ERROR_GENERIC, __( 'Failed to enqueue email', 'robotstxt-smtp-newsletter' ) );
}
return true;
}
/**
* Enqueue chunk of emails in bulk.
*
* @param array<\TNP_Mailer_Message> $messages Messages to enqueue.
*
* @return bool|WP_Error True on success, WP_Error on failure.
*/
public function send_chunk( $messages ) {
$emails = array_map(
array( Email_Message::class, 'from_newsletter_message' ),
$messages
);
$queue = Queue::get_instance();
$queue_ids = $queue->enqueue_bulk( $emails );
if ( count( $queue_ids ) !== count( $messages ) ) {
return new \WP_Error(
self::ERROR_GENERIC,
sprintf(
/* translators: %d: number of emails that failed to enqueue */
__( '%d emails failed to enqueue', 'robotstxt-smtp-newsletter' ),
count( $messages ) - count( $queue_ids )
)
);
}
return true;
}
}