Создание сайтов на 1С-Битрикс

Доотправка рассылок в Битрикс по крону

Если хостинг не разрешает отправлять писем больше 1000 в час и рассылки остаются со статусом «Е» — «Отправлено с ошибками»

Следующий код получает список выпусков за последний день и если есть выпуски с ошибками (статус «Е») - то повторяет отправку для ошибочных адресов.

1. Создаём в корневой папке сайта папку с названием «dev» и помещаем туда файл reposting.php. Ниже код файла, также можно скачать файл в конце статьи.

<?php
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/..");
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
define('BX_NO_ACCELERATOR_RESET', true);
define('CHK_EVENT', true);
define('BX_WITH_ON_AFTER_EPILOG', true);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

// записывает все что передадут в /_log_array.log 
if(!function_exists('log_error')) {
   function log_error() { 
      $arArgs = func_get_args(); 
      $sResult = ''; 

       $sResult = date(DATE_RFC822) . "\n";

      foreach($arArgs as $arArg) { 
         $sResult .= print_r($arArg, true) . "\n\n";
      } 

      file_put_contents(__DIR__ . '/../dev/_errors.log', $sResult . PHP_EOL, FILE_APPEND);
   }
}

if(CModule::IncludeModule('subscribe'))
{
    $cPosting = new CPosting;

    // 86400 - один день (кол-во секунд)
    // Получаем дату минус день
    $fromDate = date('d.m.Y', time() - 86400);

    // Поиск по рассылкам со статусом "Е" - Отправлено с ошибками
    $arFilter = Array(
        "STATUS" => "E",
        "DATE_SENT_1" => $fromDate
    );
    $arSort = Array(
        "STATUS"=>"ASC",
        "DATE_SENT"=>"DESC"
    );
    $rsPosting = $cPosting->GetList($arSort, $arFilter, Array());
    $strError .= $cPosting->LAST_ERROR;
    if($post = $rsPosting->Fetch())
    {
        if($post['ID']) {
            // Переводим рассылку в статус "P" (Частично отправлена)
            if($cPosting->ChangeStatus($post['ID'], "P")) {
                // Отправка максимум 1000 писем
                $res = $cPosting->SendMessage($post['ID'], COption::GetOptionString("subscribe", "posting_interval"), 1000);
                $strError .= $cPosting->LAST_ERROR;
            }
        }
    }
    // Если есть ошибки - выводим в лог
    if($strError) {
        log_error($strError);
    }
}

2. Проверяем права на доступ к папке и файлу

3. Запускаем файл вручную (в адресной строке набираем ваш_сайт/dev/reposting.php) и проверяем папку «dev» — если в папке будет файл _errors.log, то в нём можно прочитать про ошибки.

3. В кроне создаём задачу на ежедневный запуск файла

Скачать:

reposting.zip (1.18 КБ)
Логотип SiteBERG
Изменено: 27.08.2024 17:18

Статьи

Что нужно сделать?