Discourse 优先操作邮件插件

仓库:Discourse Priority Action Mailer 插件

这个插件是做什么的?

该插件在标准的 Discourse 默认 SMTP 通道之外,新增了两个 SMTP“通道”。其中一个通道用于“高优先级”邮件;这些邮件(主观上)包括用户请求通过邮件登录、注册或请求重置密码时的通知邮件。另一个通道用于摘要(汇总)邮件。如果未配置这两个新的 SMTP 通道(稍后会有更多说明),新通道将默认使用标准的 Discourse SMTP 通道。

为什么有人应该关心或安装这个插件?

如果将“高优先级”邮件(例如通过邮件登录的请求)与摘要邮件放在同一个 SMTP 通道中,可能会造成潜在的“可用性”脚注 1问题,尤其是当默认 SMTP 通道设有限制时。

当我们最初从旧论坛迁移到 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“通道”,并为发送给用户的摘要(包括 AdminConfirmationMailerUserNotifications 邮件器中的以下方法)创建了一个新的“摘要”通道:

优先级通道操作

  • :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) SMTP 设置同理:

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 条消息。我们通过开启和关闭摘要来管理,以确保不超过 4 万条的限制。

我们使用两个不同的 SendGrid API 进行跟踪。我本打算将“默认通道”设置为另一个提供商(如"MailGun")只是为了好玩,但尚未这样做。

我们使用 Google Workspace 账户,因为我们的 Discourse 论坛通过邮件登录的用户不多,注册量也足够低,Google 不会提出异议;因此我们可以轻松查看“高优先级”邮件通知的情况:

我建议拥有大量注册、邮件登录请求以及其他“高优先级邮件通知流量”的网站不要使用 Google Workspace(或任何 Google 账户),而应使用其他 SMTP 批量邮件提供商,如 SendGrid、MailGun 等。如前所述,我们使用的是基础(非免费)SendGrid 套餐。

话虽如此,您的 SMTP 配置“由您决定”而不是“由我决定”:slight_smile: 所以请根据您的“最佳判断”进行配置。

未来增强

还有一些有趣的事情可以做,比如使用随机数生成器添加“轮询”(round robin)来在多个提供商之间对摘要邮件进行负载均衡。通过轻松修改此插件,我们可以拥有 3 个甚至 30 个邮件通道,因此我们可以非常有创意!

此外,我们可以查看邮件器的 Jobs 异常,如果出现问题,我们可以标记该邮件器(通道)并停止向任何“被标记”的通道发送邮件等。

实际上,前途无量;但目前,由于忙于其他任务,我暂无立即为此插件添加“轮询”或“禁用故障通道”功能的计划。

老实说(这是我的错),我不擅长 EmberJS 编程(2020 年如此,2021 年不确定,但我怀疑……),所以我在这个版本中没有添加任何新的 UI 功能,对此很抱歉。一般来说,我更专注于服务器端编程、系统管理和网络安全相关功能(服务器端),但这只是我个人偏好。欢迎提交包含新 Ember UI 代码的 PR,或者分叉并修改!如果我决定添加一个新路由来显示这些新的 SMTP 通道,我更有可能使用 Bootstrap 和 jQuery 来实现,因为(如前所述),我目前对 EmberJS 编程并不热衷。

更改或添加其他方法

当前“优先级通道”的插件配置完全是主观的,我欢迎通过向“优先级通道”添加其他邮件器类方法来更改这些设置。我在网上很容易找到 :slight_smile:

参见

脚注

  1. 网络安全的三个核心领域如下:

    1. 可用性
    2. 机密性
    3. 完整性

本插件旨在通过将低优先级的摘要 SMTP 流量移出默认 SMTP 通道,并将“更高优先级”的 SMTP 流量移至低流量(无摘要、无普通用户通知)的 SMTP 通道,来提升 Discourse 网络安全中的“可用性”领域。

插件支持

关于支持或功能请求,联系我的最佳方式是在此配套主题中发帖:

6 个赞

感谢这个插件。它对于拥有大量成员的论坛来说将特别有用。

1 个赞

感谢 @ozkn

很荣幸能以自己微薄之力,回馈 Discourse 用户这个如此优秀的社区。

1 个赞