Source of file NewsletterMailerJob.php
Size: 5,147 Bytes - Last Modified: 2021-12-23T10:33:22+00:00
/var/www/docs.ssmods.com/process/src/src/Jobs/NewsletterMailerJob.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 | <?php namespace SilverStripe\Newsletter\Jobs; use SilverStripe\Newsletter\Model\Newsletter; use SilverStripe\Newsletter\Model\SendRecipientQueue; use SilverStripe\Core\Injector\Injector; use SilverStripe\Core\Environment; use SilverStripe\Core\Config\Config; use Psr\Log\LoggerInterface; use Symbiote\QueuedJobs\Services\QueuedJob; use Symbiote\QueuedJobs\Services\AbstractQueuedJob; class NewsletterMailerJob extends AbstractQueuedJob { private static $process_page_size = 10; /** * @param int $newsletterId */ public function __construct($newsletterId = null) { parent::__construct(); if ($newsletterId && ($newsletter = Newsletter::get()->byId($newsletterId))) { $this->setObject( $newsletter, 'Newsletter' ); } } /** * Sitemap job is going to run for a while... * * @return int */ public function getJobType() { return QueuedJob::QUEUED; } /** * @return string */ public function getTitle() { return _t(__CLASS__ . '.MAILER', 'Newsletter Mailer'); } /** * Return a signature for this queued job * * @return string */ public function getSignature() { return md5(get_class($this) . $this->NewsletterID); } /** * This is run once per job, set ups the mailing queue. */ public function setup() { parent::setup(); Environment::increaseTimeLimitTo(); Environment::increaseMemoryLimitTo(); $newsletter = $this->getObject('Newsletter'); if (!$newsletter) { $this->addMessage('Newsletter object missing', 'ERROR'); $this->completeJob(); return; } $lists = $newsletter->MailingLists(); $queueCount = 0; foreach ($lists as $list) { foreach ($list->Recipients()->column('ID') as $recipientID) { $existingQueue = SendRecipientQueue::get()->filter( [ 'RecipientID' => $recipientID, 'NewsletterID' => $newsletter->ID ] ); if ($existingQueue->exists()) { $queueCount++; continue; } $queueItem = SendRecipientQueue::create(); $queueItem->NewsletterID = $newsletter->ID; $queueItem->RecipientID = $recipientID; $queueItem->Status = 'Scheduled'; $queueItem->write(); $queueCount++; } } $this->currentStep = 0; $this->totalSteps = $queueCount * 2; // one to mark, one to send $this->isComplete = false; } public function process() { Environment::increaseTimeLimitTo(); Environment::increaseMemoryLimitTo(); $newsletter = $this->getObject('Newsletter'); if (!$newsletter) { $this->completeJob(); $this->addMessage('Newsletter object missing', 'ERROR'); return true; } $remainingChildren = $newsletter->SendRecipientQueue()->filter('Status', 'Scheduled'); $pageSize = Config::inst()->get(__CLASS__, 'process_page_size'); // if there's no more, we're done! if (!$remainingChildren->exists()) { $this->completeJob(); return true; } $records = $remainingChildren->limit($pageSize)->column('ID'); $send = []; // mark all as in progress first. foreach ($records as $recordId) { $this->currentStep++; $record = SendRecipientQueue::get()->byId($recordId); if ($record) { $record->Status = 'InProgress'; try { $record->write(); $send[] = $recordId; } catch (Exception $e) { $this->addMessage($e->getMessage(), 'ERROR'); Injector::inst()->get(LoggerInterface::class) ->error($e->getMessage()); } } } // send each of notices foreach ($send as $recordId) { $this->currentStep++; $record = SendRecipientQueue::get()->byId($recordId); if ($record) { try { $record->send(); } catch (Exception $e) { $this->addMessage($e->getMessage(), 'ERROR'); Injector::inst()->get(LoggerInterface::class) ->error($e->getMessage()); } } } } /** * Marks the job as complete */ protected function completeJob() { $this->isComplete = true; $this->currentStep = $this->totalSteps; $newsletter = $this->getObject('Newsletter'); if ($newsletter) { $newsletter->Status = 'Sent'; $newsletter->extend('onCompleteJob'); $newsletter->write(); } } } |