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

View File

@ -1,41 +1,63 @@
<?php
namespace MailPoet\Cron;
namespace MailPoet\Cron\Workers;
use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterStatistics;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Router\Mailer;
if(!defined('ABSPATH')) exit;
class Worker {
class SendingQueue {
function __construct($timer = false) {
$this->timer = ($timer) ? $timer : microtime(true);
}
function process() {
$queues =
SendingQueue::orderByDesc('priority')
\MailPoet\Models\SendingQueue::orderByDesc('priority')
->whereNull('deleted_at')
->whereNull('status')
->findResultSet();
$mailer = new Mailer();
$mailerMethod = $mailer->buildMailer();
foreach($queues as $queue) {
$newsletter = Newsletter::findOne($queue->newsletter_id);
if(!$newsletter) {
continue;
};
$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));
$newsletter = array(
'subject' => $newsletter['subject'],
'id' => $newsletter['id'],
'body' => array(
'html' => $renderer->renderAll(),
'text' => '' // TODO: add text body
'text' => ''
// TODO: add text body
)
);
$subscribers = json_decode($queue->subscribers, true);
@ -48,7 +70,7 @@ class Worker {
foreach($dbSubscribers as $i => $dbSubscriber) {
$this->checkExecutionTimer();
// TODO: replace shortcodes in the newsletter
$result = $mailerMethod->send(
$result = $mailer->mailer->send(
$newsletter,
$mailer->transformSubscriber($dbSubscriber)
);
@ -87,6 +109,6 @@ class Worker {
function checkExecutionTimer() {
$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'))
->select_expr(
'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;
class Mailer {
function __construct() {
list($this->fromName, $this->fromEmail, $this->fromNameEmail)
= $this->getSetting('sender');
function __construct($httpRequest = true) {
$this->mailerType = array(
'AmazonSES' => 'API',
'ElasticEmail' => 'API',
@ -21,84 +19,126 @@ class Mailer {
'SMTP' => null,
'WPMail' => null
);
$this->mailer = $this->getSetting('mailer');
if(!$httpRequest) {
list($this->fromName, $this->fromEmail, $this->fromNameEmail)
= $this->getSetting('sender');
$this->mailer = $this->getSetting('mailer');
}
}
function send($newsletter, $subscriber) {
$subscriber = $this->transformSubscriber($subscriber);
$mailer = $this->buildMailer();
return $mailer->send($newsletter, $subscriber);
function send($data) {
$subscriber = $this->transformSubscriber($data['subscriber']);
list($fromName, $fromEmail, $fromNameEmail)
= $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() {
switch($this->mailer['method']) {
function buildMailer($mailer = false, $fromName = false, $fromEmail = false, $fromNameEmail = false) {
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':
$mailer = new $this->mailer['class'](
$this->mailer['region'],
$this->mailer['access_key'],
$this->mailer['secret_key'],
$this->fromNameEmail
$mailerInstance = new $mailer['class'](
$mailer['region'],
$mailer['access_key'],
$mailer['secret_key'],
$fromNameEmail
);
break;
case 'ElasticEmail':
$mailer = new $this->mailer['class'](
$this->mailer['api_key'],
$this->fromEmail, $this->fromName
$mailerInstance = new $mailer['class'](
$mailer['api_key'],
$fromEmail, $fromName
);
break;
case 'MailGun':
$mailer = new $this->mailer['class'](
$this->mailer['domain'],
$this->mailer['api_key'],
$this->fromNameEmail
$mailerInstance = new $mailer['class'](
$mailer['domain'],
$mailer['api_key'],
$fromNameEmail
);
break;
case 'MailPoet':
$mailer = new $this->mailer['class'](
$this->mailer['api_key'],
$this->fromEmail,
$this->fromName
$mailerInstance = new $mailer['class'](
$mailer['api_key'],
$fromEmail,
$fromName
);
break;
case 'Mandrill':
$mailer = new $this->mailer['class'](
$this->mailer['api_key'],
$this->fromEmail, $this->fromName
$mailerInstance = new $mailer['class'](
$mailer['api_key'],
$fromEmail, $fromName
);
break;
case 'SendGrid':
$mailer = new $this->mailer['class'](
$this->mailer['api_key'],
$this->fromEmail,
$this->fromName
$mailerInstance = new $mailer['class'](
$mailer['api_key'],
$fromEmail,
$fromName
);
break;
case 'WPMail':
$mailer = new $this->mailer['class'](
$this->fromEmail,
$this->fromName
$mailerInstance = new $mailer['class'](
$fromEmail,
$fromName
);
break;
case 'SMTP':
$mailer = new $this->mailer['class'](
$this->mailer['host'],
$this->mailer['port'],
$this->mailer['authentication'],
$this->mailer['encryption'],
$this->fromEmail,
$this->fromName
$mailerInstance = new $mailer['class'](
$mailer['host'],
$mailer['port'],
$mailer['authentication'],
$mailer['encryption'],
$fromEmail,
$fromName
);
break;
default:
throw new \Exception('Mailing method does not exist.');
break;
}
return $mailer;
return $mailerInstance;
}
function transformSubscriber($subscriber) {
if(!is_array($subscriber)) return $subscriber;
if(isset($subscriber['address'])) $subscriber['email'] = $subscriber['address'];
$first_name = (isset($subscriber['first_name'])) ? $subscriber['first_name'] : '';
$last_name = (isset($subscriber['last_name'])) ? $subscriber['last_name'] : '';
if(!$first_name && !$last_name) return $subscriber['email'];
@ -118,7 +158,7 @@ class Mailer {
$mailer['method']
);
return $mailer;
break;;
break;
case 'sender':
$sender = Setting::getValue($setting, null);
if(!$sender) throw new \Exception('Sender name and email are not configured.');

View File

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

View File

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

View File

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