电子邮件偏好设置在禁用电子邮件时仍然显示

从用户体验(UX)角度来看,当所有电子邮件功能被禁用时,会出现一些奇怪的情况。我认为这些可以被视为缺陷。

  1. 包括非工作人员在内的所有用户都会收到一条关于系统不发送邮件的消息。似乎没有办法屏蔽此通知。我想不出用户需要一直收到此类提醒的理由。也许只对工作人员或管理员显示这条消息是可以接受的。这也许是某时的有意决定,但我找不到相关的讨论记录。

参考代码:
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/components/global-notice.js#L99

   if (
        this.siteSettings.disable_emails === "yes" ||
        this.siteSettings.disable_emails === "non-staff"
      ) {
        notices.push(
          Notice.create({
            text: I18n.t("emails_are_disabled"), // "All outgoing email has been globally disabled by an administrator. No email notifications of any kind will be sent."
            id: "alert-emails-disabled",
          })
        );
      }

我认为这里的判断条件应该修改为:

if (
        this.get("currentUser.staff") && // 或者 currentUser.admin
        (this.siteSettings.disable_emails === "yes" ||
        this.siteSettings.disable_emails === "non-staff") 
      ) {
          …

或者至少提供一个设置项,决定谁应该收到此通知(例如:所有人/工作人员/管理员/无人)。

另外,关于 FIX: Show 'emails disabled' to staff users when disabled for non-staf… · discourse/discourse@acc121f · GitHub 这个修复,其初衷似乎是“电子邮件已禁用”的通知应仅显示给工作人员,但测试用例 https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/tests/acceptance/email-notice-test.js#L24 却验证了所有人都会看到该通知。

顺便提一个小问题:我觉得所有的 test("when … 测试命名有点令人困惑。例如:“当启用时”实际上测试的是 disable_emails = "yes",虽然我知道这是为了测试设置变更,但这实际上测试的是“电子邮件已禁用”的情况,反之亦然,“当禁用时”测试的却是“电子邮件已启用”。我猜它们指的是设置的值而非最终效果,这可能是项目中的惯例。如果是这样,那完全没问题。只是对新来者来说有点奇怪。

  1. 无论 disable_emails 设置为 “yes” 还是 “non-staff”,用户偏好设置页面中仍然会显示电子邮件部分。这很奇怪,因为在模板内部,当摘要或邮件列表被禁用时,确实有检查来禁用部分内容。

如您所见,这里没有任何检查:
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/templates/preferences.hbs#L18

    <li class="nav-emails">
      {{#link-to "preferences.emails"}}
        {{i18n "user.preferences_nav.emails"}}
      {{/link-to}}
    </li>

在我的版本中,我做了类似这样的处理(我不确定你们是否会这样做,顺便一提):欢迎提出建议 :slight_smile:

      {{#if (show-emails-preferences model siteSettings.disable_emails)}}
          <li class="nav-emails">
            {{#link-to "preferences.emails"}}
              {{i18n "user.preferences_nav.emails"}}
            {{/link-to}}
          </li>
      {{/if}}

其中 show-emails-preferences 定义在一个辅助函数中,如下所示:

registerUnbound("show-emails-preferences", (model, disable_emails, args) => {
  let result = true;
  if(disable_emails === 'yes'){
    result = false;
  }else if(disable_emails === 'non-staff'){
    result = model.staff ? true : false;
  }else{
    result = true;
  }
    return result;
});

如果这些改进看起来值得采纳,请告诉我,我可以提交一个 Pull Request。

祝好

1 个赞

我忘了提到,我还将整个模板
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/templates/preferences/emails.hbs#L1
用以下代码包裹:

  {{#if (show-emails-preferences model siteSettings.disable_emails)}}
    {{#unless siteSettings.disable_mailing_list_mode}}
…

Discourse 没有邮件就无法运行。

您无法注册账户、重置密码、接收通知或使用邮箱登录。邮件是一个必不可少的组成部分。该横幅之所以存在,是因为它在告知所有人网站出现了故障。

无法禁用该警告并非漏洞,而是一项功能。

那如果只使用 SSO 进行身份验证呢?
Discourse 的一项功能就是禁止邮箱登录,仅允许 SSO 作为唯一的身份验证系统。
你可以将“启用本地登录”和“启用通过邮箱的本地登录”都设置为 false,
同时将“禁用邮件”设置为“是”。
也许它作为独立产品无法单独运行,但作为更大系统的一部分是可以的。此外,如果“Discourse 无法在没有邮件的情况下运行”这一说法成立,那为什么还会提供所有这些设置来破坏系统呢?

“那个横幅出现是因为它在告知所有人该站点已损坏。”
再次强调,我认为并不需要让“所有人”都知道。
至少在我看来,只有工作人员或管理员需要知道,而不是产品的普通用户。

顺便一提,我们就是这样使用它的。我们有一个主网站,用于登录、登出、注册、重置密码等操作。
访问 Discourse 的唯一方式是通过 SSO。这样我们就可以轻松通过群组来配置权限。

1 个赞

@pfaffman 顺便问一下,你觉得那个方法怎么样?

这样做在层级或方式上(就 Discourse 的风格而言)是否正确?

我还没有太多时间去深入探索代码,从而提炼出严格的“Discourse 风格”的编码方式。

是的,你可能说对了。我刚刚在野外发现了一个 Discourse 实例,它启用了 SSO,但同时也显示了“邮箱已禁用”的横幅,而我甚至还没有登录。

使用 SSO 时,他们无需担心密码重置问题。因此,除了人们无法收到电子邮件通知外,我不明白为什么在启用 SSO 的情况下,我们必须向所有人显示这个横幅。

也许我们至少可以更新一下,如果启用了 SSO 且用户未登录,就不显示该横幅?

2 个赞

@blake 我个人认为这应该是一个仅对工作人员显示的通知。普通用户对此无能为力,最多只能创建一个主题询问为何看到该消息以及其含义。这仅仅是向错误的人群展示了该消息,仅此而已 :slight_smile:

顺便一提:我已在我的网站上通过 CSS 隐藏了它,但我能理解显示该消息的必要性,因此那并不是发行版代码中的正确解决方案。