Задача: дать пользователям возможность отписаться от всех рассылок "E-mail маркетинга", не только по ссылке из письма, но и в персональном разделе- по нажатию одной кнопки.

Компонент быстрого отказа от рассылки
Что бы сделать это гибким и не набрасывать код прямо на странице, создадим компонент. Компонент будет без параметров, по этому достаточно простой. Ниже, можно будет скачать уже готовый.
В файле component.php размещаем код.
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
use Bitrix\Main\Loader;
Loader::includeModule('sender');
global $USER;
if ($USER->IsAuthorized()) {
$rsUser = CUser::GetByID($USER->GetID());
$arUser = $rsUser->Fetch();
$subscriptionDb = \Bitrix\Sender\MailingSubscriptionTable::getSubscriptionList(array(
'select' => array('IS_UNSUB'),
'filter' => array(
'=CONTACT.CODE' => $arUser['EMAIL'],
),
));
while (($subscription = $subscriptionDb->fetch())) {
$arResult['USER_IS_UNSUB'] = $subscription['IS_UNSUB'];
}
if ($_POST['UNSUBSCRIBE'] === 'UNSUBSCRIBE') {
$contact_id = \Bitrix\Sender\ContactTable::addIfNotExist(
array(
'EMAIL' => $arUser['EMAIL']
)
);
$contact = new \Bitrix\Sender\Entity\Contact($contact_id);
$subList = $contact->loadData($contact_id);
$subList = $subList['SUB_LIST'];
foreach ($subList as $item) {
$contact->unsubscribe($item);
}
}
} else {
LocalRedirect('/');
}
$this->IncludeComponentTemplate();
Здесь мы получили e-mail текущего, авторизованного пользователя и с помощью \Sender\MailingSubscriptionTable::getSubscriptionList узнали, есть ли у пользователя активные подписки.
Достаточно отобрать по полю IS_UNSUB, у пользователей без подписки или с неподтвержденной подпиской, весь результат будет пустым. Из этого поля создали $arResult['USER_IS_UNSUB']
Далее получаем все подписки пользоватея зная его E-MAIL и если $_POST['UNSUBSCRIBE' передан, отписываем от всех подписок методом $contact->unsubscribe();
Также выполнили проверку на авторизацию пользователя. Если пользователь не авторизован-то отправялется на главную страницу.
Выводим форму отписки
В template.php выводим форму:
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$this->setFrameMode(true);
if ($arResult['USER_IS_UNSUB'] === 'N') {?>
<form method="post" action="">
<input type="hidden" name="UNSUBSCRIBE" value="UNSUBSCRIBE"/>
<button>
Отписаться от рассылки
</button>
</form>
<?}else{?>
У вас нет подписок
<?}?>
Здесь, проверили на наличие $arResult['USER_IS_UNSUB']: если ключ есть то показываем поле, со скрытым input и кнопкой отправки. Иначе, оповестили пользователя что у него подписок нет и отписываться не от чего. Готовый компонент можно скачать по ссылке:
Закидываем компонент в директорию "/local/components/bazarow" и вызываем в нужном месте сайта:
$APPLICATION->IncludeComponent(
"bazarow:unsuscribe.all.sender",
"",
Array()
);
На этом все, дизайн можно сделать под себя. По желанию добавить оповещение перед отправкой "А вы действительно хотите отписаться" и прочие красивости.