sender · Email-маркетинг 26.400.0 Ломающее

Sender 26.400.0: снимки сегментов, Feedback-ID и несовместимые изменения API

5 мин чтения Устаревших API: 1
Узнавайте о ломающих изменениях Битрикса раньше, чем они доедут до прода: свежие разборы — в канале @bxmax_updates

Ломающее обновление

Удалены или изменены публичные API — прикладной код может перестать работать.

Sender 26.400.0 переносит сбор получателей плановой рассылки на момент старта, добавляет управляемые снимки сегментов и связывает почтовый транспорт с identity отправителя. Перед обновлением проверьте вызовы SegmentDataBuilder, обработчики OnBeforePostingSendRecipient, старый AJAX загрузки шаблонов и прямые ссылки на PNG: их контракты изменились. Релиз также усиливает серверную проверку прав и обработку HTML.

Новое

Обновляйте снимок сегмента перед отправкой

Получатели плановой рассылки теперь собираются при фактическом старте, а не при создании posting. До запуска список писем и редактор показывают приблизительное число со знаком ~. Оно складывается по сегментам без дедупликации, поэтому может быть больше фактического числа адресатов. Время следующего открытия окна отправки выводится точным timestamp: ядро считает окно в часовом поясе автора, а список переводит результат в пояс смотрящего и различает сегодня, завтра и послезавтра. Снимок сегмента хранит дату завершения и не даёт одновременно перестраивать данные и читать их рассылкой. Свежим считается снимок за тот же пользовательский день, собранный не раньше чем за час до старта. Для своего кода появились SegmentSnapshotState, SnapshotResponse, SegmentDataBuilder::forceActualize(), GroupQueueService::isGroupHeld(), PostingTable::isNotStarted() и счётчики адресов по буквам в Segment::getIncludeAddressCountersByLetters().

Форма сегмента показывает последнюю сборку, очередь и кнопку обновления. Завершение приходит через Pull.

После десяти минут ожидания интерфейс выводит уведомление. То же произойдёт без Pull. Состояния озвучивает LiveAnnouncer.

Проверяйте доступ на сервере

SegmentConnectorAccessService и EndpointAccessGuard проверяют источники, категории и стадии сделок при подсчёте, чтении фильтра и сохранении сегмента. Уже сохранённый запрещённый источник можно оставить без изменений, но выбрать заново нельзя. EndpointFields нормализует поля источников, а SnapshotResponse задаёт коды ответов.

Та же проверка дошла до редактора рассылки: сервер валидирует категорию сделки, санитизирует HTML пользовательского шаблона, а preview согласия и постраничная загрузка шаблонов требуют права просмотра рассылок. Значения карточки компании экранируются отдельно для HTML-пресетов; текстовые каналы получают обычный текст.

Разбирайте ошибки почтового транспорта

Почтовый API получил FeedbackId, SenderIdentityResolver и публичные TransportMail::getLastError() и Transport\Adapter::getLastError(). Для наследников TransportMail добавлены protected-точки sendMail() и applySenderIdentity(). Отправка и месячный лимит теперь привязаны к identity автора и обратного адреса. Ошибки MAIL_SENDER_ADDRESS_MISMATCH и MAIL_SENDER_UNAVAILABLE ставят письмо на паузу. После десяти transport exception пакет останавливается, а email и телефоны в диагностике маскируются.

Feedback-ID включается в настройках модуля и по умолчанию выключен. Значения source, sender и portal проходят проверку; перевод строки не принимается. Если постоянные заголовки уже содержат Feedback-ID, транспорт заменяет его вычисленным значением.

Загружайте шаблоны страницами

TemplateTable::getUserTemplatePage() отдаёт страницу до девяти записей со своим hasMore; hasMoreUserTemplates() возвращает только bool. Selector продолжает загрузку после пустой отфильтрованной страницы и использует изображения 1x/2x. Rejected promise показывает уведомление через showLoadMoreError(). Встроенные пресеты перешли на WebP; баннер письма получает <picture> с WebP 1x/2x и прежним PNG fallback, когда картинки не прикрепляются к письму.

Учитывайте новые правила CRM-выборок

CRM connector строит выборку сделок в пределах текущего окна ID, не повторяет join для продуктового фильтра и считает разные пары типа и ID сущности. Запрещённые каналы открытых линий исключаются, нецелые ID не попадают в персонализацию. Поля сообщения и UTM сохраняются через идемпотентный addMerge: исчезнувшие коды удаляются, ошибки собираются для каждой строки.

