Репозиторий: Плагин Discourse Priority Action Mailer
Что делает этот плагин?
Этот плагин добавляет два новых SMTP-«канала» в дополнение к стандартному SMTP-каналу по умолчанию в Discourse. Один канал предназначен для писем с «высоким приоритетом», которые (субъективно) являются уведомлениями, когда пользователь запрашивает вход по электронной почте, регистрируется или запрашивает сброс пароля. Другой канал предназначен для дайджестов (сводных) писем. Если какой-либо из этих новых SMTP-каналов не настроен (об этом позже), новые каналы будут использовать стандартный SMTP-канал Discourse по умолчанию.
Почему это должно кого-то волновать или зачем устанавливать этот плагин?
Использование одного SMTP-канала для писем с «высоким приоритетом» для пользователей (например, запросов входа по электронной почте) в сочетании с дайджестами создает потенциальную проблему «доступности»Примечание 1, особенно если для канала по умолчанию установлены ограничения.
Мы столкнулись с этой проблемой напрямую при первой миграции на Discourse с нашего устаревшего форума, используя аккаунт Google Workspace (ранее известный как G Suite). Поскольку Google ограничивает этот аккаунт, указанный почтовый аккаунт был «заблокирован» на несколько дней. Это не было серьезной проблемой, так как мы просто создали другой аккаунт и отключили дайджесты, но на короткое время пользователи не могли войти по электронной почте или зарегистрироваться.
Мой опыт в области кибербезопасности и системной инженерии в целом указывал на этот единственный почтовый канал как на «единственную точку отказа», поэтому я решил это исправить. Этот плагин решает проблему, перемещая все письма-дайджесты на отдельный SMTP-канал.
На самом деле это довольно просто, как видно из того, насколько прост код этого плагина.
Как установить этот плагин?
Установка плагина проста.
- Установите плагин так же, как и любой другой плагин Discourse.
- Определите дополнительные учетные данные SMTP в файлах сборки вашего контейнера (ваши файлы
.yml).
Используются следующие дополнительные переменные окружения контейнера Discourse, если вы не хотите использовать значения по умолчанию. Эти переменные окружения SMTP по сути такие же, как и стандартные переменные окружения SMTP в Discourse, но с добавлением суффиксов _PRIORITY и _DIGEST к каждой из них:
ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ КАНАЛА ПРИОРИТЕТА
env:
DISCOURSE_SMTP_ADDRESS_PRIORITY:
DISCOURSE_SMTP_PORT_PRIORITY:
DISCOURSE_SMTP_USER_NAME_PRIORITY:
DISCOURSE_SMTP_PASSWORD_PRIORITY:
DISCOURSE_SMTP_AUTHENTICATION_PRIORITY: # обычно устанавливается в plain
DISCOURSE_SMTP_ENABLE_START_TLS_PRIORITY: # обычно устанавливается в true
ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ КАНАЛА ДАЙДЖЕСТА
env:
DISCOURSE_SMTP_ADDRESS_DIGEST:
DISCOURSE_SMTP_PORT_DIGEST:
DISCOURSE_SMTP_USER_NAME_DIGEST:
DISCOURSE_SMTP_PASSWORD_DIGEST:
DISCOURSE_SMTP_AUTHENTICATION_DIGEST: # обычно устанавливается в plain
DISCOURSE_SMTP_ENABLE_START_TLS_DIGEST: # обычно устанавливается в true
Если вы не укажете свои настройки, плагин будет использовать для каждого из вышеуказанных каналов стандартный канал Discourse по умолчанию.
Примечания для разработчиков
Этот плагин Discourse создает новый SMTP-«канал» с «высоким приоритетом» для сообщений SMTP более высокого приоритета и новый «канал дайджестов» только для дайджестов, отправляемых пользователям, включая AdminConfirmationMailer и следующие методы в почтовом модуле UserNotifications:
ДЕЙСТВИЯ КАНАЛА ПРИОРИТЕТА
- :email_login,
- :signup,
- :forgot_password,
- :admin_login
ДЕЙСТВИЕ КАНАЛА ДАЙДЖЕСТА
- :digest
Этот новый SMTP-канал с «высоким приоритетом» должен отличаться от вашего стандартного канала, через который Discourse отправляет дайджесты и т. д.
Выбор действий для «высокого приоритета» был полностью субъективным (с моей стороны) и может быть легко изменен путем модификации плагина.
Вы можете легко проверить свою конфигурацию в контейнере с помощью консоли Rails. Например, чтобы показать настройки SMTP для вашего «канала приоритета», выполните:
rails c
Rails.application.config.priority_smtp_settings
То же самое для «канала дайджестов»:
rails c
Rails.application.config.digest_smtp_settings
И для настроек SMTP по умолчанию (из коробки, OOTB):
rails c
Rails.application.config.action_mailer.smtp_settings
Если вы установите плагин и не зададите переменные окружения в файле сборки контейнера, вы легко сможете убедиться, что все они по умолчанию равны Rails.application.config.action_mailer.smtp_settings.
Кроме того, вы можете легко проверить панели администратора Discourse:
- /admin/email/sent
- /sidekiq
и убедиться, что все работает правильно.
ТЕСТИРОВАНИЕ
Эта версия (v0.1) прошла живое тестирование в течение многих дней и на данный момент работает безупречно.
ДЛЯ СИСТЕМНЫХ АДМИНИСТРАТОРОВ: НАША КОНФИГУРАЦИЯ
В нашей текущей настройке конфигурация выглядит следующим образом:
- КАНАЛ ДАЙДЖЕСТА: SendGrid, «api: blah_blah_blah_11111_blah_bla»
- КАНАЛ ПО УМОЛЧАНИЮ: SendGrid, «api: blah_blah_blah_2222_blah_blah»
- КАНАЛ ПРИОРИТЕТА: Аккаунт Google Workspace
Причина этого в том, что мы получаем много важной статистики через SendGrid. Мы находимся на базовом (не бесплатном) тарифном плане стоимостью около 15 долларов США в месяц, что позволяет отправлять до 40 000 сообщений в месяц. Мы управляем этим, включая и выключая дайджесты, чтобы оставаться в пределах лимита в 40 тысяч.
Мы используем два разных API SendGrid для целей отслеживания. Я планировал настроить «КАНАЛ ПО УМОЛЧАНИЮ» на другого провайдера, например «MailGun», просто ради интереса, но пока не сделал этого.
Мы используем наш аккаунт Google Workspace, потому что наш форум Discourse не привлекает много пользователей для входа по электронной почте, а объем регистраций достаточно низок, чтобы Google не жаловался. Таким образом, мы можем легко видеть, что происходит с уведомлениями по электронной почте «высокого приоритета»:
Я рекомендую сайтам с большим количеством регистраций, запросов на вход по электронной почте и другим трафиком уведомлений «высокого приоритета» НЕ использовать Google Workspace (или любой аккаунт Google), а использовать других провайдеров массовой рассылки, таких как SendGrid, MailGun и т. д. Как упоминалось, мы используем базовый (не бесплатный) тарифный план SendGrid.
Тем не менее, ваша конфигурация SMTP «на ваше усмотрение», а не «на мое»
поэтому настройте её так, как считаете «лучшим для вас».
БУДУЩИЕ УЛУЧШЕНИЯ
Также есть интересные вещи, которые мы можем сделать, например, добавить «круговую ротацию» (round robin) с использованием генератора случайных чисел для балансировки нагрузки при отправке писем-дайджестов (например) между несколькими провайдерами. Легко модифицируя этот плагин, мы можем иметь 3 или даже 30 почтовых каналов, так что мы можем быть очень креативными!
Кроме того, мы могли бы рассмотреть исключения в задачах (Jobs) для наших почтовых модулей. Если возникнет проблема, мы могли бы пометить этот почтовый модуль (канал) и прекратить отправку писем на любой «помеченный» канал и т. д.
Границ нет, но на данный момент у меня нет планов немедленно добавлять функции «круговой ротации» или «отключения неисправного канала» в этот плагин, так как я занят другими задачами.
Честно говоря (это моя ошибка), я не занимаюсь программированием на EmberJS (в 2020 году, не уверен насчет 2021, но сомневаюсь…), поэтому я не добавил никаких новых функций интерфейса в этом выпуске, извините за это. Как правило, я больше интересуюсь серверным программированием, системным администрированием и функциями кибербезопасности (на стороне сервера), но это только мой личный выбор. Не стесняйтесь присылать PR с новым кодом интерфейса Ember или форкнуть и изменить его! Если я решу добавить новый маршрут для отображения этих новых SMTP-каналов, я, скорее всего, сделаю это с помощью Bootstrap и jQuery, так как (как упоминалось), я в настоящее время не в восторге от программирования на EmberJS.
ИЗМЕНЕНИЕ ИЛИ ДОБАВЛЕНИЕ ДОПОЛНИТЕЛЬНЫХ МЕТОДОВ
Текущая конфигурация плагина для «каналов приоритета» полностью субъективна, и я открыт к изменениям, добавляя другие методы классов почтовых модулей в «каналы приоритета». Меня легко найти в интернете ![]()
СМОТРИТЕ ТАКЖЕ
ПРИМЕЧАНИЯ
-
Три основных домена кибербезопасности следующие:
- Доступность
- Конфиденциальность
- Целостность
Этот плагин разработан для улучшения домена «доступности» в области кибербезопасности Discourse путем перемещения трафика SMTP с низким приоритетом (дайджесты) из канала по умолчанию; и перемещения трафика SMTP с «более высоким приоритетом» на SMTP-канал с низким трафиком (без дайджестов, без уведомлений для обычных пользователей).
ПОДДЕРЖКА ПЛАГИНА
Лучший способ связаться со мной по вопросам поддержки или запросов функций — опубликовать сообщение в этой сопутствующей теме:

