如何让 Discourse 与 Postfix 协同工作

你好。我在本地服务器上运行了一个未使用 Docker 的 Discourse,并安装了 iRedMail。起初我尝试使用 mail.ru 的 SMTP 服务器。测试邮件和邀请邮件都能成功发送,但邮件通知没有收到,密码重置邮件也未到达。于是我决定安装本地邮件服务器,以便通过日志排查邮件为何无法发出。我照做了,本地邮箱之间的邮件可以正常收发,这足以用于测试。我以为这对本地 Discourse 和邮件服务已经足够了。我配置了本地 SMTP 服务器,发送了一封测试邮件……它确实收到了!结果并非如此(苦笑)。我查看了邮件服务器的 /var/log/mail.log 日志:

。现在,我尝试向同一邮箱发送邀请邮件……查看邮件服务器日志……却没有任何记录,日志为空。我不知道问题出在哪里。

我只想知道如何让 Discourse 与 Postfix 正常通信。

目前,我通过手动启用方式激活了一个管理员账户,原因不言而喻:我没有收到验证邮件。如有需要,我可以提供配置文件和日志等文件。

亲爱的 @Anv

欢迎来到 Discourse Meta。

通常遇到此类问题时,我们会运行类似以下命令:

sendmail -vvv A_VALID_EMAIL_ADDRESS < email.txt

这将为您提供与 SMTP 服务器握手过程的详细输出;通常,这些详细的日志记录会为您提供解决问题的线索。

希望这能帮到您。

1 个赞

你好!我没有太多经验。第一次安装 Discourse 和邮件服务器。能否详细说明一下我具体需要做什么?谢谢。

@Anv

首先,您需要暂时“忘记”Discourse,专注于配置、测试并确认您的 SMTP 邮件中继能够正常中继邮件。

您是否已经完成了这一步?

1 个赞

我按照这个链接安装了 iRedMail:

跳过了第 5 步和第 9 步。

@Anv

这确实是一个高级安装。

你试过在没有 Discourse 的情况下测试并确保它正常工作吗?

比如:

sendmail -vvv A_VALID_EMAIL_ADDRESS < email.txt

我在本地域名 “@ugda.space” 中创建了两个邮箱,结果它们之间的邮件互相发送成功。但发送到 Gmail、Mail.ru 或 Yandex 邮箱时,邮件无法互相送达。我原本没有设置这些外部邮箱,因为我认为仅靠本地内部通信就足以进行测试。

@Anv 让我直说吧:一个好的不成文规则应该是“如果你不愿意花精力去倾听,就不要要求别人和你交谈”。这里的“倾听”指的是认真考虑对方告诉你的内容。参与论坛讨论,我猜,也算作“要求别人和你交谈”,尤其是当你寻求帮助时。

反复重复同样的话,并迫使对话者也重复自己,这对任何人都没有好处。

那么,你为什么不先运行这个命令行呢?

对不起。我想我还没有完全理解需要我做什么。我做得对吗?

@Anv

我理解你的沮丧;很抱歉我无法每次你回复时都有更多空闲时间来调试你的 SMTP 中继问题。

看起来你的 SMTP 邮件主机正在接收邮件;但这并不一定意味着它能作为 SMTP 中继正常工作。

我记得,凭印象,有一个标志可以使用 sendmail 和其他邮件客户端来检查 SMTP 主机是否作为中继正常工作。你可以研究一下 sendmail -G 选项(或寻找其他测试方法)。基本上,你需要使用新配置的 SMTP 主机作为中继,将邮件发送到一个与你当前主机不同的测试邮箱地址。

一些背景

在过去,大多数 SMTP 主机默认就可以中继邮件;但随后互联网上的所有 SMTP 主机都变成了巨大的垃圾邮件箱,因为垃圾邮件发送者会利用中继功能(主机所有者并不知情)向全世界发送垃圾邮件。

总之,你需要检查你新配置的 SMTP 主机是否能为你中继邮件。

你是否仔细查看过配置教程,看看其中是否提到了将 SMTP 主机设置为中继?

我只是在随口说说,希望这能在某种程度上帮助你推进 SMTP 主机项目的下一步。

好的,我想我明白你的意思了。我会看看能不能找到这方面的信息。

1 个赞

您提到您已在不使用 Docker 的情况下安装了 Discourse。您是否可以使用新安装时注册的邮箱,以“经典”方式(即使用 Docker)重新进行一次全新安装?或者您无法在所使用的机器上运行 Docker?

1 个赞

我尝试过使用 Docker,但完全没有收到邮件。我甚至无法创建管理员账户。由于缺乏经验,我决定卸载 Docker。

@Mevo@Anv

早上好。

我知道这或许没什么帮助,但作为“又一个数据点”,我在 Docker 生产环境部署或 macOS 桌面“无 Docker”开发环境中配置 Discourse 的 SMTP 邮件时从未遇到过问题;不过我一直使用的是第三方 SMTP 服务。

你们引起了我的注意;因此我现在对这个小谜题非常感兴趣,并打算在未来几周内找个时间,在一台 VPS Ubuntu Linux 实例上搭建 SMTP 中继,看看能否让 Discourse 与“老式”SMTP 中继配合工作,而不是依赖“第三方解决方案”。

如果构建这个配置需要几周时间,我提前致歉。因为我最近沉迷于学习 Discourse 插件开发和 Rails 的各种组件运作,导致在一大堆枯燥的政府文书工作上落后了。

1 个赞

你好 @neounix

无论如何,非常感谢你在这方面对我的帮助。

也许我主要的问题是,我想在局域网内运行此服务,而不允许从外部网络访问。

发送邀请期间的 Discourse 日志

日志显示有一封带有 ID 的邮件。
尝试查找该 ID 的相关提及。
1 ID - 测试消息。
2 ID - 邀请

image

经过一些尝试和错误,我已经成功让 Discourse 与 Postfix 协同工作。以下是我所使用的步骤,希望能对您有所帮助:

  1. 设置一条 A 记录,将其指向您的新服务器,例如 forum.domain.com

  2. 安装 Postfix,将 myhostname 设置为 forum.domain.com,并将 172.17.0.0/16 添加到 mynetworks,以便 Discourse 容器无需身份验证即可与 Postfix 通信。172.17.0.0/16 是 Docker 容器默认使用的网络。

  3. 确保 Postfix 可以发送邮件。我推荐使用 swaks

    swaks -t your_name@gmail.com
    

    您应该会收到一封主题为“这是一封测试邮件”的电子邮件。

  4. containers/app.yml 中,确保注释掉以下三行:DISCOURSE_SMTP_USER_NAMEDISCOURSE_SMTP_PASSWORDDISCOURSE_SMTP_ENABLE_START_TLS

    并将 DISCOURSE_SMTP_DOMAIN 设置为 forum.domain.com(请在此处替换为您自己的域名)。

  5. 进行测试时,可以通过 docker exec -it app bash 连接到 Discourse 容器,然后运行:

    apt update
    apt install -y swaks
    swaks -t name@gmail.com --server forum.domain.com
    

    您应该会收到一封主题为“这是一封测试邮件”的电子邮件。

  6. 使用 ./launcher rebuild app 重启 Discourse。现在您应该能够创建新账户并收到验证邮件。

2 个赞