Настройка подтверждения регистрации через email 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка подтверждения регистрации через email 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1258
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    849
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    584
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    989

Настройка подтверждения регистрации через email 1С-Битрикс

Стандартная регистрация в 1С-Битрикс по умолчанию либо не требует подтверждения email, либо использует штатный механизм — зависит от настроек компонента system.auth.registration. Проблема в том, что письмо подтверждения отправляется через CEvent::Send() с шаблоном NEW_USER_CONFIRM, который выглядит как системное уведомление 2005 года. Переработка этого механизма под современные требования — транзакционный email, брендированный шаблон, правильная обработка повторных запросов — требует вмешательства в несколько точек системы.

Как работает стандартный механизм

При регистрации с включённым параметром EMAIL_CONFIRMATION компонент system.auth.registration создаёт пользователя с ACTIVE = N и отправляет письмо через событие NEW_USER_CONFIRM. Письмо содержит ссылку вида:

/bitrix/[email protected]&checkword=HASH

При переходе по ссылке скрипт confirm.php проверяет CHECKWORD из таблицы b_user и активирует аккаунт (ACTIVE = Y).

CHECKWORD хранится прямо в b_user.CHECKWORD — одно поле на всё. Если пользователь запросил повторное письмо, старый CHECKWORD перезатирается.

Кастомный шаблон письма

Шаблон письма редактируется в Настройки → Почтовые события → NEW_USER_CONFIRM. Для брендированного HTML-письма:

  1. Создаём шаблон типа NEW_USER_CONFIRM с полным HTML-телом
  2. Используем переменные: #EMAIL#, #LOGIN#, #NAME#, #CONFIRM_CODE#, #SITE_URL#
  3. Для правильного рендера HTML в почтовых клиентах — table-based вёрстка, инлайн-стили

Если нужен транзакционный провайдер (SendGrid, Mailgun, Postmark) вместо PHP mail() — подключаем через модуль main. Установка кастомного обработчика отправки:

// В init.php или модуле
AddEventHandler('main', 'OnBeforeEventSend', function(array &$eventFields, array &$message, array $siteData) {
    if ($message['EVENT_NAME'] === 'NEW_USER_CONFIRM') {
        // Перехватываем и отправляем через SendGrid API
        SendGridMailer::send(
            to: $eventFields['EMAIL'],
            subject: $message['SUBJECT'],
            html: $message['BODY']
        );
        return false; // Отменяем стандартную отправку
    }
});

Повторная отправка письма

Стандартный компонент не предоставляет кнопку «Выслать повторно». Добавляем:

// /local/components/local/auth.resend-confirm/class.php
if ($_POST['resend_email'] ?? false) {
    $email = trim($_POST['email'] ?? '');

    $user = \Bitrix\Main\UserTable::getList([
        'filter' => ['EMAIL' => $email, 'ACTIVE' => 'N'],
        'select' => ['ID', 'LOGIN', 'NAME', 'CHECKWORD', 'CHECKWORD_TIME'],
        'limit'  => 1,
    ])->fetch();

    if (!$user) {
        $this->addError('Пользователь не найден или уже активирован');
        return;
    }

    // Rate limit: не более 1 письма в 5 минут
    $lastSent = strtotime($user['CHECKWORD_TIME']);
    if (time() - $lastSent < 300) {
        $this->addError('Письмо уже отправлено. Подождите 5 минут.');
        return;
    }

    // Генерируем новый checkword
    $newCheckword = md5(uniqid('', true));
    \CUser::Update($user['ID'], ['CHECKWORD' => $newCheckword]);

    \CEvent::Send('NEW_USER_CONFIRM', SITE_ID, [
        'EMAIL'        => $email,
        'LOGIN'        => $user['LOGIN'],
        'NAME'         => $user['NAME'],
        'CONFIRM_CODE' => $newCheckword,
        'SITE_URL'     => SITE_SERVER_NAME,
    ]);

    $this->result['SUCCESS'] = true;
}

Срок действия ссылки

По умолчанию CHECKWORD не имеет срока действия — ссылка из письма месячной давности всё ещё сработает. Чтобы ограничить срок:

В обработчике confirm.php (или переопределённом компоненте подтверждения) проверяем CHECKWORD_TIME:

$user = \Bitrix\Main\UserTable::getList([
    'filter' => ['LOGIN' => $login, 'CHECKWORD' => $hash, 'ACTIVE' => 'N'],
    'select' => ['ID', 'CHECKWORD_TIME'],
])->fetch();

if (!$user) {
    ShowError('Ссылка недействительна');
    return;
}

$checkwordAge = time() - strtotime($user['CHECKWORD_TIME']);
if ($checkwordAge > 86400 * 3) { // 3 дня
    ShowError('Срок действия ссылки истёк. <a href="/resend-confirm/">Запросить новое письмо</a>');
    return;
}

\CUser::Confirm($login, $hash);

Автоудаление неактивированных аккаунтов

Пользователи, не подтвердившие email за N дней, засоряют базу. Агент раз в сутки удаляет их:

function DeleteUnconfirmedUsers(): string
{
    $cutoffDate = (new \DateTime())->modify('-7 days')->format('Y-m-d H:i:s');

    $res = \Bitrix\Main\UserTable::getList([
        'filter' => ['ACTIVE' => 'N', '<DATE_REGISTER' => $cutoffDate],
        'select' => ['ID'],
    ]);

    while ($row = $res->fetch()) {
        \CUser::Delete($row['ID']);
    }

    return __FUNCTION__ . '();';
}

Регистрируем агент в модуле через \Bitrix\Main\Agent.

Состав работ

  • Кастомный HTML-шаблон письма NEW_USER_CONFIRM
  • Подключение транзакционного провайдера (опционально)
  • Компонент повторной отправки с rate limit
  • Ограничение срока действия ссылки подтверждения
  • Агент автоудаления неактивированных аккаунтов

Сроки: 3–5 дней для базовой переработки с кастомным шаблоном и повторной отправкой. 1–1.5 недели при подключении транзакционного провайдера и полной переработке UX.