Осуществляем на сайте рассылку не по расписанию, а сразу при добавлении новой записи/новости.
Добавляем следующий код в 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> <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> <b> <h3 style="font-size: 12pt;"> Новостная рассылка</h3> </b> </td> </tr> <tr> <td colspan="2"> <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;">С уважением, </h3> <h3 style="font-size: 12pt;"> ООО «site»</h3> <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> </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); } }
В результате каждый пользователь получит в рассылке возможность отписаться от нее.