101 lines
2.2 KiB
PHP
101 lines
2.2 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;
|
|
|
|
/**
|
|
* 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'] );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get speed (emails per hour) for Newsletter engine.
|
|
*
|
|
* @return int
|
|
*/
|
|
public function get_speed() {
|
|
return $this->speed;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
}
|