SMTP 设置在使用 GMail 的 smtp-relay 时不起作用

我无法在使用 Discourse 和 Gmail 的 SMTP 时成功配置 SMTP。

我已在 Google 设置中启用了 SMTP 中继,允许从我的域名发送(未进行 IP 白名单限制),并使用 SMTP 认证加加密。

Discourse 托管在 forum.example.com 上。

DISCOURSE_SMTP_ADDRESS: smtp-relay.gmail.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: noreply@example.com
DISCOURSE_SMTP_PASSWORD: password
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_DOMAIN: mydomain.io
DISCOURSE_NOTIFICATION_EMAIL: noreply@example.com
DISCOURSE_SMTP_ENABLE_START_TLS: true

当我添加 NOTIFICATION_EMAILSMTP_DOMAIN 环境变量时,曾遇到通用错误 Job exception: end of file reached,现在我看到的是:

503 5.5.1 bad sequence of commands x20sm63393lfr.126 - gsmtp

这是在运行 doctor 并尝试向我自己发送邮件时出现的。

我已将 DISCOURSE_SMTP_DOMAIN 更改为与 forum.mydomain.io 匹配,但仍然出现相同的错误。

除了更改环境变量、重新构建并寄希望于它能工作之外,我该如何进一步调试此问题?

提前感谢。

与其重新构建,你可以:

./launcher destroy app 
./launcher start app 

有一些关于如何让 Google 相关功能正常运行的讨论。这是可能的,但并不简单。而且它可能每个月都在变化。:wink:

虽然我相信 @kvsf 的错误已经修复,或者你们的配置中已经发生了一些根本性的变化,但我还是想继续这个帖子,发布我自己的配置、我的进一步尝试以及我在同一问题领域寻求帮助。

基本配置

  • Google Workspace Business Starter
  • 配置 Gmail 路由 > SMTP 中继,使用 i) 仅限域内注册用户,ii) IP 白名单(我的论坛托管服务器 IP)并强制执行 SMTP 身份验证,iii) 强制执行 TLS
  • discourse docker 安装,遵循 discourse 文档
  • app.yml 配置如下:
expose:
  - "80:80"   # http
  - "443:443" # https

env:
  DISCOURSE_HOSTNAME: "forum.mydomain.com"
  DISCOURSE_DEVELOPER_EMAILS: 'dev@mydomain.com'

  DISCOURSE_SMTP_ADDRESS: "smtp-relay.gmail.com"
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: "user@mydomain.com"
  DISCOURSE_SMTP_PASSWORD: "mypass"
  DISCOURSE_SMTP_ENABLE_START_TLS: true
  DISCOURSE_SMTP_AUTHENTICATION: login
  DISCOURSE_SMTP_OPEN_TIMEOUT: 25
  DISCOURSE_SMTP_READ_TIMEOUT: 25
  DISCOURSE_SMTP_DOMAIN: "mydomain.com"
  DISCOURSE_NOTIFICATION_EMAIL: "noreply@mydomain.com"
  LETSENCRYPT_ACCOUNT_EMAIL: dev@mydomain.com

我的测试

运行 ./discourse-doctor 时,此配置会导致以下错误:

Testing sending to ...
SMTP server connection successful.
Sending to artificial.testadress@gmail.com. . .
Sending mail failed.
end of file reached

我首先通过 discourse 和邮件日志 检查了不同的日志。
通过 docker exec -it <CONTAINER_ID> bash 从 docker 内部手动测试相同的过程,使用:

openssl s_client -starttls smtp -crlf -connect smtp.gmail.com:587

没有遇到任何问题,运行正常。所以我认为要么是我的 app.yml 中的参数配置有问题,要么是 discourse 内部存在脚本通信错误,或者……有太多可能性了。^^
为了在测试不同设置时不必每次更改 app.yml 后都运行 ./launcher rebuild app,我开始直接编辑 /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb,将现有代码更改为:

class SMTP
  attr_accessor :settings

  DEFAULTS = {
    :address              => 'smtp-relay.gmail.com',
    :port                 => 587,
    :domain               => 'mydomain.com',
    :user_name            => 'user@mydomain.com',
    :password             => 'mypass',
    :authentication       => 'login',
    :enable_starttls      => nil,
    :enable_starttls_auto => true,
    :openssl_verify_mode  => 'peer',
    :ssl                  => nil,
    :tls                  => nil,
    :open_timeout         => 25,
    :read_timeout         => 25
  }

  def initialize(values)
    self.settings = DEFAULTS #.merge(values)
  end

这会导致与上述情况相同的行为(给定自定义的 app.yml 设置)。

寻求帮助

我现在卡住了。当然,我可以尝试更多剩余的设置(甚至可以切换回仅使用 SSL,尽管 discourse 已弃用此功能),但我想:

  1. 学习如何更深入地分析这个问题
  2. 从而理解真正发生的事情以及问题所在
  3. 修复它,并能够顺利使用所有功能(+最终让论坛正常运行)

提前感谢您的帮助。

推送*
有什么想法/建议吗?

这个问题解决了吗?我正想做完全相同的事情,但看到这个帖子让我有点紧张。

我不确定 Gmail 的情况,但 Zoho 不起作用了,而且 Outlook 在我曾参与管理的电子商务网站上停止工作了。

使用像 Mailersend 这样的事务性电子邮件服务已经有一段时间是最佳实践了,而且随着时间的推移,这正变得越来越必要。

编辑以澄清:这是电子邮件提供商方面的阻止,而不是可以在 Discourse 或服务器端修复的问题。大多数提供商不再支持使用 SMTP 发送事务性电子邮件,如果他们曾经正式支持过的话。