Реализация управления отписками (Unsubscribe) от email на сайте

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Реализация управления отписками (Unsubscribe) от email на сайте
Простая
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Система управления отписками от рассылок

Корректное управление отписками — это не только вежливость, но и юридическое требование (GDPR, CAN-SPAM, российский ФЗ-152). Нарушения ведут к блокировке домена и штрафам. Нужна надёжная система: одноклик-отписка, управление предпочтениями и уважение к выбору пользователя.

Таблица подписок и предпочтений

CREATE TABLE email_subscriptions (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID NOT NULL REFERENCES users(id),
  subscription_type VARCHAR(100) NOT NULL,
  -- 'marketing', 'digest', 'product_updates', 'security', 'transactional'
  is_active BOOLEAN NOT NULL DEFAULT true,
  unsubscribed_at TIMESTAMPTZ,
  unsubscribe_reason TEXT,
  created_at TIMESTAMPTZ DEFAULT now(),
  UNIQUE (user_id, subscription_type)
);

CREATE TABLE email_suppression_list (
  email VARCHAR(255) PRIMARY KEY,
  reason VARCHAR(100) NOT NULL,  -- 'unsubscribe', 'bounce', 'complaint'
  created_at TIMESTAMPTZ DEFAULT now()
);

Генерация подписанной ссылки отписки

import { createHmac } from 'crypto';

function generateUnsubscribeToken(userId: string, type: string): string {
  const payload = `${userId}:${type}:${Date.now()}`;
  const signature = createHmac('sha256', process.env.UNSUBSCRIBE_SECRET!)
    .update(payload)
    .digest('hex');
  return Buffer.from(`${payload}:${signature}`).toString('base64url');
}

function generateUnsubscribeUrl(userId: string, type: string = 'all'): string {
  const token = generateUnsubscribeToken(userId, type);
  return `https://app.example.com/unsubscribe/${token}`;
}

Обработчик отписки

// GET /unsubscribe/:token — ссылка в письме (one-click preview)
app.get('/unsubscribe/:token', async (req, res) => {
  const decoded = parseUnsubscribeToken(req.params.token);
  if (!decoded) return res.status(400).render('unsubscribe-invalid');

  // Показать страницу подтверждения / управления предпочтениями
  res.render('unsubscribe', {
    userId: decoded.userId,
    type: decoded.type,
    token: req.params.token,
  });
});

// POST /unsubscribe/:token — подтверждение отписки
app.post('/unsubscribe/:token', async (req, res) => {
  const decoded = parseUnsubscribeToken(req.params.token);
  if (!decoded) return res.status(400).json({ error: 'Invalid token' });

  const { type, reason } = req.body;

  if (type === 'all') {
    // Отписать от всех маркетинговых рассылок
    await db.query(
      `UPDATE email_subscriptions
       SET is_active = false, unsubscribed_at = now(), unsubscribe_reason = $1
       WHERE user_id = $2 AND subscription_type != 'transactional'`,
      [reason, decoded.userId]
    );

    // Добавить в список подавления
    const user = await db.users.findById(decoded.userId);
    await db.query(
      `INSERT INTO email_suppression_list (email, reason) VALUES ($1, 'unsubscribe')
       ON CONFLICT (email) DO NOTHING`,
      [user.email]
    );
  } else {
    // Отписать от конкретного типа
    await db.query(
      `UPDATE email_subscriptions
       SET is_active = false, unsubscribed_at = now()
       WHERE user_id = $1 AND subscription_type = $2`,
      [decoded.userId, type]
    );
  }

  res.json({ ok: true });
});

List-Unsubscribe заголовок (RFC 8058)

Gmail и Outlook показывают кнопку «Отписаться» в интерфейсе, если письмо содержит заголовок List-Unsubscribe. Это обязательно для отправителей > 5 000 писем в день с февраля 2024:

await sendEmail({
  to: user.email,
  subject: 'Наш дайджест',
  html: emailHtml,
  headers: {
    // RFC 2369 — mailto для почтовых клиентов
    'List-Unsubscribe': `<mailto:[email protected]?subject=unsub-${userId}>, <https://app.example.com/unsubscribe/${token}>`,
    // RFC 8058 — POST-запрос без открытия браузера (Gmail one-click)
    'List-Unsubscribe-Post': 'List-Unsubscribe=One-Click',
  },
});

// POST /api/email/list-unsubscribe — обработчик One-Click
app.post('/api/email/list-unsubscribe', async (req, res) => {
  const { 'list-unsubscribe' }: { 'list-unsubscribe': string } = req.body;
  // Поле = 'One-Click' — просто обработать
  // Идентификация пользователя — через X-Token header или token в URL
  res.status(200).end();
});

Страница управления предпочтениями

Вместо полной отписки — предложить выбрать типы рассылок:

Тип Описание Отключаемый
transactional Подтверждения, инвойсы Нет
security Вход с нового устройства Нет
product_updates Обновления продукта Да
marketing Промо и скидки Да
digest Еженедельный дайджест Да

Сроки

Система отписок с одноклик-ссылкой, List-Unsubscribe заголовком, страницей управления предпочтениями — 2–3 дня.