Как реализовать механизм отписки от рассылки в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При организации массовых email-рассылок из системы 1С одним из критически важных функциональных блоков является механизм отписки. Это необходимо не только для лояльности клиентов, но и для соблюдения законодательства о рекламе, а также для предотвращения попадания ваших писем в спам-фильтры крупных почтовых провайдеров. В этой статье мы подробно разберем, как реализовать этот процесс «от и до».

Общая архитектура решения

Для реализации отписки нам потребуется связать три компонента: само HTML-письмо, доступный извне веб-сервис на стороне 1С и механизм хранения отказов в базе данных. Рассмотрим стандартную схему взаимодействия:

  1. В тело HTML-письма добавляется гиперссылка с уникальным идентификатором получателя.
  2. При переходе по ссылке браузер пользователя отправляет запрос на HTTP-сервис 1С.
  3. 1С обрабатывает запрос, находит клиента в базе и фиксирует его отказ от рассылок.
  4. Пользователю выводится страница с подтверждением успешной отписки.

Создание и публикация HTTP-сервиса

Первым делом проанализируем необходимость публикации базы. Чтобы ссылка в письме сработала, ваша информационная база должна быть доступна внешним запросам. Для этого используется публикация на веб-сервере (Apache или IIS). Разберем создание самого сервиса в конфигураторе:

  1. Создадим новый объект метаданных HTTPСервис (например, с именем UnsubscribeService).
  2. Укажем корневой URL (например, unsubscribe).
  3. Создадим шаблон URL, например: /process.
  4. Добавим метод GET и назначим ему обработчик в модуле сервиса.

Рассмотрим пример кода обработчика GET, который будет принимать идентификатор клиента и тип рассылки:


Функция processGet(Запрос)
    
    ПараметрыURL = Запрос.ПараметрыЗапроса;
    ИдентификаторКлиента = ПараметрыURL.Получить("id");
    ТипРассылки = ПараметрыURL.Получить("type");
    
    Если ЗначениеЗаполнено(ИдентификаторКлиента) Тогда
        // Вызываем процедуру фиксации отказа в базе
        ЗафиксироватьОтказОтРассылки(ИдентификаторКлиента, ТипРассылки);
        
        // Формируем ответ пользователю в виде HTML
        Ответ = Новый HTTPСервисОтвет(200);
        ТекстHTML = "<html><body><h3>Вы успешно отписаны от рассылки!</h3></body></html>";
        Ответ.УстановитьТелоИзСтроки(ТекстHTML, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
        Возврат Ответ;
    Иначе
        Возврат Новый HTTPСервисОтвет(400); // Ошибка: не передан ID
    КонецЕсли;
    
КонецФункции

Формирование ссылки в письме

Теперь выясним, как правильно сформировать ссылку, которую мы вставим в HTML-макет письма. Как было предложено в обсуждении, лучше всего использовать GUID (уникальный идентификатор) объекта 1С, чтобы однозначно идентифицировать получателя.

Пример структуры ссылки:

http://yourserver.com/base_name/hs/unsubscribe/process?id=5ec0d3e5-8f4b-11eb-a2a3-00155d010101&type=News

В коде 1С при формировании рассылки мы можем получить строковое представление GUID следующим образом:


ИдентификаторСтрокой = Строка(КонтрагентСсылка.УникальныйИдентификатор());
СсылкаНаОтписку = "http://myserver.ru/hs/unsubscribe/process?id=" + ИдентификаторСтрокой + "&type=Promo";

Затем эта переменная вставляется в тег <a href="..."> вашего HTML-шаблона.

Безопасность и использование токенов

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

Вместо передачи id контрагента напрямую, создадим в 1С регистр сведений ТокеныДляОтписки. При отправке письма генерируем случайный длинный ключ (токен), записываем его в регистр со ссылкой на контрагента и сроком действия, а в письме передаем именно этот ключ. При переходе по ссылке сервис найдет контрагента по токену в регистре.

Технические заголовки (RFC 2369 и RFC 8058)

Посмотрим на требования современных почтовых систем (Gmail, Mail.ru). Наличие ссылки в тексте — это минимум. Для того чтобы в интерфейсе почтовика появилась кнопка «Отписаться», необходимо добавить специальные заголовки в само письмо (headers).

  1. List-Unsubscribe: Позволяет почтовому клиенту отображать системную кнопку отписки. В заголовке указывается ссылка на ваш сервис.
  2. List-Unsubscribe-Post: Требование «отписки в один клик». Почтовик может отправить скрытый POST-запрос на ваш сервер, чтобы отписать пользователя без открытия браузера.

В 1С при использовании объекта ИнтернетПочтовоеСообщение это реализуется через коллекцию Заголовки:


Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Заголовки.Вставить("List-Unsubscribe", "<http://myserver.ru/hs/unsubscribe/process?id=token>");
Письмо.Заголовки.Вставить("List-Unsubscribe-Post", "List-Unsubscribe=One-Click");

Юридические аспекты и хранение данных

Важно помнить, что согласно Федеральному закону «О рекламе» (ФЗ-38), вы обязаны прекратить рассылку немедленно после получения отказа. Мы рекомендуем создать в 1С регистр сведений ИсключенияРассылок, в котором будут храниться:

Перед каждой отправкой писем ваш запрос в 1С должен обязательно проверять наличие адресата в этом «черном списке» (используя левое соединение в запросе или проверку в цикле).

Пользовательский опыт (Frontend)

Вместо того чтобы просто показывать текст «Вы отписаны», мы можем сделать страницу более функциональной. Рассмотрим возможность внедрения Центра управления подписками. После перехода по ссылке HTTP-сервис может отдавать HTML-страницу, где пользователю предлагается выбрать категории интересов (например, оставить только «Уведомления о заказах», но отключить «Рекламные акции»). Это поможет сохранить часть аудитории, которая хочет получать только важные сообщения.

Подведем итог. Реализация отписки в 1С — это комплексная задача, требующая навыков работы с HTTP-сервисами, понимания структуры почтовых заголовков и ответственного подхода к хранению персональных данных. Использование GUID или токенов в параметрах GET-запроса является наиболее эффективным способом автоматизации этого процесса.

← На главную