/** * Create new subscriber * @param string $email * @param integer $userId * @param string $userName * @param array $tags * @param array $props */ public static function createSubscriber($email, $userId = 0, $userName = '', $tags = [], $props = []) { $subscriber = new MailtankSubscriber(); $subscriber->email = $email; $subscriber->setProperty('userId', $userId); $subscriber->setProperty('userName', $userName); $subscriber->setProperty('created', time()); $subscriber->tags = $tags; foreach ($props as $k => $v) { $subscriber->setProperty($k, $v); } if (!$subscriber->save()) { throw new MailtankException(MailtankHelper::implodeErrors('; ', $subscriber->getErrors())); } if (!self::createInnerSubscriber($email, $subscriber->id)) { // Подчищаем мейлтанк за собой, иначе там навечно зависнет не привязанный к системе пользователь $subscriber->delete(); return false; } return $subscriber; }
/** * Отправить рассылку в мейлтанк */ private function sendToMailtank($template, $fields, $tags = [], $unsubscribeTags = [], $subscribers = [], $priority = null, $tagsAndReciversUnion = false, $attachments = []) { // NOTE: Т.к. метод приватный и все необходимые проверки сделаны, // предполагаем, что все параметры правильные $fields = MailtankHelper::convertToString($fields); $attributes = ['layout_id' => MailtankHelper::createLayoutId($template, $this->templatePrefix), 'context' => $fields]; if (is_array($attachments) && !empty($attachments)) { $attributes['attachments'] = $attachments; } if (is_array($tags) && !empty($tags)) { $tags = array_values($tags); $attributes['tags'] = $tags; } if (is_array($subscribers) && !empty($subscribers)) { $subscribers = array_values($subscribers); $attributes['subscribers'] = $subscribers; } $mailing = new MailtankMailing(); $mailing->setAttributes($attributes); if (is_array($unsubscribeTags) && !empty($unsubscribeTags)) { $mailing->unsubscribe_tags = $unsubscribeTags; } $mailing->tags_and_receivers_union = $tagsAndReciversUnion; try { $mailing->save(); switch ($mailing->status) { case 'SUCCEEDED': case 'ENQUEUED': return true; } throw new MailtankException(MailtankHelper::implodeErrors('; ', $mailing->getErrors())); } catch (MailtankException $e) { // NOTE: Данный код нужен только для того, чтобы отслеживать недоступность сервиса // При реальной ошибке мы ее не обнаружим, т.к. на этом уровне // нельзя различить недоступность сервиса и ошибку мейлтанка, поэтому Sentry нам в помощь // Отправляем в сентри Yii::error(['msg' => 'Ошибка отправки сообщения в mailtank', 'data' => array_merge(['exceptionMsg' => $e->getMessage()], $mailing->getErrors())]); throw $e; } }