Настройка подтверждения регистрации через 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-письма:
- Создаём шаблон типа
NEW_USER_CONFIRMс полным HTML-телом - Используем переменные:
#EMAIL#,#LOGIN#,#NAME#,#CONFIRM_CODE#,#SITE_URL# - Для правильного рендера 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.







