settings = $settings; parent::__construct(); } function init() { if (!$this->api) { $this->api = new API($this->settings->get(Mailer::MAILER_CONFIG_SETTING_NAME)['mailpoet_api_key']); } } function checkProcessingRequirements() { return Bridge::isMPSendingServiceEnabled(); } function prepareTaskStrategy(ScheduledTask $task, $timer) { BounceTask::prepareSubscribers($task); if (!ScheduledTaskSubscriber::getUnprocessedCount($task->id)) { ScheduledTaskSubscriber::where('task_id', $task->id)->deleteMany(); return false; } return true; } function processTaskStrategy(ScheduledTask $task, $timer) { $subscriber_batches = new BatchIterator($task->id, self::BATCH_SIZE); if (count($subscriber_batches) === 0) { ScheduledTaskSubscriber::where('task_id', $task->id)->deleteMany(); return true; // mark completed } $task_subscribers = new TaskSubscribers($task); foreach ($subscriber_batches as $subscribers_to_process_ids) { // abort if execution limit is reached $this->cron_helper->enforceExecutionLimit($timer); $subscriber_emails = Subscriber::select('email') ->whereIn('id', $subscribers_to_process_ids) ->whereNull('deleted_at') ->findArray(); $subscriber_emails = array_column($subscriber_emails, 'email'); $this->processEmails($subscriber_emails); $task_subscribers->updateProcessedSubscribers($subscribers_to_process_ids); } return true; } function processEmails(array $subscriber_emails) { $checked_emails = $this->api->checkBounces($subscriber_emails); $this->processApiResponse((array)$checked_emails); } function processApiResponse(array $checked_emails) { foreach ($checked_emails as $email) { if (!isset($email['address'], $email['bounce'])) { continue; } if ($email['bounce'] === self::BOUNCED_HARD) { $subscriber = Subscriber::findOne($email['address']); $subscriber->status = Subscriber::STATUS_BOUNCED; $subscriber->save(); } } } }