/** * @param Entity\Event $event * @return Entity\EventResult * @throws \Bitrix\Main\ArgumentException */ public static function onDelete(Entity\Event $event) { $result = new Entity\EventResult(); $data = $event->getParameters(); $arId = array(); if (array_key_exists('ID', $data['primary'])) { $arId[] = $data['primary']['ID']; } else { $arFilter = array(); foreach ($data['primary'] as $primKey => $primVal) { $arFilter[$primKey] = $primVal; } $tableDataList = static::getList(array('select' => array('ID'), 'filter' => $arFilter)); while ($tableData = $tableDataList->fetch()) { $arId[] = $tableData['ID']; } } foreach ($arId as $primaryId) { $primary = array('POSTING_ID' => $primaryId); PostingReadTable::delete($primary); PostingClickTable::delete($primary); PostingUnsubTable::delete($primary); PostingRecipientTable::delete($primary); } return $result; }
/** * @param $postingId * @param bool $checkDuplicate * @return bool * @throws \Bitrix\Main\ArgumentException */ public static function initGroupRecipients($postingId, $checkDuplicate = false) { $arPosting = \Bitrix\Sender\PostingTable::getRowById(array('ID' => $postingId)); if (!$arPosting) { return false; } $checkRecipientDuplicate = $checkDuplicate; if (!$checkDuplicate) { if ($arPosting['STATUS'] == \Bitrix\Sender\PostingTable::STATUS_NEW) { $primary = array('POSTING_ID' => $postingId); \Bitrix\Sender\PostingRecipientTable::delete($primary); $checkRecipientDuplicate = false; } } // fetch all unsubscribed emails of current mailing for excluding from recipients $arEmailNotSend = array(); $recipientUnsubDb = \Bitrix\Sender\PostingUnsubTable::getList(array('select' => array('EMAIL' => 'POSTING_RECIPIENT.EMAIL'), 'filter' => array('POSTING.MAILING_ID' => $arPosting['MAILING_ID']))); while ($recipientUnsub = $recipientUnsubDb->fetch()) { $arEmailNotSend[] = $recipientUnsub['EMAIL']; } $groupConnectorsDataCount = array(); $connection = \Bitrix\Main\Application::getConnection(); $conHelper = $connection->getSqlHelper(); $statusRecipientNone = \Bitrix\Sender\PostingRecipientTable::SEND_RESULT_NONE; // fetch all connectors for getting emails $groupDb = \Bitrix\Sender\MailingGroupTable::getList(array('select' => array('INCLUDE', 'CONNECTOR_ENDPOINT' => 'GROUP.GROUP_CONNECTOR.ENDPOINT', 'GROUP_ID'), 'filter' => array('MAILING_ID' => $arPosting['MAILING_ID']), 'order' => array('INCLUDE' => 'DESC', 'GROUP_ID' => 'ASC'))); while ($group = $groupDb->fetch()) { $connector = \Bitrix\Sender\ConnectorManager::getConnector($group['CONNECTOR_ENDPOINT']); if (!$connector) { continue; } $connectorDataCount = 0; $connector->setFieldValues($group['CONNECTOR_ENDPOINT']['FIELDS']); $connectorDataDb = $connector->getData(); while (true) { $emailList = array(); $connectorDataList = array(); $maxPart = 200; while ($arConnectorData = $connectorDataDb->Fetch()) { // collect connectors counter of addresses $connectorDataCount++; // exclude unsubscribed addresses $arConnectorData['EMAIL'] = trim(strtolower($arConnectorData['EMAIL'])); if (strlen($arConnectorData['EMAIL']) <= 0 || in_array($arConnectorData['EMAIL'], $arEmailNotSend)) { continue; } $emailList[] = $arConnectorData['EMAIL']; $connectorDataList[$arConnectorData['EMAIL']] = $arConnectorData; $maxPart--; if ($maxPart == 0) { break; } } if (empty($emailList)) { break; } foreach ($emailList as &$email) { $email = $conHelper->forSql($email); } $emailListString = "'" . implode("', '", $emailList) . "'"; if ($group['INCLUDE']) { // add address if not exists if ($checkRecipientDuplicate) { $recipientEmailDb = $connection->query("select EMAIL from b_sender_posting_recipient where EMAIL in (" . $emailListString . ") and POSTING_ID=" . intval($postingId)); while ($recipientEmail = $recipientEmailDb->fetch()) { unset($connectorDataList[$recipientEmail['EMAIL']]); } } if (!empty($connectorDataList)) { foreach ($connectorDataList as $email => $arConnectorData) { $arRecipient = array('NAME' => "'" . $conHelper->forSql($arConnectorData['NAME']) . "'", 'EMAIL' => "'" . $conHelper->forSql($arConnectorData['EMAIL']) . "'", 'STATUS' => "'" . $statusRecipientNone . "'", 'POSTING_ID' => intval($postingId)); if (array_key_exists('USER_ID', $arConnectorData) && intval($arConnectorData['USER_ID']) > 0) { $arRecipient['USER_ID'] = intval($arConnectorData['USER_ID']); } $insertColumnNamesString = implode(", ", array_keys($arRecipient)); $insertColumnValuesString = implode(", ", array_values($arRecipient)); $connection->query("insert into b_sender_posting_recipient(" . $insertColumnNamesString . ") values(" . $insertColumnValuesString . ")"); } } } else { // delete address from posting $connection->query("delete from b_sender_posting_recipient where EMAIL in (" . $emailListString . ") and POSTING_ID=" . intval($postingId)); } } //\Bitrix\Sender\GroupConnectorTable::update(array('ID' => $group['GROUP_CONNECTOR_ID']), array('ADDRESS_COUNT' => $connectorDataCount)); // collect groups counter of addresses if (array_key_exists($group['GROUP_ID'], $groupConnectorsDataCount)) { $groupConnectorsDataCount[$group['GROUP_ID']] += $connectorDataCount; } else { $groupConnectorsDataCount[$group['GROUP_ID']] = $connectorDataCount; } } // update group counter of addresses foreach ($groupConnectorsDataCount as $groupId => $groupDataCount) { \Bitrix\Sender\GroupTable::update($groupId, array('ADDRESS_COUNT' => $groupDataCount)); } return true; }
/** * @param $arData * @return bool * @throws \Bitrix\Main\ArgumentException */ public static function unsubscribe($arData) { $result = false; if (isset($arData['TEST']) && $arData['TEST'] == 'Y') { return true; } $arPosting = null; if ($arData['RECIPIENT_ID']) { $postingDb = PostingRecipientTable::getList(array('select' => array('POSTING_ID', 'POSTING_MAILING_ID' => 'POSTING.MAILING_ID'), 'filter' => array('ID' => $arData['RECIPIENT_ID'], 'EMAIL' => $arData['EMAIL']))); $arPosting = $postingDb->fetch(); } $mailingDb = MailingTable::getList(array('select' => array('ID'), 'filter' => array('ID' => $arData['UNSUBSCRIBE_LIST']))); while ($mailing = $mailingDb->fetch()) { $unsub = null; if ($arPosting && $arPosting['POSTING_MAILING_ID'] == $mailing['ID']) { $unsub = array('POSTING_ID' => $arPosting['POSTING_ID'], 'RECIPIENT_ID' => $arData['RECIPIENT_ID']); } else { $mailingPostingDb = PostingRecipientTable::getList(array('select' => array('RECIPIENT_ID' => 'ID', 'POSTING_ID'), 'filter' => array('=POSTING.MAILING_ID' => $mailing['ID'], 'EMAIL' => $arData['EMAIL']))); if ($arMailingPosting = $mailingPostingDb->fetch()) { $unsub = $arMailingPosting; } } if (!empty($unsub)) { $unsubExists = PostingUnsubTable::getRowById($unsub); if (!$unsubExists) { PostingUnsubTable::add($unsub); } $result = true; } $contactDb = ContactTable::getList(array('select' => array('ID'), 'filter' => array('=EMAIL' => $arData['EMAIL']))); while ($contact = $contactDb->fetch()) { MailingSubscriptionTable::delete(array('MAILING_ID' => $mailing['ID'], 'CONTACT_ID' => $contact['ID'])); $result = true; } } return $result; }
/** * @param int $mailingId * @param string $email * @return bool * //is email address was unsubscribed */ public static function isUnsubscibed($mailingId, $email) { $email = strtolower($email); $recipientUnsubDb = PostingUnsubTable::getList(array( 'select' => array('ID'), 'filter' => array( '=POSTING.MAILING_ID' => $mailingId, '=POSTING_RECIPIENT.EMAIL' => $email ) )); if($recipientUnsubDb->fetch()) { return true; } return false; }
/** * Unsubscribe email from mailing * * @param array $data * @return bool * @throws \Bitrix\Main\ArgumentException */ public static function unsubscribe($data) { $result = false; if (isset($data['TEST']) && $data['TEST'] == 'Y') { return true; } $posting = null; if ($data['RECIPIENT_ID']) { $postingDb = PostingRecipientTable::getList(array('select' => array('POSTING_ID', 'POSTING_MAILING_ID' => 'POSTING.MAILING_ID'), 'filter' => array('ID' => $data['RECIPIENT_ID'], 'EMAIL' => $data['EMAIL']))); $posting = $postingDb->fetch(); } $mailingDb = MailingTable::getList(array('select' => array('ID'), 'filter' => array('ID' => $data['UNSUBSCRIBE_LIST']))); while ($mailing = $mailingDb->fetch()) { $unsub = null; if ($posting && $posting['POSTING_MAILING_ID'] == $mailing['ID']) { $unsub = array('POSTING_ID' => $posting['POSTING_ID'], 'RECIPIENT_ID' => $data['RECIPIENT_ID']); } else { $mailingPostingDb = PostingRecipientTable::getList(array('select' => array('RECIPIENT_ID' => 'ID', 'POSTING_ID'), 'filter' => array('=POSTING.MAILING_ID' => $mailing['ID'], 'EMAIL' => $data['EMAIL']))); if ($mailingPosting = $mailingPostingDb->fetch()) { $unsub = $mailingPosting; } } // add mark in statistic if there is no previous mark if (!empty($unsub)) { $unsubExists = PostingUnsubTable::getRowById($unsub); if (!$unsubExists) { $unsubResult = PostingUnsubTable::add($unsub); if ($unsubResult->isSuccess()) { $eventData = array('MAILING_ID' => $mailing['ID'], 'RECIPIENT_ID' => $unsub['RECIPIENT_ID'], 'EMAIL' => $data['EMAIL']); $event = new \Bitrix\Main\Event('sender', 'OnAfterRecipientUnsub', array($eventData)); $event->send(); } } $result = true; } // add row to unsubscribe list $contactId = ContactTable::addIfNotExist(array('EMAIL' => $data['EMAIL'])); if ($contactId) { MailingSubscriptionTable::addUnSubscription(array('MAILING_ID' => $mailing['ID'], 'CONTACT_ID' => $contactId)); $result = true; } } return $result; }
public static function updateMailingSubscription() { // get list of all subscribers and unsubscribers $existedSubList = array(); $existedSubDb = \Bitrix\Sender\MailingSubscriptionTable::getList(array('select' => array('EMAIL' => 'CONTACT.EMAIL', 'MAILING_ID'))); while ($existedSub = $existedSubDb->fetch()) { $existedSubList[$existedSub['EMAIL']][] = $existedSub['MAILING_ID']; } // get list of all unsubscribers $dataDb = \Bitrix\Sender\PostingUnsubTable::getList(array('select' => array('EMAIL' => 'UPDATE_RECIPIENT.EMAIL', 'MAILING_ID' => 'UPDATE_POSTING.MAILING_ID'), 'filter' => array(), 'runtime' => array(new \Bitrix\Main\Entity\ReferenceField('UPDATE_RECIPIENT', 'Bitrix\\Sender\\PostingRecipientTable', array('=this.RECIPIENT_ID' => 'ref.ID'), array('join_type' => 'INNER')), new \Bitrix\Main\Entity\ReferenceField('UPDATE_POSTING', 'Bitrix\\Sender\\PostingTable', array('=this.POSTING_ID' => 'ref.ID'), array('join_type' => 'INNER'))), 'order' => array('ID' => 'ASC'))); while ($data = $dataDb->fetch()) { if (self::isTimeUp()) { return true; } if (isset($existedSubList[$data['EMAIL']]) && in_array($data['MAILING_ID'], $existedSubList[$data['EMAIL']])) { continue; } $contactId = \Bitrix\Sender\ContactTable::addIfNotExist(array('EMAIL' => $data['EMAIL'])); $primary = array('MAILING_ID' => $data['MAILING_ID'], 'CONTACT_ID' => $contactId); $fields = array('IS_UNSUB' => 'Y'); $row = \Bitrix\Sender\MailingSubscriptionTable::getRowById($primary); if (!$row) { $result = \Bitrix\Sender\MailingSubscriptionTable::add($fields + $primary); $result->isSuccess(); } } return false; }