好的,另一位团队成员提到 IMAP 轮询从未正常工作过,在某种程度上已被移除,而这些设置似乎是当时旨在实现它时留下的一些残余。
编辑:找到了一些关于它的声明:IMAP support for group inboxes - #39 by martin
这似乎是倒退,因为对我来说,POP3 在如今已过时且不切实际,因为人们通常会使用多个邮件客户端(至少是手机+电脑)。因此,我看不出在 Dovecot 实例中启用 POP3 监听器有什么意义。
然而,我设法将直接的 Discourse 邮件接收器 API 实现到我们现有的 Postfix 中,而无需邮件接收器容器,甚至无需其 Ruby 脚本,但主要遵循 Discourse 邮件接收器容器中使用的 Postfix 集成:mail-receiver/Dockerfile at main · discourse/mail-receiver · GitHub
/etc/postfix/main.cf:
# 对于 Discourse 回复电子邮件地址,我们通过传输映射覆盖默认传输
transport_maps=hash:/etc/postfix/transport
/etc/postfix/transport
# 一个名为“discourse”的服务用作电子邮件到定义的 Discourse 回复地址的传输端点
forum.reply@dietpi.com discourse:
/etc/postfix/master.cf
# 我们将“discourse”传输服务定义为通过监听(私有)UNIX 套接字的 curl 的管道守护进程
# 为了让管道到 curl 工作,它不能是未授权的或 chrooted 的
discourse unix - n n - - pipe user=nobody:nogroup argv=/usr/bin/curl -X POST -F email=<- -H Api-Username:system -H Api-Key:fooooobaaaaarbaaaaaaz https://dietpi.com/forum/admin/email/handle_mail
- 因此,传输映射会将电子邮件传递到回复地址,然后传递到我们自定义的
discourse服务。 - 最佳性能应该是 UNIX 套接字,并且它可以是私有的(第一个
-),因为没有其他任何东西必须使用它。“私有”意味着套接字位于/var/spool/postfix/private/discourse,在一个只有postfix用户可以访问的目录中,位于 Postfix chroot 目录/var/spool/postfix内。 - 但为了让
pipe到curl工作(n n),它不能是未授权的或 chrooted 的。 - 然后我们使用
nobody:nogroup用户:组来最小化权限。 - 遵循接收器 API,电子邮件需要附加到
email表单字段,这可以通过 curl 的<-STDIN 调用完成。需要添加Api-Username和Api-Key标头,第一个通常是system,第二个可以在 Discourse 中生成,作为仅具有receive_emails权限的精细 API 密钥。然后使用相应的 HTTP 端点。
我们有意跳过了接收器容器执行的快速拒绝策略检查:
- 它检查
From和To标头的存在,发件人是否是带有域的完整地址,以及它是否在黑名单中,黑名单可以通过BLACKLISTED_SENDER_DOMAINS容器变量选择性地定义。它将发件人和收件人地址发送到另一个 Discourse HTTP API 端点,该端点会检查收件人是否与配置的回复电子邮件地址模板匹配,以及发件人地址是否属于注册用户,除非论坛配置为在传入电子邮件时创建新的停用用户,在我们案例中奇怪的是默认启用了此功能? - 我们公开的 Postfix SMTP 接收器服务已经检查了大部分这些内容,还有更多。所有内容都通过
rspamd,这意味着 DKIM、SPF 和 DMARC 检查。 - 但最重要的是,最终的 Discourse 邮件接收器后端也会执行相同的检查。唯一的缺点是:发件人不会收到邮件守护进程拒绝/退回的电子邮件,但如果发件人/收件人无效,错误将仅记录到我们的 Discourse 中。但如果发件人和收件人正确,只有邮件内容不符合预期(特别是缺少 Message-ID 标头),发件人会收到 Discourse 的正确电子邮件。IMO,缺少 SMTP 拒绝/退回邮件是完全可以接受的,因为否则实现开销最小,每个邮件的网络请求和后端处理少等。
- 一般来说:在
master.cf命令参数中要小心空格。引用以保留空格字面量不起作用。相反,这样的参数需要用花括号括起来:{some arg with spaces}。但在这种情况下,没有参数包含空格,标头键和值之间的空格也是可选的。
到目前为止工作得很好,并且无缝集成到我们现有的设置中,默认的虚拟传输到 Dovecot,传输映射也用于将一些电子邮件中继到外部地址,因为并非团队中的每个人都希望/需要我们在服务器上拥有额外的邮箱。如果在虚拟别名映射中定义了通配符地址,则需要将 Discourse 回复地址添加到该表中,将其映射到自身(与其他本地虚拟用户/地址一样)。