Exemplo n.º 1
0
 /**
  * @param $postingId
  * @param bool $checkDuplicate
  * @return bool
  * @throws \Bitrix\Main\ArgumentException
  */
 public static function initGroupRecipients($postingId, $checkDuplicate = true)
 {
     $posting = \Bitrix\Sender\PostingTable::getRowById(array('ID' => $postingId));
     if (!$posting) {
         return false;
     }
     $checkRecipientDuplicate = $checkDuplicate;
     if (!$checkDuplicate) {
         if ($posting['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
     $emailNotSendList = array();
     $unSubEmailDb = \Bitrix\Sender\MailingSubscriptionTable::getUnSubscriptionList(array('select' => array('EMAIL' => 'CONTACT.EMAIL'), 'filter' => array('=MAILING_ID' => $posting['MAILING_ID'])));
     while ($unSubEmail = $unSubEmailDb->fetch()) {
         $emailNotSendList[] = $unSubEmail['EMAIL'];
     }
     $groupConnectorsDataCount = array();
     $connection = \Bitrix\Main\Application::getConnection();
     $conHelper = $connection->getSqlHelper();
     $statusRecipientNone = \Bitrix\Sender\PostingRecipientTable::SEND_RESULT_NONE;
     // fetch all connectors for getting emails
     $groupConnectorList = array();
     $groupConnectorDb = \Bitrix\Sender\MailingGroupTable::getList(array('select' => array('INCLUDE', 'CONNECTOR_ENDPOINT' => 'GROUP.GROUP_CONNECTOR.ENDPOINT', 'GROUP_ID'), 'filter' => array('MAILING_ID' => $posting['MAILING_ID']), 'order' => array('INCLUDE' => 'DESC', 'GROUP_ID' => 'ASC')));
     while ($group = $groupConnectorDb->fetch()) {
         $groupConnectorList[] = $group;
     }
     $groupConnectorList[] = array('INCLUDE' => true, 'CONNECTOR_ENDPOINT' => array('FIELDS' => array('MAILING_ID' => $posting['MAILING_ID'])), 'GROUP_ID' => null, 'CONNECTOR' => new \Bitrix\Sender\SenderConnectorSubscriber());
     foreach ($groupConnectorList as $group) {
         $connector = null;
         if (isset($group['CONNECTOR']) && is_object($group['CONNECTOR'])) {
             $connector = $group['CONNECTOR'];
         } elseif (is_array($group['CONNECTOR_ENDPOINT'])) {
             $connector = \Bitrix\Sender\ConnectorManager::getConnector($group['CONNECTOR_ENDPOINT']);
         }
         if (!$connector) {
             continue;
         }
         $connectorDataCount = 0;
         $connector->setFieldValues($group['CONNECTOR_ENDPOINT']['FIELDS']);
         $connectorDataDb = $connector->getResult();
         while (true) {
             $emailList = array();
             $connectorDataList = array();
             $maxPart = 200;
             while ($connectorData = $connectorDataDb->fetch()) {
                 // collect connectors counter of addresses
                 $connectorDataCount++;
                 // exclude unsubscribed addresses
                 $connectorData['EMAIL'] = trim(strtolower($connectorData['EMAIL']));
                 if (strlen($connectorData['EMAIL']) <= 0 || in_array($connectorData['EMAIL'], $emailNotSendList)) {
                     continue;
                 }
                 $emailList[] = $connectorData['EMAIL'];
                 $connectorDataList[$connectorData['EMAIL']] = $connectorData;
                 $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)) {
                     $insertDataList = array();
                     $insertColumnNamesString = array();
                     foreach ($connectorDataList as $email => $connectorData) {
                         $recipientInsert = array('NAME' => "'" . $conHelper->forSql($connectorData['NAME']) . "'", 'EMAIL' => "'" . $conHelper->forSql($connectorData['EMAIL']) . "'", 'STATUS' => "'" . $statusRecipientNone . "'", 'POSTING_ID' => intval($postingId), 'USER_ID' => "NULL", 'FIELDS' => "NULL");
                         if (array_key_exists('USER_ID', $connectorData) && intval($connectorData['USER_ID']) > 0) {
                             $recipientInsert['USER_ID'] = intval($connectorData['USER_ID']);
                         }
                         if (array_key_exists('FIELDS', $connectorData) && count($connectorData['FIELDS']) > 0) {
                             $recipientInsert['FIELDS'] = "'" . $conHelper->forSql(serialize($connectorData['FIELDS'])) . "'";
                         }
                         $insertColumnNamesString = implode(", ", array_keys($recipientInsert));
                         $insertColumnValuesString = implode(", ", array_values($recipientInsert));
                         $insertDataList[] = $insertColumnValuesString;
                     }
                     if ($insertDataList && $insertColumnNamesString) {
                         $insertDataListString = implode('),(', $insertDataList);
                         $connection->query("insert into b_sender_posting_recipient(" . $insertColumnNamesString . ") values(" . $insertDataListString . ")");
                     }
                 }
             } 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 (!empty($group['GROUP_ID'])) {
             if (array_key_exists($group['GROUP_ID'], $groupConnectorsDataCount)) {
                 $groupConnectorsDataCount[$group['GROUP_ID']] += $connectorDataCount;
             } else {
                 $groupConnectorsDataCount[$group['GROUP_ID']] = $connectorDataCount;
             }
         }
         unset($connector);
     }
     // update group counter of addresses
     foreach ($groupConnectorsDataCount as $groupId => $groupDataCount) {
         \Bitrix\Sender\GroupTable::update($groupId, array('ADDRESS_COUNT' => $groupDataCount));
     }
     return true;
 }
Exemplo n.º 2
0
 /**
  * Return true if email address was unsubscribed
  *
  * @param int $mailingId
  * @param string $email
  * @return bool
  */
 public static function isUnsubscibed($mailingId, $email)
 {
     $email = strtolower($email);
     $unSubDb = MailingSubscriptionTable::getUnSubscriptionList(array('select' => array('MAILING_ID'), 'filter' => array('=MAILING_ID' => $mailingId, '=CONTACT.EMAIL' => $email)));
     if ($unSubDb->fetch()) {
         return true;
     }
     return false;
 }