20 декабря 2011 г.

Интересные моменты настройки почтовой рассылки Битрикс

... Или как добавить ссылку на отписку от рассылки в письме

Если посмотреть шире на проблему, то можно задаться вопросом, как можно добавить параметры вида #param# в отсылаемые подписчикам почтовые сообщения. Так же как это делается в шаблонах почтовых сообщениях. Таким образом, в отсылаемое письмо мы сможем разместить не только ссылку на отписку от рассылки, которая для каждого подписчика должна быть уникальной, но и добавить другие параметры:
  • Имя, фамилию, отчество;
  • Код подтверждения подписчика;
  • Id подписчика;
  • и др. параметры.
В документации Битрикса я нашел страницу c описанием необходимого функционала http://dev.1c-bitrix.ru/user_help/service/subscribe/rubric_edit.php?print=Y .

В принципе в нем описан все необходимые действия, но я приведу свой пример реализации.
В файле /bitrix/php_interface/init.php храняться обработччики выполняющихся событий.
В этот файл необходимо добавить следующий код:
Copy Source | Copy HTML
  1. // регистрируем обработчик 
  2. AddEventHandler("subscribe", "BeforePostingSendMail", Array("CatchSubscriter", "beforePostingSendMailHandler"));
  3. class CatchSubscriter{
  4.     // создаем обработчик события "BeforePostingSendMail" 
  5.     function beforePostingSendMailHandler(&$arFields){
  6.         //$USER_NAME = "Подписчик"; 
  7.         //Попробуем найти подписчика. 
  8.         $rs = CSubscription::GetByEmail($arFields["EMAIL"]);
  9.         if($ar = $rs->Fetch()){
  10.             //echo "<p>[</p>";
  11.             //print_r($ar);
  12.             //echo "<p>]</p>";
  13.             $arFields["BODY"] = str_replace("#CONFIRM_CODE#", $ar["CONFIRM_CODE"], $arFields["BODY"]);
  14.             $arFields["BODY"] = str_replace("#ID#", $ar["ID"], $arFields["BODY"]);
  15.             $arFields["BODY"] = str_replace("#EMAIL#", $ar["EMAIL"], $arFields["BODY"]);
  16.         }
  17.         //$arFields["BODY"] = str_replace("#NAME#", $USER_NAME, $arFields["BODY"]); 
  18.         return $arFields;
  19.     }
  20. }
Здесь в функции AddEventHandler("subscribe", "BeforePostingSendMail", Array("CatchSubscriter", "beforePostingSendMailHandler"));
Первый аргумент — название  используемого модуля подписки и рассылок.
Второй аргумент — название события.
Третий аргумент — массив с параметрами обработчика события.

Так при возникновении события BeforePostingSendMail т. е перед самой отправкой письма извлекаются почтовый адрес и текст письма из переменной $arFields. Зная email на который отправляется письмо — устанавливаем личность получателя, его ID и т. п. Текст письма проверяем на наличие ключей заданного формата (#EMAIL#, #ID#), и тут же их подменяем на нужные значения. Не трудно догадаться, что стандартный письмо рассылки можно расширить и другими парметрами.

Чтобы проверить работу можно отправить рассылку с следующим содержанием:
Copy Source | Copy HTML
  1. <p>email: #EMAIL#</p>
  2. <p>id: #ID#</p>
  3. <p>confirm code: #CONFIRM_CODE#"</p>
  4. <a href="http://www.tetrapolis.ru/service/edit_subscribe.php?ID=#ID#&CONFIRM_CODE=#CONFIRM_CODE#">Сменить адрес подписки</a>
  5. <a href="http://www.tetrapolis.ru/service/edit_subscribe.php?ID=#ID#&CONFIRM_CODE=#CONFIRM_CODE#&action=unsubscribe">Отписаться</a>
Ссылки должны вести на страницу с компонентом редактирования рассылки.
Если Вас заинтересовал метод Csubscription::GetByEmail() то у меня есть пример на работу с ним:
Copy Source | Copy HTML
  1. <?
  2. if(CModule::IncludeModule("subscribe")){
  3.     class CatchSubscriter {
  4.         // создаем обработчик события "BeforePostingSendMail" 
  5.         function BeforePostingSendMailHandler(&$arFields){
  6.             //Попробуем найти подписчика. 
  7.             $rs = CSubscription::GetByEmail($arFields["EMAIL"]);
  8.             if($ar = $rs->Fetch()){
  9.                 echo "<p>[</p>";
  10.                 print_r($ar);// посмотрим какие еще параметры можно получить
  11.                 echo "<p>]</p>";
  12.                 $arFields["BODY"] = str_replace("#CONFIRM_CODE#", $ar["CONFIRM_CODE"], $arFields["BODY"]);
  13.                 $arFields["BODY"] = str_replace("#ID#", $ar["ID"], $arFields["BODY"]);
  14.                 $arFields["BODY"] = str_replace("#EMAIL#", $ar["EMAIL"], $arFields["BODY"]);
  15.             }
  16.             return $arFields;
  17.         }
  18.     }
  19.     $cs1= new CatchSubscriter();
  20.     $ar=array("EMAIL" => "vklad@tetrapolis.spb.ru", "BODY" => " body ");
  21.     $rez=$cs1->BeforePostingSendMailHandler($ar);
  22.     print_r($rez);
  23. }else{
  24.     echo "nothing to load";
  25. }
  26. ?>

2 комментария:

  1. Я бы ещё хотел порекомендовать такой вот хороший сервис http://StandartSend.ru По массовой рассылке писем, пользуюсь им довольно часто и нареканий пока что нет, так что советую.

    ОтветитьУдалить
    Ответы
    1. Методы работы с рекламой, ее применения и варьирования, могут вызвать множество споров, но почему то никто не возражает когда поработав с http://StandartMedia.ru на сайт прет целевой трафик и растут продажи.

      Удалить