无法从邮件服务器接收邮件

各位好,

我知道这是一个已知问题,而且很容易遇到。我已经阅读并尝试了许多测试,但目前在“发送邮件”这一步卡住了。

我参考了 https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md,以下是我的操作步骤:

git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse

进入 /samples/ 目录,将 standalone.yml 复制到 /containers/app.yml

请修改有关您服务器的信息。接下来:

sudo ./discourse-doctor

第一次尝试

当我的 app.yml 设置为:

DISCOURSE_HOSTNAME : 'localhost'

并填写以下信息:

  DISCOURSE_SMTP_ADDRESS: XXX
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: XXX
  DISCOURSE_SMTP_PASSWORD: XXX
  DISCOURSE_SMTP_ENABLE_START_TLS: true   

邮件服务器也构建在内部网络上。
起初,它可以正常工作。Discourse 可以正确发送注册邮件,我也能正常访问管理后台。

然而,当我将 HOSTNAME 设置为 localhost 时,我无法通过内部 IP(例如 10.1.X.X)在浏览器中访问。


第二次尝试

因此,我只修改了 DISCOURSE_HOSTNAME,没有更改 app.yml 中的其他信息。

DISCOURSE_HOSTNAME : '10.1.3.91'

注:10.1.3.91 是我的内部(局域网)IP 地址。

将主机名更改为此后,我可以在浏览器中访问它。但是,邮件服务器无法再正常工作,我无法收到来自 Discourse 的邮件。


补充说明

我尝试使用 Python 通过我的 SMTP 发送邮件。

脚本如下:

from email.mime.multipart import MIMEMultipart
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib

content = MIMEMultipart() 
content["subject"] = "Learn Code With Mike"  
content["from"] = " (我的邮箱) "  
content["to"] = " (测试邮箱) "
content.attach(MIMEText("Demo python send email"))  


with smtplib.SMTP(host=" (与 DISCOURSE_SMTP_ADDRESS 相同) ", port="587") as smtp: 
    try:
        smtp.ehlo() 
        smtp.starttls()  
        smtp.login(" (与 DISCOURSE_SMTP_USER_NAME 相同) ", " (与 DISCOURSE_SMTP_PASSWORD 相同) ") 
        smtp.send_message(content)  
        print("完成!")
    except Exception as e:
        print("错误信息:", e)

它可以正常工作。这是否证明邮件 SMTP 信息是正确的并且可以使用?

关于这个问题,有什么建议吗?

在邮件服务器方面,我还尝试过 Elastic EmailMailjet,但仍然无法工作。

结论:

如果 DISCOURSE_HOSTNAME 使用 localhost,邮件服务器可以工作。
如果 DISCOURSE_HOSTNAME 更改为内部 IP(即局域网 IP),邮件服务器无法工作。

非常感谢!!!

此致,
Chieh

更新:

在首次访问时,我可以在其他设备上通过特定的内部 IP 地址收到“恭喜您安装 Discourse!”和“注册管理员账户”的邮件。然而,完成这些步骤后,会出现错误提示找不到页面。为什么原本可以通过内部 IP 访问,设置之后该 IP 就失效了呢?
真奇怪……

问题似乎已经由我自己解决了。

前往 /etc/hosts

并将主机名设置为你的 IP 地址。
主机名也已设置为 IP 地址。

DISCOURSE_HOSTNAME 可以使用内部 IP 地址。
这样就能正常工作了。

(当然,这仅适用于内部使用。)