Осуществляем на сайте рассылку не по расписанию, а сразу при добавлении новой записи/новости.
Добавляем следующий код в 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);
}
}
В результате каждый пользователь получит в рассылке возможность отписаться от нее.