设置路由器端口转发以接收邮件

我已将一个可正常工作的测试环境从 DigitalOcean 迁移到一个家庭 Linux 服务器(Ubuntu),但一直无法让入站邮件正常工作。我已在路由器上设置了端口转发 25,并且可以通过查看邮件日志(能在日志中看到发件人和收件人)来发现邮件已到达。邮件接收器尝试将电子邮件 POST 到 Discourse 时似乎出现了故障,并且我收到了超时错误。我怀疑这是因为我的 ISP 不允许通过路由器进行回送,因此如果 Discourse 实例的公共域名在 POST 命令中使用,它将挂起,因为根本没有响应,路由器会丢弃数据包。

这也导致我无法在运行 Discourse 的机器上查看 Discourse 网站……直到我意识到可以在 /etc/hosts 文件中添加一行,将公共域名指向内部网络 IP 地址,从那时起我就可以在 Firefox 中查看 Discourse 实例了。

我推测可能有一些方法可以让 mail-receiver 容器知道要做类似的事情。根据我的研究,它不使用 /etc/hosts 文件,这可能是问题的根源。我尝试在 mail-receiver.yml 文件中添加行以允许 extra_hosts:,但似乎无法使其生效。如果我进入 mail-receiver 应用程序并尝试向 /etc/hosts 添加另一行(使用 cat >>),尽管我能看到该行出现,但问题依然存在。

这是日志中显示 POST 失败的行(注意:此示例中的域名是虚构的):

<23>Feb 23 01:00:31 receive-mail[133]: Recipient: abc@example-discourse.org.uk<19>Feb 23 01:01:31 receive-mail[133]: Failed to POST the e-mail to https://example-discourse.org.uk/admin/email/handle_mail: execution expired (Net::OpenTimeout)<19>Feb 23 01:01:31 receive-mail[133]: /usr/lib/ruby/2.7.0/net/http.rb:960:in `initialize’

有什么想法吗?

在又试了一次并意识到我把 IP 地址/主机名在 /etc/hosts 文件中放反了之后,我认为我已经搞定了。但是,如果 mail-receiver 容器被重启,它会丢失我添加到容器的 /etc/hosts 文件中的额外行。有什么方法可以让 mail-receiver.yml 文件自动添加额外行吗?

您可以查看其他修改文件的模板。例如,Web 模板就是这样做的。