Discourse Priority Action Mailer Plugin

リポジトリ: Discourse Priority Action Mailer プラグイン

このプラグインは何をするものですか?

このプラグインは、標準の Discourse デフォルト SMTP チャネルに追加して、2 つの新しい SMTP「チャネル」を追加します。1 つ目は「高優先度」のメール用で、ユーザーがメールでのログインを要求したり、サインアップしたり、パスワードのリセットを要求したりする際の通知メール(主観的ですが)が該当します。もう 1 つはダイジェスト(要約)メール用です。これらの新しい SMTP チャネルのいずれかが設定されていない場合(後ほど詳しく説明します)、新しいチャネルは標準の Discourse SMTP チャネルをデフォルトとして使用します。

なぜこのプラグインを気にしたり、インストールしたりする必要があるのでしょうか?

「高優先度」のユーザー向けメール(例:メールでのログイン要求など)とダイジェスト(要約)を同じ SMTP チャネルで処理すると、特にデフォルトの SMTP チャネルに制限が設定されている場合、「可用性」脚注 1 に問題が生じる可能性があります。

私たちは、レガシーフォーラムから Discourse へ初めて移行した際に、この問題を直接経験しました。当時、Google Workspace アカウント(旧 G Suite)を使用していました。Google はこのアカウントに制限を設けていたため、特定のメールアカウントが数日間「ロック」されてしまいました。これは深刻な問題ではありませんでした。なぜなら、別のアカウントを作成してダイジェストをオフにするだけで済んだからです。しかし、一時的にメンバーがメールでのログインやサインアップができなくなりました。

私のサイバーセキュリティおよびシステムエンジニアリング全般における経験から、この単一のメールチャネルを「単一障害点」として認識し、これを修正することをメモしていました。このプラグインは、すべてのダイジェストメールを別の SMTP チャネルに移すことで、この問題を解決します。

実際、このプラグインのコード がどれほどシンプルかご覧いただければわかる通り、これを実行するのは非常に簡単です。

このプラグインのインストール方法

このプラグインのインストールは簡単です。

  • 他の Discourse プラグインと同様に、このプラグインをインストールします。
  • コンテナビルドファイル(.yml ファイルなど)で追加の SMTP 認証情報を定義します。

デフォルト値を使用しない限り、以下の追加の Discourse コンテナ環境変数が使用されます。これらの SMTP 環境変数は、Discourse のデフォルト SMTP 環境変数と基本的に同じですが、それぞれに _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

「デフォルト」の OOTB(Out of the Box)SMTP 設定についても同様です。

rails c
Rails.application.config.action_mailer.smtp_settings

プラグインをインストールしてコンテナビルドファイルで ENV 変数を設定しなかった場合、これらすべてが 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 件のメッセージを送信できます。4 万件の制限を超えないようにするため、ダイジェストのオンオフを調整して管理しています。

追跡目的のために 2 つの異なる SendGrid API を使用しています。「デフォルトチャネル」を「MailGun」などの別のプロバイダーに設定しようとも思いましたが、まだ行っていません。

Google Workspace アカウントを使用しているのは、Discourse フォーラムでのメールログイン要求やサインアップの件数が少なく、Google が問題視しないレベルだからです。そのため、「高優先度」のメール通知の状況を容易に把握できます。

サインアップやメールでのログイン要求、その他の「優先度メール通知トラフィック」が多いサイトでは、Google Workspace(または Google アカウント)を使用せず、SendGrid や MailGun などの他の SMTP 大量送信プロバイダーを使用することを推奨します。前述の通り、私たちは SendGrid の基本プラン(無料ではありません)を利用しています。

とは言え、SMTP 設定は「あなた次第」であり、「私の指示」ではありません :)。したがって、あなたにとって「最善」と思われるように設定してください。

将来の拡張機能

また、乱数生成器を使用して「ラウンドロビン」を追加し、複数のプロバイダー間でダイジェストメールの負荷分散を行うなど、楽しいこともできます。このプラグインを簡単に変更することで、3 つ、あるいは 30 個ものメールチャネルを持つことも可能であり、非常に創造的になれるでしょう!

さらに、メーラーのジョブ例外を確認し、問題が発生した場合はそのメーラー(チャネル)をフラグ付けして、フラグが立ったチャネルへのメール送信を停止するなどの機能も検討できます。

可能性は無限大ですが、現時点では他のタスクに忙殺されているため、このプラグインに「ラウンドロビン」や「故障したチャネルの無効化」機能を追加する予定はありません。

正直に言うと(私の悪いです)、EmberJS プログラミングには興味がないため(2020 年はともかく、2021 年はどうかわかりませんが、おそらくないでしょう)、このリリースでは新しい UI 機能を追加していません。ごめんなさい。私は一般的にサーバーサイドプログラミング、システム管理、およびサイバーセキュリティ関連の機能(サーバーサイド)に興味があります。しかし、それは私個人の好みです。新しい Ember UI コードの PR やフォークによる修正を自由にどうぞ!もしこれらの新しい SMTP チャネルを表示する新しいルートを追加するとしたら、前述の通り EmberJS プログラミングには現在あまり興味がないため、Bootstrap と jQuery を使用する可能性が高いでしょう。

方法の変更または追加

現在の「優先度チャネル」のプラグイン設定は完全に主観的ですが、他のメーラークラスメソッドを「優先度チャネル」に追加することで変更することにオープンです。ネット上で簡単に見つけることができます :slight_smile:

関連項目

脚注

  1. サイバーセキュリティの 3 つのコアドメインは以下の通りです。

    1. 可用性
    2. 機密性
    3. 完全性

このプラグインは、低優先度のダイジェスト SMTP トラフィックをデフォルトの SMTP チャネルから移動させ、「高優先度」の SMTP トラフィックをトラフィックの少ない SMTP チャネル(ダイジェストなし、カジュアルなユーザー通知なし)に移動させることで、Discourse のサイバーセキュリティにおける「可用性」ドメインの向上を目的として設計されています。

プラグインサポート

サポートや機能リクエストについて連絡する最善の方法は、以下の補足トピックに投稿することです。

「いいね!」 6

プラグインをありがとうございます。特に会員数の多いフォーラムで役立つでしょう。

「いいね!」 1

@ozkn さん、ありがとうございます。

Discourse ユーザーの皆様のような素晴らしいコミュニティに、少しでもお返しできることを光栄に思います。

「いいね!」 1