IMAP 支持群组收件箱

:rotating_light: 我们正在移除对 Discourse 中 IMAP 的支持。 详见此帖:IMAP support for group inboxes - #39 by martin:rotating_light:


我们很高兴推出群组收件箱 IMAP 支持的 Alpha 版本。此功能允许按群组输入 IMAP 凭据和设置,以将群组收件箱与电子邮件收件箱同步。 :email:

:warning::warning: :warning:

这是一个 Alpha 阶段的功能,因此它尚未完全完成和完善。它极有可能存在故障,我们目前并未在生产环境中维护或使用它。使用风险自负!

:warning: :warning: :warning:

优势

  • 您的群组可以立即开始使用 Discourse 收件箱,因为所有现有邮件都将同步! :running_woman:
  • 您的群组可以在 Discourse 和您的电子邮件提供商之间同步消息,从而避免单点故障。人们可以从电子邮件账户或 Discourse 内部回复,所有内容都会自动同步 :zap:
  • 您不再需要为您的电子邮件提供商到 Discourse 传入邮箱设置复杂的转发规则。 :arrow_right:
  • 电子邮件标签将与 Discourse 标签同步,使内容井井有条 :card_file_box:
  • 即使您从 Discourse 回复,您也将使用您设置的电子邮件地址回复给给您的群组发送邮件的人。不再会有混淆! :relieved:

功能

  • 所有传入和传出邮件都将在 IMAP 服务器和 Discourse 之间同步,并根据解析后的邮件创建相应的主题和回复。回复可以从 Discourse 或 IMAP 服务器创建,所有内容都会同步!
  • 可以从 Discourse 群组收件箱或电子邮件账户回复电子邮件。
  • 应用于 Discourse 主题的标签将作为标签创建并应用于 IMAP 服务器上的电子邮件(这取决于提供商)。
  • 在 IMAP 服务器上归档的电子邮件将在群组收件箱中归档。
  • 在 Discourse 上归档的群组私信主题将在 IMAP 服务器上归档。
  • 在 IMAP 服务器上删除的电子邮件将删除群组收件箱中的主题。
  • 在 Discourse 上删除的群组私信主题将在 IMAP 服务器上删除。
  • 启用此功能的群组发送的电子邮件,其“回复至”地址将设置为 IMAP 设置中配置的电子邮件用户名。

入门指南

首先,在群组上设置此功能之前,必须配置一些站点设置。

  • enable imapenable smtp 都必须启用。IMAP 用于与邮件服务器同步,SMTP 用于从邮件服务器发送电子邮件。
  • tagging enabledallow staff to tag pms - 两者都必须启用,因为标签同步会将标签应用于私信。
  • enable imap write - 如果您希望 Discourse 中的更改反映在您的邮件服务器中(例如标签、归档主题和删除主题),则必须启用此项。
  • enable imap idle - 如果您的邮件服务器支持 IDLE,这将使我们能够接收来自邮件服务器的实时更新。这大大加快了电子邮件提供商中的更改反映到 Discourse 的速度。您应该开启此功能(例如 Gmail 支持它)。如果您想了解所有详细信息,可以 阅读 RFC 2177 中关于 IDLE 的内容
  • imap polling period mins - 如果不支持 IDLE,这是我们在检查 IMAP 服务器是否有更改之前等待的分钟数。如果启用了 enable imap write,这也是我们在从 Discourse 向 IMAP 服务器发送更改之间等待的时间。最小值为 1 分钟。

这些设置可以保持默认值,如果您发现同步存在问题,可以进行调整:

  • imap polling old emails - 每次轮询 IMAP 邮箱时更新的最大旧邮件(已处理)数量(0 表示全部)。
  • imap polling new emails - 每次轮询 IMAP 邮箱时更新的最大新邮件(未处理)数量。
  • imap batch import email - 触发导入模式(禁用帖子警报)的最小新邮件数量。

