... Или как добавить ссылку на отписку от рассылки в письме
Если посмотреть шире на проблему, то можно задаться вопросом, как можно добавить параметры вида #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
// регистрируем обработчик
- AddEventHandler("subscribe", "BeforePostingSendMail", Array("CatchSubscriter", "beforePostingSendMailHandler"));
- class CatchSubscriter{
- // создаем обработчик события "BeforePostingSendMail"
- function beforePostingSendMailHandler(&$arFields){
- //$USER_NAME = "Подписчик";
- //Попробуем найти подписчика.
- $rs = CSubscription::GetByEmail($arFields["EMAIL"]);
- if($ar = $rs->Fetch()){
- //echo "<p>[</p>";
- //print_r($ar);
- //echo "<p>]</p>";
- $arFields["BODY"] = str_replace("#CONFIRM_CODE#", $ar["CONFIRM_CODE"], $arFields["BODY"]);
- $arFields["BODY"] = str_replace("#ID#", $ar["ID"], $arFields["BODY"]);
- $arFields["BODY"] = str_replace("#EMAIL#", $ar["EMAIL"], $arFields["BODY"]);
- }
- //$arFields["BODY"] = str_replace("#NAME#", $USER_NAME, $arFields["BODY"]);
- return $arFields;
- }
- }
Здесь в функции AddEventHandler("subscribe", "BeforePostingSendMail", Array("CatchSubscriter", "beforePostingSendMailHandler"));
Первый аргумент — название используемого модуля подписки и рассылок.
Второй аргумент — название события.
Третий аргумент — массив с параметрами обработчика события.
Так при возникновении события BeforePostingSendMail т. е перед самой отправкой письма извлекаются почтовый адрес и текст письма из переменной $arFields. Зная email на который отправляется письмо — устанавливаем личность получателя, его ID и т. п. Текст письма проверяем на наличие ключей заданного формата (#EMAIL#, #ID#), и тут же их подменяем на нужные значения. Не трудно догадаться, что стандартный письмо рассылки можно расширить и другими парметрами.
Чтобы проверить работу можно отправить рассылку с следующим содержанием:
Copy Source | Copy HTML
<p>email: #EMAIL#</p>
- <p>id: #ID#</p>
- <p>confirm code: #CONFIRM_CODE#"</p>
- <a href="http://www.tetrapolis.ru/service/edit_subscribe.php?ID=#ID#&CONFIRM_CODE=#CONFIRM_CODE#">Сменить адрес подписки</a>
- <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
<?
- if(CModule::IncludeModule("subscribe")){
- class CatchSubscriter {
- // создаем обработчик события "BeforePostingSendMail"
- function BeforePostingSendMailHandler(&$arFields){
- //Попробуем найти подписчика.
- $rs = CSubscription::GetByEmail($arFields["EMAIL"]);
- if($ar = $rs->Fetch()){
- echo "<p>[</p>";
- print_r($ar);// посмотрим какие еще параметры можно получить
- echo "<p>]</p>";
- $arFields["BODY"] = str_replace("#CONFIRM_CODE#", $ar["CONFIRM_CODE"], $arFields["BODY"]);
- $arFields["BODY"] = str_replace("#ID#", $ar["ID"], $arFields["BODY"]);
- $arFields["BODY"] = str_replace("#EMAIL#", $ar["EMAIL"], $arFields["BODY"]);
- }
- return $arFields;
- }
- }
- $cs1= new CatchSubscriter();
- $ar=array("EMAIL" => "vklad@tetrapolis.spb.ru", "BODY" => " body ");
- $rez=$cs1->BeforePostingSendMailHandler($ar);
- print_r($rez);
- }else{
- echo "nothing to load";
- }
- ?>