Отправка рассылки при добавлении новости

Осуществляем на сайте рассылку не по расписанию, а сразу при добавлении новой записи/новости.

Добавляем следующий код в init.php (расположение /bitrix/php_interface/ либо папка /local/php_interface):

AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("subscribe_news", "OnAfterIBlockElementAddHandler"));
class subscribe_news {     function OnAfterIBlockElementAddHandler(&$arFields){         # подключаем модули         CModule::IncludeModule('iblock'); // подключаем инфоблоки         CModule::IncludeModule('subscribe'); // подключаем рассылку
        if ($arFields["IBLOCK_ID"] == 27) { //сравниваем ИД инфоблока, если совпадает, то             # Данные для письма             $FROM_FIELD = "hello@site.ru"; // Почта отправителя             $SUBJECT = "Новости | ".$arFields["NAME"] ; // Тема письма             $BODY = '             <table cellpadding="1" cellspacing="1"> <tbody> <tr>    <td>        &nbsp;<img alt="logo_news.jpg" width="240" height="64" src="https://site.ru/upload/medialibrary/573/ru7b124tmbovv8sghrbazc0iq2ba9c8g/logo_news.jpg" title="logo_news.jpg">    </td>    <td>        &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<b>       <h3 style="font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Новостная рассылка</h3> </b>    </td> </tr> <tr>    <td colspan="2">        &nbsp; &nbsp;<br>        <strong>'.$date.'</strong><h3>'.$arFields["NAME"].'</h3><br />'.$arFields["DETAIL_TEXT"].'<br/>    </td> </tr> <tr>    <td> <a href="/news/">Перейти в новости на сайте</a><br>       <h3 style="font-size: 12pt;">С уважением, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</h3>       <h3 style="font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ООО «site»</h3>        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="https://site.ru/auth/subscr_edit.php?ID=#ID#&CONFIRM_CODE=#CONFIRM_CODE#&action=unsubscribe" style="text-decoration: none;font-size: 12pt;"><span style="color: #d7d7d7;">Отписаться от рассылки</span></a>    </td>    <td>        &nbsp;    </td> </tr> </tbody> </table>'; // Тело письма             $RUB_ID = 2; // ID списка рассылки             $STATUS = "Y";             $BODY_TYPE = "html"; // html или test. Я в теле письма использую теги, поэтому html             $DIRECT_SEND = "N";             $CHARSET = "UTF-8"; // Кодировка
            # Формирование письма             $posting = new CPosting;             $arFields = Array(                 "FROM_FIELD" => $FROM_FIELD, // Поле письма "От кого"                 "SUBJECT" => $SUBJECT, // Поле письма "Тема"                 "BODY_TYPE" => ($BODY_TYPE <> "html"? "text":"html"), // Тип текста письма ("text"/"html")                 "BODY" => $BODY, // Текст письма                 "DIRECT_SEND" => ($DIRECT_SEND <> "Y"? "Y":"N"), // Отправлять персонально каждому подписчику ("Y"/"N").                 "CHARSET" => $CHARSET, // Кодировка, указываемая в заголовке письма                 "RUB_ID" => /* 2, */ array($RUB_ID), // массив идентификаторов рассылок                 "STATUS" => "D"             );
            $ID = $posting->Add($arFields);             if($ID){                 $posting->ChangeStatus($ID, "P");                 $posting->AutoSend($ID);             }             if($ID == false)                 echo $posting->LAST_ERROR;             $ErrorPost = $posting->LAST_ERROR;         }     } }

В данном коде происходит проверка, добавлена ли новая запись в интересующем нас инфоблоке. В случае, если это так, письмо с содержимым новости рассылается подписчикам. Также в теле письма есть ссылка для отписки. Чтобы она формировалась верно, там же в init надо добавить следующий скрипт:

AddEventHandler("subscribe", "BeforePostingSendMail", array("SubscribeHandlers", "BeforePostingSendMailHandler"));
class SubscribeHandlers
{
    function BeforePostingSendMailHandler($arFields)
    {
        CModule::IncludeModule('subscribe'); // подключаем рассылку
        $rsSub = CSubscription::GetByEmail($arFields["EMAIL"]);
        $arSub = $rsSub->Fetch();
        $arFields["BODY"] = str_replace("#ID#", $arSub["ID"], $arFields["BODY"]);
        $arFields["BODY"] = str_replace("#CONFIRM_CODE#", SubscribeHandlers::GetMailHash($arFields["EMAIL"]), $arFields["BODY"]);
        return $arFields;
    }
    function GetMailHash($email)
    {
        return md5(md5($email) . MAIL_SALT);
    }
}

В результате каждый пользователь получит в рассылке возможность отписаться от нее.


bitrixone © 2024