如果您希望标签与 IMAP 服务器同步,需要启用 tagging enabledallow staff to tag pms 站点设置。

接下来,您需要进入要同步的群组,并填写 IMAP 服务器设置。

这些设置将因提供商而异,详见下文。输入设置和凭据后,点击“保存更改”,我们将验证这些凭据是否与 IMAP 提供商的服务器匹配。如果成功,邮件箱列表将被填充,您需要选择要同步的邮件箱(关于此操作的指导也取决于提供商):

如果凭据验证失败,页面上将显示错误消息。明确说明:输入的 SMTP 服务器将用于代表在用户名和密码下输入的账户发送电子邮件,而不是用于批量邮件的主要 Discourse SMTP 配置。

最后,在您的 app.yml 文件中,您需要在 env 部分添加 DISCOURSE_ENABLE_EMAIL_SYNC_DEMON: true,然后运行 ./launcher rebuild。这将启动后台工作进程并开始同步电子邮件! :fireworks:

特定提供商信息

Gmail

  • :warning: 您必须生成应用专用密码,否则您需要开启“低安全性应用访问”,而 Google 迟早会取消此功能。请在 IMAP 设置中使用此密码代替您的 Gmail 账户密码。详见 Sign in with app passwords - Gmail Help:warning:
  • 请确保为 SMTP 和 IMAP 使用以下设置:
  • 强烈建议(即将成为 UI 功能)您仅选择“[Gmail]/所有邮件”邮件箱进行同步。
  • 当 Discourse 中的主题被删除时,我们不会立即删除 Gmail 中的电子邮件,而是将其移动到垃圾箱。Gmail 内部的“30 天”删除功能将从那里接管。
  • 应用于 Discourse 主题的标签将在 Gmail 中创建标签,并将其应用于电子邮件线程。Gmail 中的标签也是 IMAP 邮件箱!

限制

这是一个 Alpha 阶段的功能,因此它尚未完全完成和完善。因此,目前适用以下限制:

  • 目前仅支持 Gmail 作为 IMAP 提供商。我们有一些通用的 IMAP 功能,但不能保证能正常工作。Outlook Online 是我们下一个主要支持目标。
  • 从 Gmail 垃圾箱中恢复已删除的电子邮件并在 Discourse 中反映其状态目前不稳定。
  • :warning: 在电子邮件已经同步后更改同步邮件箱是不推荐的,这可能导致许多奇怪的问题。 :warning:
  • 每个群组只能同步一个邮件箱。
  • 群组之间的通信尚属未知领域,无法正常工作(例如,如果每个电子邮件都设置为不同的群组,从 support@yoursite.comteam@yoursite.com 发送邮件)。

由于这是一个 Alpha 功能,可能还存在其他细微的陷阱和未完善之处。

反馈与路线图

我们非常欢迎任何使用此功能与 Gmail 的用户提供反馈。我将负责解决任何错误和问题。目前的调试工作有点棘手,但我正在努力改进!

接下来我将着手处理以下内容:

  • 改进调试功能,使其更容易查看 IMAP 日志并找出问题所在。
  • 改进群组电子邮件界面,限制可从 Gmail 选择的邮件箱,并阻止/禁止更改邮件箱。
  • 验证以防止多个群组使用相同的 IMAP 凭据。
  • 可能改进群组 IMAP 设置的存储方式,并提供更好的凭据验证用户体验。
  • Outlook 支持。

目前,在我们解决这些问题的过程中,此功能对我们的托管客户不可用。

特别感谢 :pray:

@dan@j.jaffeux 是此巨大功能的主要贡献者,他们为此工作了 很久。没有他们出色的工作,我无法将功能推进到这一步并发布此公告 :tada:

41 个赞

