E-mail рассылка по свойству элемента инфоблока

Рассмотрим пример, когда необходимо вручную добавить статью или новость в рассылку модуля E-mail маркетинг с помощью свойства инфоблока в форме редактирования статьи или новости в один клик.

Свойство инфоблока

Добавляем свойство инфоблока типа Список или Простой чекбокс(строка), код именной такой SEND_MAIL, он будет использоваться скриптом.

Форма настроек свойства, тут есть Подсказка + значения списка Y и N  fff

Подсказка: Для рассылки новости подписчикам поставьте флажок и сохраните новость, после сохранения флажок отключается, чтобы не отправилось повторно

После Сохранения свойства оно появится в форме редактирования элемента, в нашем случае Статьи, см. самый первый скрин.

Шаблон рассылки в модуле Email-маркетинг

Тут очень внимательно.

Я создал специально отдельную рассылку, в которую будет подставляться только контент статьи, все остальное предварительно будет настроено, это Компании, Сегменты, Тема письма, Отправитель и т.д., отправить рассылку ставьте Позже вручную. Данная рассылка будет служить шаблоном письма, его можно изменять как захочется в любое время из админки, не надо в код лазить.

Данный шаблон/рассылка в админке не изменяется, а в коде он будет копироваться, тема письма и контент заменятся на данные статьи, т.е. в списке рассылок каждая статья будет добавляться отдельно с заголовком и контентом статьи, ну и рассылаться, по каждой статье отдельно будет статистика по переходам!

Обратите внимание в Теле письма есть макрос #MESSAGE#, вот он и будет заменяться на контент статьи, любой html-шаблон можно сделать.


Тут все, просто сохраняем рассылку, используем ее как шаблон, следим, чтобы никто ее не удалил.

Скрипт создания рассылки в модуле Email-маркетинг

Далее остается отловить событие изменения формы элемента и добавить статью в рассылку, все это сделаем в файле init.php

/bitrix/php_interface/init.php

Пример всего кода, в нем есть закомментированные примеры и доп. возможности, но это вы уже сами играйте как захочется.

<?php
use Bitrix\Main,
Bitrix\Main\Type\DateTime,
Bitrix\Main\Loader;

$eventManager = Main\EventManager::getInstance();

