首次注册邮箱未收到

你好,

我刚完成了一次 Discourse 的 全新安装

首次连接时,系统要求我为管理员账户创建用户名和密码,并应向我发送一封激活邮件。

但我没有收到这封激活邮件(当然我也检查了垃圾邮件文件夹),于是我 求助了“医生”,并按照要求向自己发送了一封测试邮件。这封邮件立即出现在我的收件箱中。

我知道可以通过命令行创建管理员账户,但我希望了解具体发生了什么,因为未来尝试注册的用户也可能遇到同样的问题。

您能帮忙吗?

此致,

可能出现了以下两种问题之一:

  • 邮件未发送
  • 邮件已发送,但未能送达

由于这是一个新实例,最简单的方法是通过 Rails 控制台检查所有出站邮件日志:

discourse(prod)> EmailLog.all.pluck(:to_address, :email_type, :created_at, :smtp_transaction_response)

如果您看到有记录,说明邮件至少已移交至 SMTP 服务器,这也是 Discourse 责任的终点。

如果您没有看到任何记录,则邮件很可能未发送。您可以尝试以管理员身份登录后,访问 /logs/sidekiq 路径,查看是否有相关的日志信息。

我们可以看到,使用 ./discourse-doctor 发送了 测试 消息(事实上我也确实收到了),但没有 注册 消息的记录:

discourse(prod)> EmailLog.all.pluck(:to_address, :email_type, :created_at, :smtp_transaction_response)
=> [["user@domain.org", "test_message", 2026-05-13 16:23:41.417177000 UTC +00:00, "250 2.0.0 Ok: queued as 4B4DDB0059A"]]

我们在 production.log 文件中找到了四条注册消息(事实上我尝试注册了四次)。但这些注册消息从未被收到,因此我猜测它们从未被发送过,即使没有错误或警告。我们可以注意到,那些日志中并没有成功发送(并收到)的测试消息的踪迹。

root@my-vps-app:/var/www/discourse/log# cat production.log | grep user
  Parameters: {"authenticity_token" => "ityyLIdjT7xvdxEd01LjMT08-xxxx", "email" => "user@domain.org", "username" => "admin", "password" => "[FILTERED]", "commit" => "Register"}
  Parameters: {"authenticity_token" => "tnDxYkOOwXYcv59Ez4t8vWPir-xxxx", "email" => "user@domain.org", "username" => "admin", "password" => "[FILTERED]", "commit" => "Register"}
  Parameters: {"authenticity_token" => "bvOwVYHS3N_UELipxVEG3L3LY-xxxx", "email" => "user@domain.org", "username" => "admin", "password" => "[FILTERED]", "commit" => "Register"}
  Parameters: {"authenticity_token" => "oo6GN-n7clGI5F1-uqzsZcadeP-xxxx", "email" => "user@domain.org", "username" => "admin", "password" => "[FILTERED]", "commit" => "Register"}

其他日志文件为空:

root@my-vps-app:/var/www/discourse/log# cat production_errors.log 
root@my-vps-app:/var/www/discourse/log# cat sidekiq.log 
root@my-vps-app:/var/www/discourse/log# cat unicorn.stderr.log 
root@my-vps-app:/var/www/discourse/log# cat unicorn.stdout.log 

Discourse 应用的 Docker 日志显示了四条消息,提示某些内容缺失(而我们恰好有四条失败的注册消息):

root@my-vps:/var/discourse# docker logs app
...
I, [2026-05-13T16:14:30.769269 #3290]  INFO -- : worker=7 gen=0 pid=4295 registered
I, [2026-05-13T16:14:30.815178 #4295]  INFO -- : worker=7 gen=0 pid=4295 ready
X-Accel-Mapping header missing
X-Accel-Mapping header missing
X-Accel-Mapping header missing
X-Accel-Mapping header missing

这能有所帮助吗?

由于注册邮件从未到达,我通过命令行激活了管理员账户。

我使用管理员账户登录,并从“管理员/邮件设置/服务器设置”发送了一封测试邮件到 anotheruser@anotherdomain.org

如下所示,该测试邮件立即发送并成功送达我的收件箱:

root@my-vps:/var/discourse# ./launcher enter app
x86_64 arch detected.
root@my-vps-app:/var/www/discourse# rails console
Loading production environment (Rails 8.0.5)
discourse(prod)> EmailLog.all.pluck(:to_address, :email_type, :created_at, :smtp_transaction_response)
=> 
[["user@domain.org",
  "test_message",
  2026-05-13 16:23:41.417177000 UTC +00:00,
  "250 2.0.0 Ok: queued as 4B4DDB0059A"],
 ["anotheruser@anotherdomain.org",
  "test_message",
  2026-05-16 14:44:42.978862000 UTC +00:00,
  "250 2.0.0 Ok: queued as D79DFB00573"]]

随后,我尝试使用相同的邮箱地址(anotheruser@anotherdomain.org)进行注册,但注册邮件未被送达(也未发送,因为它没有出现在 Rails 控制台的日志中)。

总之,测试邮件可以正常发送并送达,但注册邮件却未被发送,尽管我们在 production.log 中找到了相关记录:

cat production.log | grep anotheruser
  Parameters: {"email_address" => "anotheruser@anotherdomain.org"}
Started GET "/u/check_email?email=anotheruser%40anotherdomain.org" for xxx.xxx.xxx.xxx at 2026-05-16 17:40:45 +0000
  Parameters: {"email" => "anotheruser@anotherdomain.org"}
  Parameters: {"email" => "anotheruser@anotherdomain.org", "password" => "[FILTERED]", "username" => "NewUser", "password_confirmation" => "[FILTERED]", "challenge" => "xxxxxxxx", "timezone" => "Europe/Paris"}

用户无法注册,请问我该如何解决?

我终于切换到另一个 SMTP 服务商,一切运行正常,但我很沮丧,因为没能搞清楚到底发生了什么……

有的邮箱就是不行,我一开始也耗用很长时间,找不到原因,后来使用mailgun 就没问题,我知道的qq邮箱对discourse的支持不好用。

以管理员身份登录后,这里是否显示了任何内容:

那里应该有足够的信息来帮助您找出问题所在。