完全独立的电子邮件,使用Discourse和Stalwart-mail

故障排除

继续讨论 Stalwart-mail+Discourse: POP3 EOF 已到达(再次)

由于 @programmerjake 也在探索 Discourse ↔ Stalwart-mail,我想问你是否在 SMTPS 上遇到 TLS 错误:

2024-07-01T17:37:49.718793Z DEBUG common::listener: Failed to accept TLS connection: tls handshake eof context="tls" event="error" instance="smtps" protocol=Smtp remote.ip="128.140.68.114"
2024-07-01T17:37:49.899171Z DEBUG common::listener: Failed to accept TLS connection: tls handshake eof context="tls" event="error" instance="smtps" protocol=Smtp remote.ip="128.140.68.114"

在 Discourse 端,有一个错误弹出窗口:

ERROR - Net::ReadTimeout with #<TCPSocket:(closed)>

这似乎与 Ruby 的 OpenSSL 库不支持 TLSv1.3 有关,但这似乎有点牵强,因为 TLSv1.2 应该也能正常工作。


工作安装

Stalwart-mail >= v0.8.3

就是这样,通过这个版本,Stalwart-mail 现在支持与 Discourse 一起发送和接收电子邮件。 :tada:

Stalwart-mail 是一个单一二进制文件的邮件服务,可以满足你所有的电子邮件需求,而没有我们几十年来习惯的 Postfix + Spamassassin + Dovecot + 等配置的混乱。在这里,你设置好安装,就有 一切 都准备就绪,包括完整的 TLS 自动化(使用 ACME 和 LetsEncrypt)、SPF、DMARC、DKIM、ARC、DANE 支持(包括来自和发往你域的报告)、TLSA 和其他 DNS 记录开箱即用,自动配置和自动发现以便轻松设置邮件客户端,共享文件夹(通过“groups”)、别名、在各种处理阶段对所有传入和传出的邮件进行 ManageSieve 过滤、Web 管理、2FA 和 TOTP 支持、OAUTH 以及更多功能。无需再将你的电子邮件外包出去!

  1. 在端口 587 上使用 submission 监听器进行 SMTP
    1. 禁用 隐式 TLS(意味着:使用 STARTTLS)
    2. 确保禁用客户端顺序忽略(在默认设置中或覆盖监听器的 TLS 选项)
  2. 在端口 995 上启用带隐式 TLS 的 POP3 监听器

Discourse

正常配置电子邮件,使用 587 端口进行提交(带 STARTTLS),使用 995 端口进行 POP3s(带 SSL/TLS)。

1 个赞

那么,这是 Mailgun 等服务的开源替代品吗?鉴于其中大多数服务对于低流量来说相当昂贵,这开始变得非常有吸引力。

我猜它需要自己的(虚拟)机器。如果它能轻松地与 Discourse 运行在同一台机器上,那就太棒了。

您知道一个 Stalwart Mail 实例可以服务多个 Discourse 实例吗?

1 个赞

是的,您可以轻松支持多个域。

首先,您添加一个域,然后它会为您提供设置 MX(邮件交换)的 DNS 记录。您的所有域都将使用相同的 MX。

在同一台机器上运行 Stalwart-mail 和 Discourse 应该很容易。由于两者都需要 TLS 端口 443,您将在此端口上使用代理将流量发送到这两个服务。但是,为每个 Discourse 实例运行一个实例没有多大意义,最好将它们分开,这样您就可以轻松扩展您的电子邮件基础架构,并满足比 Discourse 更多的需求。

作为参考,我一直在 Hetzner 的 CPX21(4 GB RAM、3 个 x86 AMD vCPU、80 GB 存储)VPS 上运行 Stalwart-mail,拥有大约十几个域的 30 个帐户,并启用了完整日志,它占用了 564 MB RAM 和 7 GB 存储(大部分是操作系统)。Stalwart-mail 声称需要 184 MB 常驻 RAM(不到总 RAM 的 5%,虚拟内存为 1.2 GB)。

1 个赞

我正在使用 STARTTLS 的端口 587,并且在刚才测试时没有遇到任何错误……

另外,在 Stalwart-mail 的日志中,它似乎正在使用 TLSv1.3 并且没有遇到任何错误……我确实有一个有点不寻常的配置正在测试(使用 pebble 运行本地 ACME 服务器并使用 .test 域名,但这可能不足以破坏/修复任何东西……)

我没有在端口 587 侦听器中使用“覆盖 TLS 选项”……

1 个赞

在过去的几个月里,我一直专门使用 Stalwart-Mail 和 Discourse,效果非常好。我现在可以使用 Submission(端口 587,带 STARTTLS)和 Submissions(端口 465,带 TLS)。无需特殊配置或设置。

不过要注意,设置域名 DNS 记录是一个两步过程。

  1. 首先,在 Directory 中添加域名。这将为您提供要在 DNS 区域文件中添加的资源记录。
  2. 更新 DNS 后,为该域创建 TLS provider。您应该添加以下主机名:mailautoconfigautodiscovermta-tls(附加您的域名,例如 mail.example.org)。[^tls]
  3. 经过一段时间(几秒到几分钟)后,内部 ACME provider 将识别更改并获取 TLS 证书。此时,域配置将更新记录:选择带有新 ID 的 _mta-tls RR,以及所有 _tlsa 记录,将它们添加到您的区域文件中,您就可以开始使用了。

Stalwart-Mail 现在配备了非常强大的垃圾邮件过滤器和集成的 fail2ban 功能(禁止身份验证失败或请求伪造 URI 的 IP 地址)。

[^tls]:请注意,对于最基本的 Stalwart-Mail + Discourse 设置,您可能不需要 autoconfigautodiscover,因为它们对 IMAP 客户端很有用。