示例#1
0
 /**
  * @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;
 }
示例#2
0
 /**
  * @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;
 }
示例#3
0
 /**
  * @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;
 }
示例#4
0
	/**
	 * @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;
	}
示例#5
0
 /**
  * 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;
 }
示例#6
0
 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;
 }