- Renames and updates sending queue worker

- Updates mailer router's send() method
This commit is contained in:
MrCasual
2015-12-04 12:31:54 -05:00
parent beb939df9e
commit c2fde308cb
7 changed files with 125 additions and 62 deletions

View File

@ -1,6 +1,7 @@
<?php <?php
namespace MailPoet\Cron; namespace MailPoet\Cron;
use MailPoet\Cron\Workers\SendingQueue;
use MailPoet\Models\Setting; use MailPoet\Models\Setting;
use MailPoet\Util\Security; use MailPoet\Util\Security;
@ -64,8 +65,8 @@ class Daemon {
} }
try { try {
$worker = new Worker($this->timer); $sendingQueue = new SendingQueue($this->timer);
$worker->process(); $sendingQueue->process();
} catch(Exception $e) { } catch(Exception $e) {
} }

View File

@ -1,41 +1,63 @@
<?php <?php
namespace MailPoet\Cron; namespace MailPoet\Cron\Workers;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterStatistics; use MailPoet\Models\NewsletterStatistics;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Router\Mailer; use MailPoet\Router\Mailer;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
class Worker { class SendingQueue {
function __construct($timer = false) { function __construct($timer = false) {
$this->timer = ($timer) ? $timer : microtime(true); $this->timer = ($timer) ? $timer : microtime(true);
} }
function process() { function process() {
$queues = $queues =
SendingQueue::orderByDesc('priority') \MailPoet\Models\SendingQueue::orderByDesc('priority')
->whereNull('deleted_at') ->whereNull('deleted_at')
->whereNull('status') ->whereNull('status')
->findResultSet(); ->findResultSet();
$mailer = new Mailer();
$mailerMethod = $mailer->buildMailer();
foreach($queues as $queue) { foreach($queues as $queue) {
$newsletter = Newsletter::findOne($queue->newsletter_id); $newsletter = Newsletter::findOne($queue->newsletter_id);
if(!$newsletter) { if(!$newsletter) {
continue; continue;
}; };
$newsletter = $newsletter->asArray(); $newsletter = $newsletter->asArray();
$mailer = new Mailer($httpRequest = false);
if(!empty($newsletter['sender_address']) &&
!empty($newsletter['sender_name'])
) {
$mailer->fromName = $newsletter['sender_name'];
$mailer->fromEmail = $newsletter['sender_address'];
$mailer->fromNameEmail = sprintf(
'%s <%s>',
$mailer->fromName,
$mailer->fromEmail
);
}
if(!empty($newsletter['reply_to_address']) &&
!empty($newsletter['reply_to_name'])
) {
$mailer->replyToName = $newsletter['reply_to_name'];
$mailer->replyToEmail = $newsletter['reply_to_address'];
$mailer->replyToNameEmail = sprintf(
'%s <%s>',
$mailer->replyToName,
$mailer->replyToEmail
);
}
$mailer->mailer = $mailer->buildMailer();
$renderer = new Renderer(json_decode($newsletter['body'], true)); $renderer = new Renderer(json_decode($newsletter['body'], true));
$newsletter = array( $newsletter = array(
'subject' => $newsletter['subject'], 'subject' => $newsletter['subject'],
'id' => $newsletter['id'], 'id' => $newsletter['id'],
'body' => array( 'body' => array(
'html' => $renderer->renderAll(), 'html' => $renderer->renderAll(),
'text' => '' // TODO: add text body 'text' => ''
// TODO: add text body
) )
); );
$subscribers = json_decode($queue->subscribers, true); $subscribers = json_decode($queue->subscribers, true);
@ -48,7 +70,7 @@ class Worker {
foreach($dbSubscribers as $i => $dbSubscriber) { foreach($dbSubscribers as $i => $dbSubscriber) {
$this->checkExecutionTimer(); $this->checkExecutionTimer();
// TODO: replace shortcodes in the newsletter // TODO: replace shortcodes in the newsletter
$result = $mailerMethod->send( $result = $mailer->mailer->send(
$newsletter, $newsletter,
$mailer->transformSubscriber($dbSubscriber) $mailer->transformSubscriber($dbSubscriber)
); );
@ -87,6 +109,6 @@ class Worker {
function checkExecutionTimer() { function checkExecutionTimer() {
$elapsedTime = microtime(true) - $this->timer; $elapsedTime = microtime(true) - $this->timer;
if ($elapsedTime >= 28) throw new \Exception('Maximum execution time reached.'); if($elapsedTime >= 28) throw new \Exception('Maximum execution time reached.');
} }
} }

View File

@ -107,7 +107,7 @@ class Segment extends Model {
} }
} }
static function getSegmentsForImport() { static function getSegmentsWithSubscriberCount() {
return self::selectMany(array(self::$_table.'.id', self::$_table.'.name')) return self::selectMany(array(self::$_table.'.id', self::$_table.'.name'))
->select_expr( ->select_expr(
'COUNT('.MP_SUBSCRIBER_SEGMENT_TABLE.'.subscriber_id)', 'subscribers' 'COUNT('.MP_SUBSCRIBER_SEGMENT_TABLE.'.subscriber_id)', 'subscribers'

View File

@ -8,9 +8,7 @@ require_once(ABSPATH . 'wp-includes/pluggable.php');
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
class Mailer { class Mailer {
function __construct() { function __construct($httpRequest = true) {
list($this->fromName, $this->fromEmail, $this->fromNameEmail)
= $this->getSetting('sender');
$this->mailerType = array( $this->mailerType = array(
'AmazonSES' => 'API', 'AmazonSES' => 'API',
'ElasticEmail' => 'API', 'ElasticEmail' => 'API',
@ -21,84 +19,126 @@ class Mailer {
'SMTP' => null, 'SMTP' => null,
'WPMail' => null 'WPMail' => null
); );
if(!$httpRequest) {
$this->mailer = $this->getSetting('mailer'); list($this->fromName, $this->fromEmail, $this->fromNameEmail)
= $this->getSetting('sender');
$this->mailer = $this->getSetting('mailer');
}
} }
function send($newsletter, $subscriber) { function send($data) {
$subscriber = $this->transformSubscriber($subscriber); $subscriber = $this->transformSubscriber($data['subscriber']);
$mailer = $this->buildMailer(); list($fromName, $fromEmail, $fromNameEmail)
return $mailer->send($newsletter, $subscriber); = $this->getSetting('sender');
$data['mailer']['class'] = 'MailPoet\\Mailer\\' .
(($this->mailerType[$data['mailer']['method']]) ?
$this->mailerType[$data['mailer']['method']] . '\\' . $data['mailer']['method'] :
$data['mailer']['method']
);
$mailer = $this->buildMailer(
$data['mailer'],
$fromName,
$fromEmail,
$fromNameEmail
);
if(!empty($newsletter['sender_address']) &&
!empty($newsletter['sender_name'])
) {
$mailer->fromName = $newsletter['sender_name'];
$mailer->fromEmail = $newsletter['sender_address'];
$mailer->fromNameEmail = sprintf(
'%s <%s>',
$mailer->fromName,
$mailer->fromEmail
);
}
if(!empty($newsletter['reply_to_address']) &&
!empty($newsletter['reply_to_name'])
) {
$mailer->replyToName = $newsletter['reply_to_name'];
$mailer->replyToEmail = $newsletter['reply_to_address'];
$mailer->replyToNameEmail = sprintf(
'%s <%s>',
$mailer->replyToName,
$mailer->replyToEmail
);
}
return $mailer->send($data['newsletter'], $subscriber);
} }
function buildMailer() { function buildMailer($mailer = false, $fromName = false, $fromEmail = false, $fromNameEmail = false) {
switch($this->mailer['method']) { if(!$mailer) $mailer = $this->mailer;
if(!$fromName) $fromName = $this->fromName;
if(!$fromEmail) $fromEmail = $this->fromEmail;
if(!$fromNameEmail) $fromNameEmail = $this->fromNameEmail;
switch($mailer['method']) {
case 'AmazonSES': case 'AmazonSES':
$mailer = new $this->mailer['class']( $mailerInstance = new $mailer['class'](
$this->mailer['region'], $mailer['region'],
$this->mailer['access_key'], $mailer['access_key'],
$this->mailer['secret_key'], $mailer['secret_key'],
$this->fromNameEmail $fromNameEmail
); );
break; break;
case 'ElasticEmail': case 'ElasticEmail':
$mailer = new $this->mailer['class']( $mailerInstance = new $mailer['class'](
$this->mailer['api_key'], $mailer['api_key'],
$this->fromEmail, $this->fromName $fromEmail, $fromName
); );
break; break;
case 'MailGun': case 'MailGun':
$mailer = new $this->mailer['class']( $mailerInstance = new $mailer['class'](
$this->mailer['domain'], $mailer['domain'],
$this->mailer['api_key'], $mailer['api_key'],
$this->fromNameEmail $fromNameEmail
); );
break; break;
case 'MailPoet': case 'MailPoet':
$mailer = new $this->mailer['class']( $mailerInstance = new $mailer['class'](
$this->mailer['api_key'], $mailer['api_key'],
$this->fromEmail, $fromEmail,
$this->fromName $fromName
); );
break; break;
case 'Mandrill': case 'Mandrill':
$mailer = new $this->mailer['class']( $mailerInstance = new $mailer['class'](
$this->mailer['api_key'], $mailer['api_key'],
$this->fromEmail, $this->fromName $fromEmail, $fromName
); );
break; break;
case 'SendGrid': case 'SendGrid':
$mailer = new $this->mailer['class']( $mailerInstance = new $mailer['class'](
$this->mailer['api_key'], $mailer['api_key'],
$this->fromEmail, $fromEmail,
$this->fromName $fromName
); );
break; break;
case 'WPMail': case 'WPMail':
$mailer = new $this->mailer['class']( $mailerInstance = new $mailer['class'](
$this->fromEmail, $fromEmail,
$this->fromName $fromName
); );
break; break;
case 'SMTP': case 'SMTP':
$mailer = new $this->mailer['class']( $mailerInstance = new $mailer['class'](
$this->mailer['host'], $mailer['host'],
$this->mailer['port'], $mailer['port'],
$this->mailer['authentication'], $mailer['authentication'],
$this->mailer['encryption'], $mailer['encryption'],
$this->fromEmail, $fromEmail,
$this->fromName $fromName
); );
break; break;
default: default:
throw new \Exception('Mailing method does not exist.'); throw new \Exception('Mailing method does not exist.');
break; break;
} }
return $mailer; return $mailerInstance;
} }
function transformSubscriber($subscriber) { function transformSubscriber($subscriber) {
if(!is_array($subscriber)) return $subscriber; if(!is_array($subscriber)) return $subscriber;
if(isset($subscriber['address'])) $subscriber['email'] = $subscriber['address'];
$first_name = (isset($subscriber['first_name'])) ? $subscriber['first_name'] : ''; $first_name = (isset($subscriber['first_name'])) ? $subscriber['first_name'] : '';
$last_name = (isset($subscriber['last_name'])) ? $subscriber['last_name'] : ''; $last_name = (isset($subscriber['last_name'])) ? $subscriber['last_name'] : '';
if(!$first_name && !$last_name) return $subscriber['email']; if(!$first_name && !$last_name) return $subscriber['email'];
@ -118,7 +158,7 @@ class Mailer {
$mailer['method'] $mailer['method']
); );
return $mailer; return $mailer;
break;; break;
case 'sender': case 'sender':
$sender = Setting::getValue($setting, null); $sender = Setting::getValue($setting, null);
if(!$sender) throw new \Exception('Sender name and email are not configured.'); if(!$sender) throw new \Exception('Sender name and email are not configured.');

View File

@ -12,7 +12,7 @@ class BootStrapMenu {
function getSegments($withConfirmedSubscribers = false) { function getSegments($withConfirmedSubscribers = false) {
$segments = ($this->action === 'import') ? $segments = ($this->action === 'import') ?
Segment::getSegmentsForImport() : Segment::getSegmentsWithSubscriberCount() :
Segment::getSegmentsForExport($withConfirmedSubscribers); Segment::getSegmentsForExport($withConfirmedSubscribers);
return array_map(function ($segment) { return array_map(function ($segment) {
return array( return array(

View File

@ -154,7 +154,7 @@ class SegmentCest {
expect(count($newsletters))->equals(2); expect(count($newsletters))->equals(2);
} }
function itCanGetSegmentsForImport() { function itCanGetSegmentsWithSubscriberCount() {
foreach ($this->subscribersData as $subscriberData) { foreach ($this->subscribersData as $subscriberData) {
$subscriber = Subscriber::create(); $subscriber = Subscriber::create();
$subscriber->hydrate($subscriberData); $subscriber->hydrate($subscriberData);
@ -164,7 +164,7 @@ class SegmentCest {
$association->segment_id = $this->segment->id; $association->segment_id = $this->segment->id;
$association->save(); $association->save();
} }
$segment = Segment::getSegmentsForImport(); $segment = Segment::getSegmentsWithSubscriberCount();
expect($segment[0]['subscribers'])->equals(2); expect($segment[0]['subscribers'])->equals(2);
} }

View File

@ -43,7 +43,7 @@ class BootStrapMenuCest {
$this->bootStrapExportMenu = new BootStrapMenu('export'); $this->bootStrapExportMenu = new BootStrapMenu('export');
} }
function itCanGetSegmentsForImport() { function itCanGetSegmentsWithSubscriberCount() {
$this->_createSegmentsAndSubscribers(); $this->_createSegmentsAndSubscribers();
$segments = $this->bootStrapImportMenu->getSegments(); $segments = $this->bootStrapImportMenu->getSegments();
expect(count($segments))->equals(2); expect(count($segments))->equals(2);