diff --git a/lib/Cron/Daemon.php b/lib/Cron/Daemon.php index 5c009892d6..14f4c42bdb 100644 --- a/lib/Cron/Daemon.php +++ b/lib/Cron/Daemon.php @@ -62,9 +62,11 @@ class Daemon { ) { $this->abortWithError('invalid token'); } - - $worker = new Worker($this->timer); - $worker->process(); + try { + $worker = new Worker($this->timer); + $worker->process(); + } catch(Exception $e) { + } $elapsedTime = microtime(true) - $this->timer; if($elapsedTime < 30) { sleep(30 - $elapsedTime); @@ -76,7 +78,7 @@ class Daemon { $daemonData['token'] = $this->refreshedToken; $daemon->value = json_encode($daemonData); $daemon->save(); - $this->callSelf(); + if($daemonData['status'] === 'strated') $this->callSelf(); } function getDaemon() { diff --git a/lib/Cron/Worker.php b/lib/Cron/Worker.php index a6e4c9e0d9..4a6bcc098d 100644 --- a/lib/Cron/Worker.php +++ b/lib/Cron/Worker.php @@ -4,8 +4,8 @@ namespace MailPoet\Cron; use MailPoet\Models\Newsletter; use MailPoet\Models\NewsletterStatistics; use MailPoet\Models\SendingQueue; -use MailPoet\Models\Setting; use MailPoet\Models\Subscriber; +use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Router\Mailer; if(!defined('ABSPATH')) exit; @@ -21,25 +21,21 @@ class Worker { ->whereNull('deleted_at') ->whereNull('status') ->findResultSet(); - // TODO: usee Mailer's method to get the mailer from DB $mailer = new Mailer(); - $mailer->mailer['method'] = 'MailPoet'; - $mailer->mailer['class'] = 'MailPoet\\Mailer\\MailPoet'; - $mailer->mailer['api_key'] = Setting::getValue('api_key', 'dhNSqj1XHkVltIliyQDvMiKzQShOA5rs0m_DdRUVZHU'); + $mailerMethod = $mailer->buildMailer(); foreach($queues as $queue) { - if($this->checkExecutionTimer()) break; $newsletter = Newsletter::findOne($queue->newsletter_id); if(!$newsletter) { continue; }; $newsletter = $newsletter->asArray(); - // TODO: render newsletter + $renderer = new Renderer(json_decode($newsletter['body'], true)); $newsletter = array( 'subject' => $newsletter['subject'], 'id' => $newsletter['id'], 'body' => array( - 'html' => 'rendering not yet implemented', - 'text' => 'rendering not yet implemented' + 'html' => $renderer->renderAll(), + 'text' => '' // TODO: add text body ) ); $subscribers = json_decode($queue->subscribers, true); @@ -47,20 +43,14 @@ class Worker { if(!isset($subscribers['failed'])) $subscribers['failed'] = array(); if(!isset($subscribers['processed'])) $subscribers['processed'] = array(); foreach(array_chunk($subscribersToProcess, 200) as $subscriberIds) { - if($this->checkExecutionTimer()) break; $dbSubscribers = Subscriber::whereIn('id', $subscriberIds) ->findArray(); foreach($dbSubscribers as $i => $dbSubscriber) { - if($this->checkExecutionTimer()) break; + $this->checkExecutionTimer(); // TODO: replace shortcodes in the newsletter - $result = $mailer->send( + $result = $mailerMethod->send( $newsletter, - sprintf( - "%s %s <%s>", - $dbSubscriber['first_name'], - $dbSubscriber['last_name'], - $dbSubscriber['email'] - ) + $mailer->transformSubscriber($dbSubscriber) ); $newsletterStatistics = NewsletterStatistics::create(); $newsletterStatistics->subscriber_id = $dbSubscriber['id']; @@ -97,6 +87,6 @@ class Worker { function checkExecutionTimer() { $elapsedTime = microtime(true) - $this->timer; - return ($elapsedTime >= 28) ? true : false; + if ($elapsedTime >= 28) throw new \Exception('Maximum execution time reached.'); } } \ No newline at end of file diff --git a/lib/Router/Mailer.php b/lib/Router/Mailer.php index b32b225fec..3ce04d5733 100644 --- a/lib/Router/Mailer.php +++ b/lib/Router/Mailer.php @@ -9,17 +9,27 @@ if(!defined('ABSPATH')) exit; class Mailer { 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->from = sprintf('%s <%s>', $this->fromName, $this->fromEmail); } - + function send($newsletter, $subscriber) { $subscriber = $this->transformSubscriber($subscriber); $mailer = $this->buildMailer(); - return $mailer->send($newsletter, $subscriber); + return wp_send_json($mailer->send($newsletter, $subscriber)); } - + function buildMailer() { switch($this->mailer['method']) { case 'AmazonSES': @@ -27,7 +37,7 @@ class Mailer { $this->mailer['region'], $this->mailer['access_key'], $this->mailer['secret_key'], - $this->from + $this->fromNameEmail ); break; case 'ElasticEmail': @@ -40,7 +50,7 @@ class Mailer { $mailer = new $this->mailer['class']( $this->mailer['domain'], $this->mailer['api_key'], - $this->from + $this->fromNameEmail ); break; case 'MailPoet': @@ -63,6 +73,12 @@ class Mailer { $this->fromName ); break; + case 'WPMail': + $mailer = new $this->mailer['class']( + $this->fromEmail, + $this->fromName + ); + break; case 'SMTP': $mailer = new $this->mailer['class']( $this->mailer['host'], @@ -70,12 +86,16 @@ class Mailer { $this->mailer['authentication'], $this->mailer['encryption'], $this->fromEmail, - $this->fromName); + $this->fromName + ); + break; + default: + throw new \Exception('Mailing method does not exist.'); break; } return $mailer; } - + function transformSubscriber($subscriber) { if(!is_array($subscriber)) return $subscriber; $first_name = (isset($subscriber['first_name'])) ? $subscriber['first_name'] : ''; @@ -85,70 +105,27 @@ class Mailer { $subscriber = trim(preg_replace('!\s\s+!', ' ', $subscriber)); return $subscriber; } - + function getSetting($setting) { switch($setting) { case 'mailer': - // TODO: remove - /* $mailers = array( - array( - 'method' => 'AmazonSES', - 'type' => 'API', - 'access_key' => 'AKIAJM6Y5HMGXBLDNSRA', - 'secret_key' => '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', - '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); - 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\\' . - ((isset($mailer['type'])) ? - $mailer['type'] . '\\' . $mailer['method'] : + (($this->mailerType[$mailer['method']]) ? + $this->mailerType[$mailer['method']] . '\\' . $mailer['method'] : $mailer['method'] ); return $mailer; break;; case 'sender': $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; default: return Setting::getValue($setting, null);