Что сломается

  • Публичный Bitrix\Sender\GroupConnectorTable::onAfterUpdate() удалён. Прямой вызов больше невозможен; код, который полагался на этот ORM-хук для актуализации сегмента, должен вызывать API снимка явно.
  • SegmentDataBuilder::buildData($perPage = null): bool стал buildData(): bool, а run($groupStateId, $perPage = null) — run($groupStateId). Именованные вызовы с $perPage упадут. checkIsSegmentPrepared() при занятом lock возвращает null вместо false, поэтому строгая проверка должна учитывать третье состояние.
  • Старый AJAX-action load компонента sender.template.selector удалён. Клиенту нужен Controllerable-action loadAction() в режиме class с обязательным messageCode; ответ содержит items и hasMore.
  • Message\Adapter::replaceFields() подставляет исходные значения без htmlspecialcharsbx() и nl2br(). Для HTML берите подготовленные значения из getFields(). Событие OnBeforePostingSendRecipient получило ORIGINAL_FIELDS, чтобы обработчик менял исходные данные без повторного HTML-преобразования.
  • Старые PNG встроенных пресетов, событий и спрайтов удалены. Свои шаблоны и CSS с прямыми ссылками на эти файлы будут получать отсутствующий ресурс.

БД

В b_sender_group_state добавлена nullable-колонка DATE_COMPLETE; отдельного заполнения прежних строк нет. В b_sender_group_queue появился индекс IX_SENDER_GROUP_QUEUE_GROUP_ID_DATE_INSERT (GROUP_ID, DATE_INSERT) для проверки активного удержания сегмента.

Мелочи и находки

  • TRACK_CLICK больше не записывается в read tracker. OnTriggerList вызывается и для обработчиков без module ID, после чего ядро фильтрует connector.
  • Параллельные subscribe/unsubscribe сводят конфликтующую пару под DB-lock и отдельно обрабатывают duplicate insert/update.
  • Ошибка создания Facebook campaign завершает обработку с Error. VoxImplant убирает ведущий + перед звонком и аккуратнее читает MP3. Мастер Yandex показывается только на поддоменах bitrix24.ru.
  • Гид Yandex запускается только при видимой цели, работает без overlay и удерживает popup внутри viewport.

Устаревшие и удалённые API в этой версии

Символ Статус Чем заменять
Bitrix\Sender\GroupConnectorTable::onAfterUpdate() Удалено —

Новая версия вышла — разбор уже в Telegram

В канале @bxmax_updates публикуем каждый свежий разбор: что сломается, что устарело и что появилось в API. Узнаете до того, как обновите прод.

Подписаться

Читайте дальше

sender 26.300.0 Безопасность

sender 26.300.0: тестер писем больше не пускает произвольные ключи в компилятор

Главное в этом релизе — не новые классы, а два фильтра. AJAX тестовой отправки письма перестал складывать в конфигурацию сообщения всё, что пришло в запросе, а редирект по ссылке из рассылки перестал таскать внутренний параметр на внешние домены. Обе правки маленькие, обе — про то, что раньше можно…

4 мин
voximplant 26.900.0 Заметное Свежее

Voximplant 26.900.0: подписанные параметры экспорта статистики

Voximplant 26.900.0 подписывает имя компонента при экспорте детализации статистики. Обновление также исправляет REST-сценарии, отметку пропущенного переадресованного звонка и чтение настроек прокси.

1 мин
superset 26.700.0 Заметное Свежее

Superset 26.700.0: пользовательский контекст и проверяемый act-as

Версия 26.700.0 добавляет пользовательский контекст Superset в публичные провайдеры и команды. Проверяемый act-as для SQL Lab включается явно, поэтому существующие вызовы продолжают работать по-прежнему. Все новые параметры необязательны, прежние значения по умолчанию сохранены.

2 мин
sign 26.1200.0 Ломающее Свежее

Sign 26.1200.0: автоопределение бланков и удаление CRM API

Sign 26.1200.0 упрощает загрузку документов КЭДО, добавляет списки сотрудников в робот и обновляет «Мой сейф» без перезагрузки страницы. Перед обновлением проверьте интеграции с CRM и сервисом бланков: четыре публичные точки API удалены, а `CRM::saveCompanyStamp()` сменил тип результата.

4 мин
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…

Можно закрыть чат и перейти на другую страницу. Когда ответ будет готов, на кнопке Домового появится отметка.

Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти