- Updates queue worker to use mailer router for sending
- Updates mailer router to detect method type - Rebases master
This commit is contained in:
@ -62,9 +62,11 @@ class Daemon {
|
|||||||
) {
|
) {
|
||||||
$this->abortWithError('invalid token');
|
$this->abortWithError('invalid token');
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
$worker = new Worker($this->timer);
|
$worker = new Worker($this->timer);
|
||||||
$worker->process();
|
$worker->process();
|
||||||
|
} catch(Exception $e) {
|
||||||
|
}
|
||||||
$elapsedTime = microtime(true) - $this->timer;
|
$elapsedTime = microtime(true) - $this->timer;
|
||||||
if($elapsedTime < 30) {
|
if($elapsedTime < 30) {
|
||||||
sleep(30 - $elapsedTime);
|
sleep(30 - $elapsedTime);
|
||||||
@ -76,7 +78,7 @@ class Daemon {
|
|||||||
$daemonData['token'] = $this->refreshedToken;
|
$daemonData['token'] = $this->refreshedToken;
|
||||||
$daemon->value = json_encode($daemonData);
|
$daemon->value = json_encode($daemonData);
|
||||||
$daemon->save();
|
$daemon->save();
|
||||||
$this->callSelf();
|
if($daemonData['status'] === 'strated') $this->callSelf();
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDaemon() {
|
function getDaemon() {
|
||||||
|
@ -4,8 +4,8 @@ namespace MailPoet\Cron;
|
|||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\NewsletterStatistics;
|
use MailPoet\Models\NewsletterStatistics;
|
||||||
use MailPoet\Models\SendingQueue;
|
use MailPoet\Models\SendingQueue;
|
||||||
use MailPoet\Models\Setting;
|
|
||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
|
use MailPoet\Newsletter\Renderer\Renderer;
|
||||||
use MailPoet\Router\Mailer;
|
use MailPoet\Router\Mailer;
|
||||||
|
|
||||||
if(!defined('ABSPATH')) exit;
|
if(!defined('ABSPATH')) exit;
|
||||||
@ -21,25 +21,21 @@ class Worker {
|
|||||||
->whereNull('deleted_at')
|
->whereNull('deleted_at')
|
||||||
->whereNull('status')
|
->whereNull('status')
|
||||||
->findResultSet();
|
->findResultSet();
|
||||||
// TODO: usee Mailer's method to get the mailer from DB
|
|
||||||
$mailer = new Mailer();
|
$mailer = new Mailer();
|
||||||
$mailer->mailer['method'] = 'MailPoet';
|
$mailerMethod = $mailer->buildMailer();
|
||||||
$mailer->mailer['class'] = 'MailPoet\\Mailer\\MailPoet';
|
|
||||||
$mailer->mailer['api_key'] = Setting::getValue('api_key', 'dhNSqj1XHkVltIliyQDvMiKzQShOA5rs0m_DdRUVZHU');
|
|
||||||
foreach($queues as $queue) {
|
foreach($queues as $queue) {
|
||||||
if($this->checkExecutionTimer()) break;
|
|
||||||
$newsletter = Newsletter::findOne($queue->newsletter_id);
|
$newsletter = Newsletter::findOne($queue->newsletter_id);
|
||||||
if(!$newsletter) {
|
if(!$newsletter) {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
$newsletter = $newsletter->asArray();
|
$newsletter = $newsletter->asArray();
|
||||||
// TODO: render newsletter
|
$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' => 'rendering not yet implemented',
|
'html' => $renderer->renderAll(),
|
||||||
'text' => 'rendering not yet implemented'
|
'text' => '' // TODO: add text body
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
$subscribers = json_decode($queue->subscribers, true);
|
$subscribers = json_decode($queue->subscribers, true);
|
||||||
@ -47,20 +43,14 @@ class Worker {
|
|||||||
if(!isset($subscribers['failed'])) $subscribers['failed'] = array();
|
if(!isset($subscribers['failed'])) $subscribers['failed'] = array();
|
||||||
if(!isset($subscribers['processed'])) $subscribers['processed'] = array();
|
if(!isset($subscribers['processed'])) $subscribers['processed'] = array();
|
||||||
foreach(array_chunk($subscribersToProcess, 200) as $subscriberIds) {
|
foreach(array_chunk($subscribersToProcess, 200) as $subscriberIds) {
|
||||||
if($this->checkExecutionTimer()) break;
|
|
||||||
$dbSubscribers = Subscriber::whereIn('id', $subscriberIds)
|
$dbSubscribers = Subscriber::whereIn('id', $subscriberIds)
|
||||||
->findArray();
|
->findArray();
|
||||||
foreach($dbSubscribers as $i => $dbSubscriber) {
|
foreach($dbSubscribers as $i => $dbSubscriber) {
|
||||||
if($this->checkExecutionTimer()) break;
|
$this->checkExecutionTimer();
|
||||||
// TODO: replace shortcodes in the newsletter
|
// TODO: replace shortcodes in the newsletter
|
||||||
$result = $mailer->send(
|
$result = $mailerMethod->send(
|
||||||
$newsletter,
|
$newsletter,
|
||||||
sprintf(
|
$mailer->transformSubscriber($dbSubscriber)
|
||||||
"%s %s <%s>",
|
|
||||||
$dbSubscriber['first_name'],
|
|
||||||
$dbSubscriber['last_name'],
|
|
||||||
$dbSubscriber['email']
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
$newsletterStatistics = NewsletterStatistics::create();
|
$newsletterStatistics = NewsletterStatistics::create();
|
||||||
$newsletterStatistics->subscriber_id = $dbSubscriber['id'];
|
$newsletterStatistics->subscriber_id = $dbSubscriber['id'];
|
||||||
@ -97,6 +87,6 @@ class Worker {
|
|||||||
|
|
||||||
function checkExecutionTimer() {
|
function checkExecutionTimer() {
|
||||||
$elapsedTime = microtime(true) - $this->timer;
|
$elapsedTime = microtime(true) - $this->timer;
|
||||||
return ($elapsedTime >= 28) ? true : false;
|
if ($elapsedTime >= 28) throw new \Exception('Maximum execution time reached.');
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -9,15 +9,25 @@ if(!defined('ABSPATH')) exit;
|
|||||||
|
|
||||||
class Mailer {
|
class Mailer {
|
||||||
function __construct() {
|
function __construct() {
|
||||||
list($this->fromName, $this->fromEmail) = $this->getSetting('sender');
|
list($this->fromName, $this->fromEmail, $this->fromNameEmail)
|
||||||
|
= $this->getSetting('sender');
|
||||||
|
$this->mailerType = array(
|
||||||
|
'AmazonSES' => 'API',
|
||||||
|
'ElasticEmail' => 'API',
|
||||||
|
'MailGun' => 'API',
|
||||||
|
'Mandrill' => 'API',
|
||||||
|
'SendGrid' => 'API',
|
||||||
|
'MailPoet' => null,
|
||||||
|
'SMTP' => null,
|
||||||
|
'WPMail' => null
|
||||||
|
);
|
||||||
$this->mailer = $this->getSetting('mailer');
|
$this->mailer = $this->getSetting('mailer');
|
||||||
$this->from = sprintf('%s <%s>', $this->fromName, $this->fromEmail);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function send($newsletter, $subscriber) {
|
function send($newsletter, $subscriber) {
|
||||||
$subscriber = $this->transformSubscriber($subscriber);
|
$subscriber = $this->transformSubscriber($subscriber);
|
||||||
$mailer = $this->buildMailer();
|
$mailer = $this->buildMailer();
|
||||||
return $mailer->send($newsletter, $subscriber);
|
return wp_send_json($mailer->send($newsletter, $subscriber));
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildMailer() {
|
function buildMailer() {
|
||||||
@ -27,7 +37,7 @@ class Mailer {
|
|||||||
$this->mailer['region'],
|
$this->mailer['region'],
|
||||||
$this->mailer['access_key'],
|
$this->mailer['access_key'],
|
||||||
$this->mailer['secret_key'],
|
$this->mailer['secret_key'],
|
||||||
$this->from
|
$this->fromNameEmail
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'ElasticEmail':
|
case 'ElasticEmail':
|
||||||
@ -40,7 +50,7 @@ class Mailer {
|
|||||||
$mailer = new $this->mailer['class'](
|
$mailer = new $this->mailer['class'](
|
||||||
$this->mailer['domain'],
|
$this->mailer['domain'],
|
||||||
$this->mailer['api_key'],
|
$this->mailer['api_key'],
|
||||||
$this->from
|
$this->fromNameEmail
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'MailPoet':
|
case 'MailPoet':
|
||||||
@ -63,6 +73,12 @@ class Mailer {
|
|||||||
$this->fromName
|
$this->fromName
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case 'WPMail':
|
||||||
|
$mailer = new $this->mailer['class'](
|
||||||
|
$this->fromEmail,
|
||||||
|
$this->fromName
|
||||||
|
);
|
||||||
|
break;
|
||||||
case 'SMTP':
|
case 'SMTP':
|
||||||
$mailer = new $this->mailer['class'](
|
$mailer = new $this->mailer['class'](
|
||||||
$this->mailer['host'],
|
$this->mailer['host'],
|
||||||
@ -70,7 +86,11 @@ class Mailer {
|
|||||||
$this->mailer['authentication'],
|
$this->mailer['authentication'],
|
||||||
$this->mailer['encryption'],
|
$this->mailer['encryption'],
|
||||||
$this->fromEmail,
|
$this->fromEmail,
|
||||||
$this->fromName);
|
$this->fromName
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new \Exception('Mailing method does not exist.');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return $mailer;
|
return $mailer;
|
||||||
@ -89,66 +109,23 @@ class Mailer {
|
|||||||
function getSetting($setting) {
|
function getSetting($setting) {
|
||||||
switch($setting) {
|
switch($setting) {
|
||||||
case 'mailer':
|
case 'mailer':
|
||||||
// TODO: remove
|
|
||||||
/* $mailers = array(
|
|
||||||
array(
|
|
||||||
'method' => 'AmazonSES',
|
|
||||||
'type' => 'API',
|
|
||||||
'access_key' => 'AKIAJM6Y5HMGXBLDNSRA',
|
|
||||||
'secret_key' => 'P3EbTbVx7U0LXKQ9nTm2eIrP+9aPiLyvaRDsFxXh',
|
|
||||||
'region' => 'us-east-1'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'method' => 'ElasticEmail',
|
|
||||||
'type' => 'API',
|
|
||||||
'api_key' => '997f1f7f-41de-4d7f-a8cb-86c8481370fa'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'method' => 'MailGun',
|
|
||||||
'type' => 'API',
|
|
||||||
'api_key' => 'key-6cf5g5qjzenk-7nodj44gdt8phe6vam2',
|
|
||||||
'domain' => 'mrcasual.com'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'method' => 'MailPoet',
|
|
||||||
'api_key' => 'dhNSqj1XHkVltIliyQDvMiKzQShOA5rs0m_DdRUVZHU'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'method' => 'Mandrill',
|
|
||||||
'type' => 'API',
|
|
||||||
'api_key' => '692ys1B7REEoZN7R-dYwNA'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'method' => 'SendGrid',
|
|
||||||
'type' => 'API',
|
|
||||||
'api_key' => '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'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'method' => 'SMTP',
|
|
||||||
'host' => 'email-smtp.us-west-2.amazonaws.com',
|
|
||||||
'port' => 587,
|
|
||||||
'authentication' => array(
|
|
||||||
'login' => 'AKIAIGPBLH6JWG5VCBQQ',
|
|
||||||
'password' => 'AudVHXHaYkvr54veCzqiqOxDiMMyfQW3/V6F1tYzGXY3'
|
|
||||||
),
|
|
||||||
'encryption' => 'tls'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'method' => 'WPMail'
|
|
||||||
)
|
|
||||||
);*/
|
|
||||||
$mailer = Setting::getValue('mta', null);
|
$mailer = Setting::getValue('mta', null);
|
||||||
if(!$mailer) throw new \Exception('Mailing method has not been configured.');
|
if(!$mailer || !isset($mailer['method'])) throw new \Exception('Mailing method is not configured.');
|
||||||
$mailer['class'] = 'MailPoet\\Mailer\\' .
|
$mailer['class'] = 'MailPoet\\Mailer\\' .
|
||||||
((isset($mailer['type'])) ?
|
(($this->mailerType[$mailer['method']]) ?
|
||||||
$mailer['type'] . '\\' . $mailer['method'] :
|
$this->mailerType[$mailer['method']] . '\\' . $mailer['method'] :
|
||||||
$mailer['method']
|
$mailer['method']
|
||||||
);
|
);
|
||||||
return $mailer;
|
return $mailer;
|
||||||
break;;
|
break;;
|
||||||
case 'sender':
|
case 'sender':
|
||||||
$sender = Setting::getValue($setting, null);
|
$sender = Setting::getValue($setting, null);
|
||||||
return array($sender['name'], $sender['address']);
|
if(!$sender) throw new \Exception('Sender name and email are not configured.');
|
||||||
|
return array(
|
||||||
|
$sender['name'],
|
||||||
|
$sender['address'],
|
||||||
|
sprintf('%s <%s>', $sender['name'], $sender['address'])
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return Setting::getValue($setting, null);
|
return Setting::getValue($setting, null);
|
||||||
|
Reference in New Issue
Block a user