Настройка SMTP не работает с smtp-relay от GMail

У меня не получается настроить SMTP для Discourse с использованием SMTP от GMail.

Я включил ретрансляцию SMTP в настройках Google, разрешил отправку с моего домена (без белых списков 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

Сначала я получил общую ошибку Job exception: end of file reached. После добавления переменных окружения NOTIFICATION_EMAIL и SMTP_DOMAIN теперь вижу:

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 (подключившись с помощью docker exec -it <CONTAINER_ID> bash) через

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

не вызывает проблем и работает нормально. Поэтому я считаю, что либо мои параметры конфигурации в app.yml странные, либо внутри Discourse есть какая-то нестыковка в скриптах, либо… так много возможностей. ^^
Чтобы не выполнять ./launcher rebuild app каждый раз после изменения app.yml для проверки различных настроек, я начал напрямую редактировать /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. исправить это и использовать всё гладко (+наконец-то запустить форум корректно)

Заранее благодарю за помощь.

push
Есть какие-нибудь идеи или предложения?

Это уже решено? Я планирую сделать именно это и наткнулся на этот пост, что меня немного настораживает.

Я не уверен насчёт Gmail, но Zoho не работает, и Outlook перестал работать на сайте электронной коммерции, где я был частью администрации.

Давно уже лучшей практикой является использование сервиса транзакционной почты, такого как MailerSend, но со временем это становится всё более обязательным требованием.

Редакция для уточнения: проблема заключается в блокировке со стороны провайдера электронной почты, и её нельзя исправить на стороне Discourse или сервера. Большинство провайдеров больше не поддерживают (а возможно, никогда официально и не поддерживали) отправку транзакционных писем через SMTP.