- Renames and updates sending queue worker
- Updates mailer router's send() method
This commit is contained in:
@ -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) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.');
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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'
|
||||||
|
@ -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.');
|
||||||
|
@ -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(
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user