Changelog for Vestnik.

3.1.5-pl
==============
- Queue: parallel runs can't send the same email twice; emails stuck after a crash return to the queue in 15 minutes
- Queue: retries wait a growing delay (new setting vestnik_retry_delay); failed emails can be sent again from the log
- OnVestnikBeforeSend: 'prevent' postpones an email without blocking the queue, new 'cancel' moves it to the log as cancelled
- Templates: placeholders missing from the data render empty and filters like :default work on them; leftover tags are removed
- Lost emails are always written to the MODX error log; invalid JSON in the snippet's &data no longer creates an email
- Attachments: an empty vestnik_attachments_path now means core/components/vestnik/attachments/ instead of the site root; MODX configuration, PHP and hidden files can never be attached; the snippet no longer accepts attachments
- Log: email bodies and old entries are removed automatically (new settings vestnik_log_body_days and vestnik_log_keep_days)
- Debug mode without a test address no longer sends emails to real recipients
- Queue: emails over a lowered attempt limit move to the log instead of staying in the queue forever
- Group recipients: blocked users no longer get emails; recipient name falls back to the username
- Full English translation of the Docs tab
- Removed unused code and assets; installed sites are cleaned up on upgrade
- Templates are rendered for each recipient; new placeholders [[+recipient_email]], [[+recipient_name]], [[+recipient_username]], [[+recipient_id]]
- Removed the rule Source and template Language fields, which had no effect; their columns are dropped on upgrade
- Plain text templates keep text like Name <a@example.com> instead of losing it
- cron.php finds MODX by its own path, so a core outside the site root works
- Manager shows server and network errors instead of failing silently
- OnVestnikAfterSend gets a copy of the email, the result, the error and the log entry id

- Очередь: параллельные запуски не отправят одно письмо дважды; зависшие после сбоя письма возвращаются через 15 минут
- Очередь: повторы идут с нарастающей паузой (новая настройка vestnik_retry_delay); письма с ошибкой можно отправить снова из журнала
- OnVestnikBeforeSend: 'prevent' откладывает письмо, не блокируя очередь, новый 'cancel' убирает его в журнал как отменённое
- Шаблоны: плейсхолдеры, которых нет в данных, выводятся пустыми, фильтры вроде :default на них работают; оставшиеся теги удаляются
- Потерянные письма всегда пишутся в журнал ошибок MODX; невалидный JSON в &data сниппета больше не создаёт письмо
- Вложения: пустая настройка vestnik_attachments_path теперь означает core/components/vestnik/attachments/, а не корень сайта; конфигурацию MODX, PHP-файлы и скрытые файлы прикрепить нельзя; сниппет больше не принимает вложения
- Журнал: текст писем и старые записи удаляются автоматически (новые настройки vestnik_log_body_days и vestnik_log_keep_days)
- Отладочный режим без тестового адреса больше не отправляет письма реальным получателям
- Очередь: письма сверх сниженного лимита попыток уходят в журнал, а не остаются в очереди навсегда
- Получатели группы: заблокированные пользователи больше не получают письма; имя получателя берётся из username, если нет полного имени
- Полный английский перевод вкладки документации
- Удалены неиспользуемый код и ассеты; на установленных сайтах они удаляются при обновлении
- Шаблон рендерится для каждого получателя; новые плейсхолдеры [[+recipient_email]], [[+recipient_name]], [[+recipient_username]], [[+recipient_id]]
- Удалены поля «Источник» у правил и «Язык» у шаблонов, которые ни на что не влияли; их колонки удаляются при обновлении
- Текстовые шаблоны не теряют фрагменты вида Имя <a@example.com>
- cron.php находит MODX по своему пути, поэтому работает и ядро вне корня сайта
- Менеджер показывает ошибки сервера и сети, а не молчит
- OnVestnikAfterSend получает копию письма, результат, ошибку и id записи журнала

3.1.4-pl
==============
- Security: MODX and Fenom tags inside event data are no longer executed, only tags written in the template itself
- Security: email previews in the manager run in a sandboxed iframe, scripts from an email can't run
- Security: vestnik_view, vestnik_save and vestnik_remove are now enforced; the policy is granted to the Administrator group, other manager groups need it assigned manually
- Security: removed the unused Template/PreviewHtmx endpoint

- Безопасность: теги MODX и Fenom в данных события больше не выполняются, только теги самого шаблона
- Безопасность: просмотр письма в менеджере идёт в iframe с sandbox, скрипты из письма не запускаются
- Безопасность: разрешения vestnik_view, vestnik_save и vestnik_remove теперь проверяются; политика выдаётся группе Administrator, другим группам менеджера её нужно назначить вручную
- Безопасность: удалён неиспользуемый экшен Template/PreviewHtmx

3.1.3-pl
==============
- Email assembly reworked to avoid spam filters (Yandex in particular): body is always UTF-8 and is no longer converted to HTML entities (MODX's modPHPMailer::send() did that when mail_inlinestyle_inline is on); CSS inlining is still applied
- Body is wrapped into a complete HTML document with a declared charset; plain-text templates keep their line breaks
- A plain-text alternative part is generated from the HTML (multipart/alternative)
- Message-ID uses the sender's domain instead of localhost.localdomain when sent from cron (CLI); X-Mailer header removed
- Vestnik uses its own modPHPMailer instance (SMTP/DKIM still come from mail_* system settings), so its headers never leak into other components' emails

3.1.2-pl
==============
- Log grid: view button, context menu item and double-click open the log entry (recipient, sender, status, error, attachments, email body preview)
- Log now stores sender, recipient name, email body and attachments (columns are added automatically on package upgrade)

3.1.0-pl
==============
- All four grids (rules, templates, queue, log) rebuilt on Tabulator: remote pagination, remote sorting, page size selector
- Multiple row selection (Ctrl+click / Shift+click) and a row context menu with bulk delete
- "Delete all" for rules and templates; queue/log clearing moved to the tab toolbar
- Per-grid search box; log grid additionally filtered by status
- Manual queue run reports its stats (processed / sent / failed / to retry) in the toolbar
- Grids are created lazily on first tab display; forms are protected against double submit
- Refreshed manager UI theme: modal dialogs, forms, buttons, tabs, search fields and alerts (css/mgr/modal-theme.css)

3.0.1-pl
==============
- Email attachments: pass the reserved `attachments` key (list of file paths or {file, name} pairs) in trigger() $data or snippet &data
- New system setting vestnik_attachments_path restricts the directory attachments may be taken from (empty = site root)
- Queue email preview shows the list of attachments
- Docs tab: new "Attachments" section

3.0.0-pl
==============
- The first release