这既是天大的好消息,也是坏消息。让我来解释一下。首先,Discourse 群组集成 IMAP 是一个好消息,因为它为群组身份(使用正确的原始地址)提供了多种实用解决方案,便于多个用户使用同一个 IMAP 账户(原生支持不佳,例如无法共享阅读状态),并为 ActivityPub 收件箱铺平了道路……但这也是一个坏消息,因为其实现方式偏向了那些将联邦服务转变为高度中心化系统的邮件巨头。我理解与大型服务提供商合作的吸引力,但我希望 IMAP 标准能够优先于特定供应商的扩展,以便在该功能进入测试版阶段时,任何邮件服务提供商都能得到支持。

为促成此事点赞。

10 个赞

这个功能被视为“alpha”版本有一个重要原因 :slight_smile:

从我在旁观察来看,IMAP 的麻烦在于其中存在大量“可自由解读”的空间,而我们不得不处理这些问题。

我们当然希望让该功能与更多邮件服务提供商兼容。我们内部更倾向于支持 Google,因为现实情况是 Discourse 本身就在使用 Google 服务,所以我们希望先解决自己的问题。

欢迎提交 PR 以改善该功能与其他服务提供商的兼容性。如果没有这样的贡献,随着时间推移,如果我们观察到更多用户希望将其用于其他服务提供商,我们将逐步构建相应支持。

17 个赞

这是一个合理的批评,正如 @sam 所说,我们首先专注于 Gmail,因为这是我们自己使用的平台,因此对我们而言最为相关。不过,我认为我们的基础“通用”提供商虽然远未达到 100% 符合 RFC 规范,功能也未完全覆盖,但非常贴近 IMAP 协议……详见 https://github.com/discourse/discourse/blob/master/lib/imap/providers/generic.rb。我认为唯一需要添加的是对归档和删除的特殊处理。目前,删除操作我们只是标记为 \Deleted 并发送 EXPUNGE 命令,但我知道某些电子邮件客户端允许用户选择先将其移至垃圾箱再执行 EXPUNGE 等操作。我不确定 IMAP 中归档的标准是什么。我们有一个专门的 Gmail 提供商类,用于重写部分通用方法。

如果您能推荐更多可供测试的“通用”IMAP 服务器或提供商,那将非常有帮助,因为 Gmail 对某些功能有其独特的处理方式,并支持 Gmail IMAP 扩展

此外,正如 Sam 所说,欢迎提交任何改进的 PR。否则,我们将根据需求进行调整。我预测下一个主要需求将来自 Outlook,因为这也是许多组织希望实现此类功能的重要用例(Outlook 也有其独特的规则……例如归档是一个文件夹/邮箱,且不支持标签)。

12 个赞

看起来非常令人兴奋。我们公司最近从自建邮件服务器切换到了 G-Suite,这项集成将使我们更轻松地回复客户咨询并管理进度追踪器。不过,我有一个问题想问 @martin。目前还不清楚,当回复群组收件箱中收到的消息时,它是使用 Gmail 的 SMTP 服务,还是使用为 Discourse 配置的发件 SMTP 服务?我看到插件中也提到了 Gmail 的 SMTP,但我还是希望在这点上能得到明确说明。

6 个赞

回复将使用 Gmail 的 SMTP 服务器发送,因为您是以用于 IMAP 同步的电子邮件账户的名义发送回复的!我会在原帖中添加一条说明以澄清这一点。

7 个赞

这确实很出色。我能想到很多应用场景。致敬 @martin @dan @j.jaffeux :raising_hands:

9 个赞

快速更新。我上周合并了这两个 PR。首先,修复了归档和删除功能无需启用标签即可正常工作的问题:

其次,我现在将所有 IMAP 日志写入数据库以便更方便地检查。将每天运行一个任务来删除超过 5 天的日志:

11 个赞

这太棒了!谢谢。

我得说,为了让 Discourse 接受我的用户名和密码,我不得不在我的 Google 邮箱账户中创建一个应用专用密码。

5 个赞

你在 Google 端启用了双因素认证吗?如果是的话,这是标准做法。

2 个赞

是的。我认为这是创建应用密码所必需的(尽管我不完全确定)