AddEventHandler("iblock", "OnAfterIBlockElementUpdate", array('IblockHandlers', 'OnAfterIBlockElementUpdate'));
class IblockHandlers
{
function OnAfterIBlockElementUpdate(&$arFields){
$useIblock = Loader::includeModule("iblock");
$useSender = Loader::includeModule('sender');

if($useIblock){
$el = new CIBlockElement();
$parser = new CTextParser();

$iblockId = (int)$arFields['IBLOCK_ID'];
$elementId = intval($arFields['ID']);

/******************************************************
* Рассылка: Новости
******************************************************/
$senderIblockId = array(6 => 1, 44 => 1);

if($useSender && array_key_exists($iblockId, $senderIblockId) && $elementId && $iblockId) {

$elementIterator = CIBlockElement::GetList(
array(),
array('IBLOCK_ID' => $iblockId, 'ID' => $elementId, 'ACTIVE' => 'Y'),
false,
array('nTopCount' => 1),
array('ID', 'NAME', 'IBLOCK_ID', 'DETAIL_TEXT', 'DETAIL_PAGE_URL', 'DETAIL_PICTURE', 'PROPERTY_SEND_MAIL')
);

if($arItem = $elementIterator->GetNext(1, 1)) {

if($arItem['PROPERTY_SEND_MAIL_VALUE'] == 'Y') {
$mailingId = ($arItem['LID'] == 's1' ? 1 : 2);
$baseLetter = Bitrix\Sender\Entity\Letter::createInstanceById($mailingId, array('mail'));//sms
$baseConfig = $baseLetter->getMessage()->getConfiguration();
$newLetterId = $baseLetter->copy();

$letter = Bitrix\Sender\Entity\Letter::createInstanceById($newLetterId, array('mail'));//sms
if(is_object($letter) && $letter->getId()) {

//$message = $letter->getMessage();
//$messageFields = $message->getField('data');
//$letter->getData()

$configuration = $letter->getMessage()->getConfiguration();
//$options = $configuration->getArrayOptions();

/*//EMAIL_FROM
$option = $configuration->getOptionByType(Bitrix\Sender\Message\ConfigurationOption::TYPE_EMAIL);
if($option) {
$mailingFields['EMAIL_FROM'] = $option->getValue();
}

//MESSAGE
$option = $configuration->getOptionByType(Bitrix\Sender\Message\ConfigurationOption::TYPE_MAIL_EDITOR);
if($option) {
$mailingFields['MESSAGE'] = $option->getValue();
}

if($arItem['NAME'])
$mailingFields['SUBJECT'] = trim($arItem['~NAME']);
*/


$message = '';

if($arItem['DETAIL_PICTURE']) {
$arFileTmp = CFile::ResizeImageGet($arItem['DETAIL_PICTURE'], array('width' => 250, 'height' => 350), BX_RESIZE_IMAGE_PROPORTIONAL_ALT, true);

if($arFileTmp['src'])
$arFileTmp['src'] = CUtil::GetAdditionalFileURL($arFileTmp['src'], true);

$arPicture = array_change_key_case($arFileTmp, CASE_UPPER);

$message = '<img align="left" style="margin: 0 10px 5px 0; border:0 none;" alt="' . $arItem['NAME'] . '" width="' . $arPicture['WIDTH'] . '" height="' . $arPicture['HEIGHT'] . '" src="' . $arPicture['SRC'] . '" />';
}

$message .= '<h2>' . $arItem['~NAME'] . '</h2>';
$message .= '<p>' . $parser->html_cut($arItem['~DETAIL_TEXT'], 300) . '</p>';
$message .= '<p><a style="text-align: center;white-space: nowrap;padding: 6px 15px;font-size: 16px; font-weight: 700;line-height: 24px;border-radius: 0.25rem;cursor: pointer;color: #fff;background-color: #309429;border-color: #309429;text-decoration: none;" href="' . $arItem['DETAIL_PAGE_URL'] . '">Читать полностью &rarr;</a></p>';
$message .= '<div style="clear:both;"></div>';


//MESSAGE
/*$option = $configuration->getOptionByType(Bitrix\Sender\Message\ConfigurationOption::TYPE_MAIL_EDITOR);
if($option) {
$message = str_replace('#MESSAGE#', $message, $option->getValue());
$option->setValue($message);
}*/

foreach($configuration->getOptions() as $option) {
$code = $option->getCode();
$value = '';
switch($code) //SUBJECT MESSAGE EMAIL_FROM PRIORITY LINK_PARAMS ATTACHMENT TEMPLATE_TYPE TEMPLATE_ID
{
case 'MESSAGE':
$value = str_replace('#MESSAGE#', $message, $baseConfig->getOption($code)->getValue());
break;
case 'SUBJECT':
$value = $arItem['~NAME'];
break;
case 'EMAIL_FROM':
$value = $baseConfig->getOption($code)->getValue();
break;
default:
$value = $baseConfig->getOption($code)->getValue();
}
$option->setValue($value);
}

$result = $configuration->checkOptions();
if($result->isSuccess()) {

$result2 = $letter->getMessage()->saveConfiguration($configuration);
if($result2->isSuccess()) {
$letter->set('MESSAGE_ID', $configuration->getId());
$letter->set('TITLE', $arItem['~NAME']);


/** @var Bitrix\Main\Type\DateTime $sendTime Time */
$sendTime = new Bitrix\Main\Type\DateTime();
$sendTime->add('+ 5 minutes');

/*$method = $letter->getMethod();
if ($method->canChange()){
$code = $method->getCode();
$method->time($sendTime);
$method->apply();
}*/

//$ID = $letter->copy();
//$ID = $letter->save();

/*$instance = $letter::create();
$instance->save();
$ID = $instance->getId();*/

if($letter->save()) {

$letter->getState()->send();

/*\Bitrix\Sender\MailingChainTable::update(
array('ID' => $letter->getId()),
array(
'STATUS' => \Bitrix\Sender\MailingChainTable::STATUS_SEND,
'AUTO_SEND_TIME' => $sendTime,
'TITLE' => $arItem['~NAME'],
)
);*/


//$letter->load($ID);

//Если нужно сбросить свойство "Отправить рассылку"
$el->Update($elementId, array(
'PROPERTY_VALUES' => array('SEND_MAIL' => 'N'),
));

//Отправка сразу
//\Bitrix\Sender\MailingManager::chainSend($mailingChainId);
//$sendErrors = \Bitrix\Sender\MailingManager::getErrors();
}
}
}
}
}
}
}
}
}
}
?>

Комментарии по коду

1) Здесь в ключах задаются инфоблоки, например 6 и 44, в которых будете что-то рассылать, укажите свои.

$senderIblockId = array(6 => 1, 44 => 1);

2) Здесь задается идентификатор рассылки/шаблона, у меня это 1, вы укажите свой, для разных инфоблоков и сайтов можно указывать даже разные шаблоны.

$mailingId = ($arItem['LID'] == 's1' ? 1 : 2);

3) Важные переменные

$baseLetter - это экземпляр исходной рассылки/шаблона #1, он будет копироваться и ниже по коду изменяется уже его копия.

$letter - это экземпляр новой, скопированной рассылки, все изменения происходят уже с копией.

$message - тут какой-то свой произвольный html-формат статьи, например: Заголовок + Краткое описание + Ссылка на статью., она и заменит макрос #MESSAGE#

4) Также в коде есть несколько вариантов изменения конфигураций полей рассылки, как в цикле, так отдельно, сохраняет настройки данная строка в базу в таблицу b_sender_message_field

$result2 = $letter->getMessage()->saveConfiguration($configuration);

5) Это код запускает рассылку после сохранения изменений

$letter->getState()->send();

6) В самоем конце сбрасывается у элемента проставленный нами в форме флажок SEND_MAIL, чтобы при повторном редактировании статьи не отправить ее случайно повторно.

7) Все закомментированные куски кода можете смело удалить, если будут мешать.

8) Образец API редактирования и добавления рассылки смотрите в этом файле 

/bitrix/components/bitrix/sender.letter.edit/class.php

9) Готовый пример работы с API модуля E-mail маркетинг смотрите в этой статье
[D7, sender] API создания рассылки в модуле Email-маркетинг


Обратите внимание!

Скрипт добавит элемент в рассылку только после Изменения элемента, т.е. сначала надо сохранить элемент, отредактировать как положено и только после добавлять в рассылку, по флажку будет видно, если скрипт сработал, статья добавилась в рассылку, тогда флажок снимается.


Имя *
Логин (мин. 3 символа)
E-mail *
*— обязательные для заполнения поля
Логин или e-mail
TUNING-SOFT.RU Разработка умных веб-сервисов