好吧,首先,这是生产环境,我无法发送第一封注册邮件。
我确信我的 SMTP 设置是正确的。
我可以使用所用端口 ping 和 telnet 我的邮件服务器,但一旦我执行"EHLO mailserver",连接就会被远程主机关闭。
在我的日志末尾,显示如下:
Rendering layouts/email_template.html.erb
Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 32)
Delivered mail f3853b94-b772-48c2-b1b7-a78bbcbfc5c1@discourse.mywebsite.com (60177.6ms)
Job exception: Net::ReadTimeout
我尝试确保 SMTP 设置正确,因此运行了 /var/discourse/discourse-doctor,但它无法验证我的设置。它显示:
==================== YML SETTINGS ====================
awk: not an option: --field-separator=:
DISCOURSE_HOSTNAME=
awk: not an option: --field-separator=:
SMTP_ADDRESS=
awk: not an option: --field-separator=:
DEVELOPER_EMAILS=
awk: not an option: --field-separator=:
SMTP_PASSWORD=
awk: not an option: --field-separator=:
SMTP_PORT=
awk: not an option: --field-separator=:
SMTP_USER_NAME=
awk: not an option: --field-separator=:
LETSENCRYPT_ACCOUNT_EMAIL=
但我的 YAML 文件(./containers/app.yml)格式看起来完全正确。
## TODO: The SMTP mail server used to validate new accounts and send notifications
# SMTP ADDRESS, username, and password are required
# WARNING the char '#' in SMTP password can cause problems!
DISCOURSE_SMTP_ADDRESS: mail.redacted.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: redacted@redacted.com
DISCOURSE_SMTP_PASSWORD: "redacted"
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (optional, default true)
## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
LETSENCRYPT_ACCOUNT_EMAIL: redacted@redacted.com
pfaffman
(Jay Pfaffman)
2020 年12 月 29 日 00:22
2
这听起来像是需要解决的问题。这与您描述的网络错误一致。
我猜测是您密码中的特殊字符让 Discourse-doctor 感到困惑。
这个地址看起来不像是一个 SMTP 地址。
我猜这个“mail.redacted.com ”应该是 HTTP 地址。
我认为你需要检查一下。
@irwinstar ,为了避免在公共论坛上暴露我的邮件服务器,我隐去了实际的邮件服务器地址。但我可以保证设置是正确的,因为我是从我的邮件客户端(已正常工作)复制的设置,并且也与我的实际邮件服务器的 SMTP 设置进行了比对。
感谢你的帮助提议。我认为问题出在 SPF/DKIM 记录上,所以我正在尝试修复它们。
不过,discourse-doctor 仍然应该能正确解析它。我不确定那里出了什么问题,因为我没有自己在 vim/nano 中编辑过该文件。明确一下,这个 YAML 文件是使用 discourse-setup 生成的。
我认为 Discourse 目前还不支持 465 端口协议。如果您的邮件服务器支持 587 端口,可以将其改为使用 587。
不幸的是,我的邮件服务器无法使用 587 端口,因此我在 Discourse 外部添加了一个邮件代理。
@irwinstar ,如果信息准确,这非常关键,也能解释我的邮件设置为何无法正常工作。请问您有该信息的来源吗?
我不太确定,但我试过几次 465 端口。
最终,我使用了 “hieulq/mailproxy” 这个 Docker 镜像作为邮件代理。
并在 Discourse 中使用了以下 app.yml 配置:
这种用法似乎不太理想,但确实能工作。
我今天尝试寻找一个邮件插件,但没找到任何合适的。
DISCOURSE_SMTP_ADDRESS: x.x.x.x
DISCOURSE_SMTP_PORT: 2525
DISCOURSE_SMTP_AUTHENTICATION: none
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
DISCOURSE_SMTP_ENABLE_START_TLS: false
neounix
(Dark Matter)
2020 年12 月 29 日 14:30
8
嘿 @simbleau
根据我的经验,SendGrid 运行良好(端口 587)。
你也可以免费试用 SendGrid!
感谢这些建议。
我尽量避免购买任何云邮件服务器或使用代理(因为如果我想用个不干净的方案,现在直接拿个管理员账号就行了),毕竟我已经在 HostGator 上有一台邮件服务器了。
我相信 SPF 记录已经针对我的 Discourse 服务器 IP 配置好了。我现在主要想验证 DKIM 记录。
如果有人能确认 465 端口不被允许,那将是个天大的好消息,这样我就不用在一个不存在的问题上钻牛角尖了。 465 确实是个问题,已在下方帖子中注明。
我在安装方面取得了一些进展。
使用端口 587 时,我可以成功通过 telnet 发送完整邮件并顺利通过身份验证。因此我进行了切换。
现在,当邮件发送时,我收到了以下错误:
Delivered mail d86b48cc-b0f4-4df3-8960-ab5ff96613a0@discourse.imbleau.com (251.0ms)
Job exception: hostname "mail.redacted.com" does not match the server certificate
但我注意到,这不再是连接超时(原本需要整整 60 秒才触发),而是在 250 毫秒内收到的不同异常。
这可能是因为我在系统@discourse.redacted.com 这个邮箱上进行了操作,但该邮箱内部使用的邮件服务器是 mail.redacted.com 。
说实话,我不确定该如何解决。我尝试了以下操作:
./launcher enter app
rails r "SiteSetting.notification_email = 'system@mail.redacted.com'"
exit
然后重新构建,仅作为一次性测试。但仍然无效,错误依旧。
已修复电子邮件问题!(discourse-doctor 仍解析不正确)
我进一步研究了 Ruby 以及该错误在幕后发生的原因,这引导我找到了 这个 Stack Overflow 问题 。
这就是罪魁祸首。解决方案涉及更改 SSL 协商,这使我想到在 app.yml 文件中关闭此设置:
DISCOURSE_SMTP_ENABLE_START_TLS: false # (可选,默认为 true)
之后,成功了!
RGJ
(Richard - Communiteq)
2020 年12 月 29 日 17:16
12
这将禁用 TLS 加密,而“唯一”的问题是使用了错误的主机名,即邮件服务器提供的证书中声明的名称并非 mail.redacted.com。许多电子邮件服务器通常有多个不同的主机名,您只需找出其证书中使用的是哪一个。
您可以尝试查看它声明的主机名是什么,并相应地调整您的配置。
echo | openssl s_client -connect mail.redacted.com:587 -starttls smtp -servername mail.redacted.com 2>/dev/null |openssl x509 -noout -subject
如果此方法无效,您可以保留 TLS 加密启用,仅禁用证书验证:
DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: false
感谢 @RGJ !奇怪的是,系统显示 CN 是我的一个子域名,与邮件完全无关。这值得调查一下。感谢您的指导。
pfaffman
(Jay Pfaffman)
2020 年12 月 30 日 17:19
14
您所有的用户都将拥有相同的信息。
如果您能私下将您的 app.yml 分享给我,我会看看能否找出是什么让 discourse-doctor 感到困惑。
pfaffman
(Jay Pfaffman)
2020 年12 月 30 日 21:38
16
哦。问题在于你使用的不是 GNU awk,而是其他版本的 awk,而 --field-separator 选项在你的 awk 中名称不同。
你使用的是哪个版本的 awk?运行的是什么操作系统?
man awk 显示 Version 1.3.4 2019-12-31 MAWK(1)
cat /etc/os-release 显示:
~$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
pfaffman
(Jay Pfaffman)
2021 年1 月 4 日 19:42
18
您能否尝试编辑 discourse-doctor,将 --field-separator 替换为 -F?
看起来这样可以解决问题。如果您确认,我将提交一个 PR。
部分生效了。错误消失了,但不再返回任何内容。
==================== YML 设置 ====================
DISCOURSE_HOSTNAME=
SMTP_ADDRESS=
DEVELOPER_EMAILS=
SMTP_PASSWORD=
SMTP_PORT=
SMTP_USER_NAME=
LETSENCRYPT_ACCOUNT_EMAIL=
问题已解决。
在 discourse-doctor 中,将第 213 行修改为以下内容:
read_config_result=$(echo $config_line | awk -F ":" '{print $2}')
这之所以有效,是因为 mawk 讨厌 -F=\":\",它严格要求使用空格,例如 -F ":"。
已提交 PR:Changed awk config command to be more cross platform by nuzzles · Pull Request #513 · discourse/discourse_docker · GitHub