Mail 26.1300.0: переезд с Яндекса и Mail.ru, тёмная тема писем и аватары отправителей
Mail 26.1300.0 в коробочном Битрикс24 готовит порталы к тому, что Яндекс и Mail.ru закрыли стандартные почтовые протоколы для внешних сервисов, причём для всех адресов, корпоративных тоже. Модуль научился предлагать перенос почты в Битрикс24 Почту, но по умолчанию эта функция выключена. Кроме того, письма перекрашиваются под тёмную тему, у отправителей и ящиков появились аватары, а удаление писем стало отдельным правом. Прошлый разбор: Mail 26.1200.0.
Новое
Покажите уведомление о переезде на своей странице
Уведомления о переезде рассчитаны на четыре поверхности: portal, mail, crm и mobile_list. Соседним модулям правила показа не нужны, для них есть точка входа Bitrix\Mail\Public\Service\MigrationNotice\MigrationNoticeService. Метод mayHaveSomethingFor() дешёвый, он ничего не читает про ящик, и с него начинают, чтобы не грузить расширение впустую. decideFor() возвращает Result с готовым решением: что показать, про какой ящик, с какими текстами и кнопками.
<?php declare(strict_types=1);
use Bitrix\Mail\Public\Service\MigrationNotice\MigrationNoticeService;
use Bitrix\Main\Engine\CurrentUser;
use Bitrix\Main\Loader;
function getMailMigrationNotice(?int $mailboxId = null): ?array
{
if (!Loader::includeModule('mail')) {
return null;
}
$userId = (int)CurrentUser::get()->getId();
$service = new MigrationNoticeService();
if (!$service->mayHaveSomethingFor($userId, 'crm')) {
return null;
}
$result = $service->decideFor($userId, 'crm', $mailboxId);
return $result->isSuccess() ? $result->getData() : null;
}
Если такой поверхности нет в установленной версии модуля, ошибка придёт с кодом MigrationNoticeService::ERROR_UNKNOWN_SURFACE, исключения не будет. По умолчанию уведомления и анонс выключены. Включаются они опциями migration_notice_enabled и migration_announcement_enabled (Y), причём анонс работает только при включённых уведомлениях. Кнопка «Перенести почту» ведёт в панель корпоративной почты. Самой панели пока нет, поэтому кнопка открывает заглушку /mail/, если в опции migration_control_panel_url не задан другой адрес. Одноразовый вход в панель для администратора выдаёт Controller\ControlPanel::getEntryUrlAction().
Какие ящики считаются ограниченными, решает ProviderAccessRestriction. Про смену его логики ниже, в «Что сломается».
Перекрасьте письмо под тёмную тему
Bitrix\Mail\Public\Service\Message\BodyDarkThemeService::applyColorScheme() принимает HTML письма, схему (light или dark) и цвета вашей темы в формате #rrggbb, а возвращает BodyDarkThemeResult. Исключений сервис не бросает. Если перекрасить не вышло, вернётся исходное тело и причина в reason.
<?php declare(strict_types=1);
use Bitrix\Mail\Public\Service\Message\BodyDarkThemeService;
$result = (new BodyDarkThemeService())->applyColorScheme($body, BodyDarkThemeService::COLOR_SCHEME_DARK, [
'bgContentPrimary' => '#1f1f1f',
'base1' => '#f2f2f2',
'base2' => '#c8c8c8',
'base3' => '#9a9a9a',
'accentMainLink' => '#5aa9ff',
'bgSeparatorPrimary' => '#3a3a3a',
]);
$html = $result->body;
Без хотя бы одного из этих шести цветов сервис откажет с REASON_INVALID_PALETTE. Работает сервис за флагом MobileMessageDarkThemeFeature, и этот флаг включён по умолчанию. Проверяйте его через BodyThemeFeature::isMobileAvailable(), а не читайте флаг напрямую.
Аватары, право на удаление, флаги
У ящиков и отправителей появились аватары. Для них есть контроллеры Controller\MailboxAvatar (get, view) и Controller\SenderAvatar (get, save, view) и загрузчики FileUploader\MailboxAvatarUploaderController и SenderAvatarUploaderController. MailboxConnector::updateMailbox() принимает необязательный AvatarChange.
Удаление писем стало отдельным правом MAIL_MESSAGE_DELETE, управление аватарами отправителей — правом MAIL_SENDER_AVATARS_MANAGE. У роли «Сотрудник» по умолчанию первое есть, второго нет. Проверка в своём коде — MailAccess::hasUserAccessToMessageDeletion($userId). Пока опция message_delete_permission_enabled выключена, удалять письма могут все. REST v3 на такой отказ отвечает 403, раньше было 400.
Новые фичи модуль включает через фича-флаги ядра на Bitrix\Main\Config\Feature\AbstractFlag: SenderAvatarFeature, MailboxAvatarFeature, MobileMessageDarkThemeFeature и InternalDraftsFeature в Bitrix\Mail\Public\Features. Внутренние черновики теперь включаются флагом, а не опцией internal_drafts_enabled. Как устроены флаги, мы разбирали в main 26.700.0.
Модуль подписан на событие ядра main:OnMailSenderListBuild и отдаёт в список отправителей подписи пользователя.
Что сломается
Перепроверьте вызовы isRestricted()
ProviderAccessRestriction::isRestricted(?string $serviceName) больше не принимает $email, и ответ у метода теперь другой. Раньше для Яндекса он возвращал true только на бесплатных доменах, теперь вернёт true на любом ящике Яндекса или Mail.ru. Старый вызов с двумя аргументами не упадёт, но вернёт другой ответ. Проверка по адресу осталась в новом isMigrationRestricted($serviceName, $email), но смысл у неё обратный. Метод возвращает true только для корпоративных доменов, которые можно перенести в Битрикс24 Почту, а на бесплатных адресах false. Заменить им старый вызов один в один не получится.
Уберите isHistorySyncByDateSearchEnabled()
Feature::isHistorySyncByDateSearchEnabled() удалён вместе с опцией sync_history_by_date_search. Вызов теперь упадёт с Error.
Что заметят на портале
- Массовые действия в гриде ящиков включены по умолчанию: опция
mailbox_grid_bulk_actions_enabledпо умолчанию равнаY. Доступ к ним проверяет новый фильтрMassMailboxActionsAccess. - Фоновые пересборки истории остановлены опцией
history_backfill_stopped = Y: степперы переписок и индекса сохраняют курсор и стоят. - Письмо уходит, только если SMTP-запись привязана к ящику. На новой установке
main/sender_identity_address_fallback = N, и ядро больше не ищет запись по адресу. На существующих порталах опцию выключит степперLegacyMailboxSenderBindingStepper, когда привяжет все старые записи. Отказы приходят с кодамиMAIL_SENDER_ADDRESS_MISMATCH,MAIL_SENDER_UNAVAILABLEиMAIL_SEND_FAILED.
У десятка методов появились необязательные параметры (createMessage(), mail(), updateMailbox(), cleanCachesByMailboxId(), конструкторы AvatarManager и ComposeFormDataProvider). Сломаются только наследники, которые эти методы переопределяют.
Deprecated
Классы Public\Service\Mailbox\{AddressResolver, ResolvedMailbox, AddressHistory, AddressOccupation, AddressOccupationStatus, OrphanAlias} переехали в Public\Service\Mailbox\Alias\. Старые имена работают через Loader::registerClassAliases() в include.php, ими пока пользуются bizproc и crm. Ваш код не сломается, но импорты лучше перевести на \Alias\ сейчас.
Helper::repairCrmImapFilterAgent() стал заглушкой, которая возвращает пустую строку, и агента с ним больше не регистрируют.
БД
В b_mail_mailbox добавлены EMAIL_DOMAIN_HASH, AVATAR_RESOURCE_ID и AVATAR_REVISION, все три есть в MailboxTable::getMap(). Хеш домена для старых строк дозаполняет агент. Новые таблицы: b_mail_mailbox_avatar_resource, b_mail_sender_avatar и b_mail_sender_avatar_resource. Старые файлы аватаров раз в час чистят два агента.
Мелочи и находки
- Если сервер сменил UIDVALIDITY папки,
PlacementFolderVersionFilterне даст пользовательской команде уйти на строку под старой версией папки. Без этого удаление могло попасть в другое письмо с тем же UID. Актуальной считается последняя записанная версия, а не наибольшая: сервер, нарушающий RFC 3501, может выдать меньшее число. StyleTagSanitizerвырезает внешние ресурсы из<style>в подписях.MailboxTable::withDeferredCacheCleanup()откладывает сброс кеша ящиков до конца переданного блока. Пригодится, если массово правите ящики из своего кода.
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
Bitrix\Mail\Public\Service\Mailbox\AddressResolver
|
Deprecated |
Bitrix\Mail\Public\Service\Mailbox\Alias\AddressResolver
|
Bitrix\Mail\Public\Service\Mailbox\ResolvedMailbox
|
Deprecated |
Bitrix\Mail\Public\Service\Mailbox\Alias\ResolvedMailbox
|
Bitrix\Mail\Public\Service\Mailbox\AddressHistory
|
Deprecated |
Bitrix\Mail\Public\Service\Mailbox\Alias\AddressHistory
|
Bitrix\Mail\Public\Service\Mailbox\AddressOccupation
|
Deprecated |
Bitrix\Mail\Public\Service\Mailbox\Alias\AddressOccupation
|
Bitrix\Mail\Public\Service\Mailbox\AddressOccupationStatus
|
Deprecated |
Bitrix\Mail\Public\Service\Mailbox\Alias\AddressOccupationStatus
|
Bitrix\Mail\Public\Service\Mailbox\OrphanAlias
|
Deprecated |
Bitrix\Mail\Public\Service\Mailbox\Alias\OrphanAlias
|
Bitrix\Mail\Helper::repairCrmImapFilterAgent()
|
Deprecated |
(без публичной замены)
|
Bitrix\Mail\Helper\Config\Feature::isHistorySyncByDateSearchEnabled()
|
Удалено | — |