1 个赞

[quote=“martin, post:1, topic:160588”]
您必须生成一个应用专用密码,否则需要开启“允许低安全性应用访问”功能,而 Google 迟早会取消该功能。在 IMAP 设置中,请使用此密码代替您的 Gmail 账户密码。有关更多详细信息,请参阅 使用应用专用密码登录 - Gmail 帮助。[/quote]

这一点在主帖中已经注明了 :wink: 否则,您需要费尽周折才能让您的 Gmail 账户接受“低安全性应用”。迟早我们需要为 Google 支持 OAuth,因为这似乎是未来的发展方向。

4 个赞

哎呀!我是不是该提一下我的阅读理解能力很差?:woozy_face:

5 个赞

没关系!这是一个重要的点,所以我把它们移到了 Gmail 列表的顶部,并添加了一些警告标志。谢谢你提醒其他人,帮他们省去了麻烦 :slight_smile:

6 个赞

我试图了解为什么我无法与 Dovecot IMAP 服务器同步邮件(遗憾的是,我对 Ruby 或 Rails 没有经验)。

查看 imap_sync_logs,导入守护进程陷入了一个循环:

UIDVALIDITY = 1612565899 与预期的 0 不匹配,正在使 IMAP 缓存失效并为邮箱 INBOX 重新同步邮件

因此我想知道,在这种情况下是否应该更新 @group.imap_uid_validity

在手动更新该值后,导入守护进程又陷入了另一个循环。

Dovecot 不支持 'LABELS'

这导致了 Net::IMAP::BadResponseError,但遗憾的是,该错误并未记录到日志中。

现在我想知道:

  • Dovecot 对自定义标志的支持是否足以实现与 Discourse 的双向同步
  • 如何在 lib/imap/providers/detector.rb 中检测 Dovecot
  • 如何在 Dovecot 提供者中模拟标签功能

5 个赞

团体收件箱的 IMAP 同步仍处于早期阶段,目前仅支持 Gmail。理论上,您可以编写一个 dovecot 提供者,但我几周前注意到,主代码中有一些地方使用了仅适用于 Gmail 的功能,这些功能需要移至特定于提供者的代码中。对此深感抱歉,但您可能需要等到该功能更加成熟稳定后再尝试使用。

7 个赞

据我理解,'LABELS' 是 Gmail 的一项非标准功能。
我想了解 Google IMAP 与标准 IMAP 之间的区别。

以下是我目前的总结:

标准 IMAP Google IMAP
归档邮件存储在子文件夹中 所有邮件都存储在一个文件夹中
归档邮件缺少 \\INBOX 标签
自定义标志与系统标志一起存储 将自定义标志存储为标签

以下方案是否足以实现标准 IMAP 的同步?

  • 通过将标志拆分为系统标志和自定义标志,在标准 IMAP 中模拟标签功能
  • 由提供者处理 email_is_archived(例如添加并测试一个“归档”标志)

这将影响以下行:

这一行看起来有些奇怪:

任何系统标志都会被 Discourse 的标签覆盖。
这是否能妥善处理所有 IMAP 标志(\\Answered\\Deleted\\Draft\\Flagged\\Recent\\Seen,以及 $Forwarded$MDNSent$SubmitPending$Submitted)?

2 个赞

时隔一段时间,我再次回来查看这个问题。

我始终无法弄清楚如何让 reply-to 邮件头正常工作。我可以设置一个群组来与特定的 Gmail 账户同步,但当我尝试通过电子邮件回复时,reply-to 地址被设置为 Discourse 中配置的 notification email,而不是 IMAP 地址。

我是否遗漏了某些设置?

1 个赞

刚在 GoDaddy 邮件提供商上测试过,但未成功。Gmail 上运行良好,可惜我们想使用自己的域名。请问是否有更新能让其准备好投入生产使用?

1 个赞

顺便一提,您可以使用自己的域名搭配 Gmail(需付费)。

1 个赞