Сбой теста почты в discourse-doctor

Я пытаюсь устранить проблемы с SMTP, используя ./discourse-doctor

Самый близкий по теме вопрос, который я смог найти: Yet other SMTP 587 port email various errors.

До внедрения предложенных решений у меня постоянно возникало истечение времени ожидания.

После настройки:

DISCOURSE_SMTP_FORCE_TLS: true
DISCOURSE_SMTP_ENABLE_START_TLS: false

discourse-doctor выдаёт следующее:

==================== ТЕСТ ПОЧТЫ ====================
Для надёжного теста получите адрес на http://www.mail-tester.com/
Или просто отправьте тестовое сообщение себе.
Адрес электронной почты для теста? ('n' чтобы пропустить) [admin@burlyqna.org]:
Отправка письма на admin@burlyqna.org. . .
Проверка отправки на admin@burlyqna.org через smtp.mailfence.com:465, имя пользователя: philion@mailfence.com с использованием простой аутентификации.
Подключение к SMTP-серверу успешно.
Отправка на admin@burlyqna.org. . .
Отправка письма не удалась.
достигнут конец файла

См.: http://talk.burlyqna.org/NjdhMDAwYTk4NmM3MmM1.txt

Я могу внешне проверить конфигурацию SMTP-сервера с помощью:

swaks --to philion@gmail.com --from admin@burlyqna.org --server smtp.mailfence.com:465 --auth LOGIN --tlsc --auth-user philion@mailfence.com

Есть ли какие-либо подсказки, почему Подключение к SMTP-серверу успешно, но Отправка письма не удалась?

Большое спасибо,
Пол

Для TLS следует использовать порт 587?

Попробуйте добавить puts error.backtrace (или аналогичный код) после

и снова запустить discourse-doctor.

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

Томас,

В форумах поддержки идет много обсуждений, касающихся порта 465. Судя по тому, что я прочитал, Discourse делает множество предположений относительно SSL и TLS при использовании SMTP, и есть несколько переменных окружения, которые управляют детальным поведением.

ОДНАКО, учитывая количество сообщаемых об ошибках и связанных вопросов в этих форумах, у меня сложилось сильное впечатление, что эти настройки плохо документированы и их сложно использовать. И, видя похожие проблемы, которые прослеживаются с 2017 года, можно сказать, что это проблема уже много лет.

Поиски по запросам «port 465» или «Net::ReadTimeout smtp» могут выдать длинный список аналогичных проблем.

Я попробую. Спасибо!

Томас,

Я пытаюсь найти этот файл при сборке Docker, но не могу. Вижу, что он упакован в контейнер, но я клонировал репозиторий discourse/discourse_docker, а не discourse/discourse.

Когда я пытаюсь войти в приложение с помощью команды launcher enter app, нет возможности отредактировать этот файл или установить vi.

Я не могу найти никакой документации или флагов для запуска ./discourse-doctor с включенными отладочными логами.

Ошибка возникает так же: невозможно отправить письмо, утилита ./discourse-doctor сообщает ту же ошибку.

Обновил app.yml, как было предложено, пересобрал приложение (без почты), запустил ./discourse-doctor и получил то же сообщение об ошибке.

./launcher enter  app
sudo apt update && sudo apt install neovim -y

должно помочь.

Спасибо! Я уже совсем стар, если не могу просто написать «sudo apt install vi». Приходится помнить, что теперь это называется neovim.

Учитывая предложенное изменение для вывода трассировки стека, предлагаю: http://talk.burlyqna.org/ODgyZjg5Y2QyMTU1ZmEx.txt

Соответствующий фрагмент:

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:237:in `rbuf_fill'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:199:in `readuntil'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:209:in `readline'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1017:in `recv_response'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1008:in `block in getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1027:in `critical'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1006:in `getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:986:in `quit'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:732:in `do_finish'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `ensure in start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/message.rb:269:in `deliver!'
/usr/local/lib/ruby/3.3.0/delegate.rb:87:in `method_missing'
/var/www/discourse/lib/email/sender.rb:296:in `send'

Похоже, другая сторона разорвала соединение.

Кстати: http://talk.burlyqna.org/NjdhMDAwYTk4NmM3MmM1.txt больше недоступен

Сохраняются ли эти файлы журналов при пересборке?

Я обновил пароли, убрав из них символы, дождался распространения изменений SMTP-аутентификации (времени хватило, чтобы перекусить), подтвердил правильность учетных данных с помощью swaks для отправки писем и…

Та же ошибка.

Я заметил, что при пересборке дамп стека исключается, поэтому я добавлю его обратно и попробую выполнить ./launcher destroy app && ./launcher start app.

Установлена трассировка отладки, запущена проверка:
http://talk.burlyqna.org/NWQ5MjBlMTIwN2JiNGNl.txt

==================== ТЕСТ ПОЧТЫ ====================
Для надежного теста получите адрес на http://www.mail-tester.com/
Или просто отправьте тестовое сообщение себе.
Адрес электронной почты для теста? ('n' чтобы пропустить) [admin@burlyqna.org]:
Отправка письма на admin@burlyqna.org. . .
Проверка отправки на admin@burlyqna.org через smtp.mailfence.com:465, имя пользователя: philion с простым аутентификацией.
Соединение с SMTP-сервером успешно.
Отправка на admin@burlyqna.org. . .
Отправка письма не удалась.
достигнут конец файла
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:237:in `rbuf_fill'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:199:in `readuntil'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:209:in `readline'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1017:in `recv_response'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1008:in `block in getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1027:in `critical'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1006:in `getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:986:in `quit'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:732:in `do_finish'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `ensure in start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/message.rb:269:in `deliver!'

Вы пробовали использовать полный адрес электронной почты в качестве имени для входа?

Обновил app.yml для использования полного email в качестве пользователя, выполнил повторное развертывание командой ./launcher destroy app && ./launcher start app.

Та же ошибка: http://talk.burlyqna.org/ZDg1YWE1YTA2YWU1Zjhj.txt

Команды destroy и start также очистили отладочную информацию, но я предполагаю, что проблема та же:

case rv = @io.read_nonblock(BUFSIZE, tmp, exception: false)

возвращает nil, что приводит к EOF и ответу без ошибок.

После множества тестов и большой помощи от @thoka я предлагаю следующее резюме:

Я могу запускать тесты SMTP, используя те же учётные данные, что и в container/app.yml, которые работают как с swaks (Swaks - Swiss Army Knife for SMTP), так и с примером кода на Ruby, предоставленным @thoka (см. ниже).

Эти тесты работают стабильно. Однако при попытке развернуть сервер Discourse (который не может отправить начальное письмо пользователю-администратору) или при использовании бота discourse-doctor возникают ошибки отправки почты:

==================== ПРОВЕРКА ПОЧТЫ ====================
Для надёжного теста получите адрес на http://www.mail-tester.com/
Или просто отправьте тестовое сообщение себе.
Адрес электронной почты для проверки? ('n' чтобы пропустить) [admin@burlyqna.org]:
Отправка письма на admin@burlyqna.org. . .
Проверка отправки на admin@burlyqna.org через smtp.mailfence.com:465, имя пользователя: xxx@mailfence.com с обычной аутентификацией.
Успешное подключение к SMTP-серверу.
Отправка на admin@burlyqna.org. . .
Отправка письма не удалась.
достигнут конец файла

Похоже, это ошибка конфигурации протокола, так как я могу отправлять тестовые письма, используя стандартные инструменты Ruby:

require 'mail'

SMTP_SERVER = 'smtp.mailfence.com'
SMTP_PORT = 465
USERNAME = 'xyz'
PASSWORD = '...'

FROM = 'admin@burlyqna.org'
TO = 'testing@gmail.com'
SUBJECT = 'Test from Ruby'

BODY = "Hello,\n\nThis is a test email sent from Ruby over a SSL-secured connection.\n\nBest regards!"

Mail.defaults do
  delivery_method :smtp, {
    address: SMTP_SERVER,
    port: SMTP_PORT,
    user_name: USERNAME,
    password: PASSWORD,
    domain: "burlyqna.org",
    enable_starttls_auto: :false,
    authentication: :plain,
    ssl: true,
  }
end

begin
  puts 'Sending email...'
  puts "SMTP_SERVER: #{SMTP_SERVER}"
  puts "SMTP_PORT: #{SMTP_PORT}"
  puts "USERNAME: #{USERNAME}"
  puts "PASSWORD: #{PASSWORD}"
  puts "FROM: #{FROM}"
  puts "TO: #{TO}"

  mail = Mail.new do
    to TO
    from FROM
    subject SUBJECT
    body BODY
  end

  mail.deliver!
end

Текущие настройки SMTP в моём app.yml:

DISCOURSE_SMTP_ADDRESS: smtp.mailfence.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: xxx@mailfence.com
DISCOURSE_SMTP_PASSWORD: '...'
DISCOURSE_SMTP_FORCE_TLS: true                   # https://meta.discourse.org/t/cannot-send-email-problem-with-port-465/246004/8
DISCOURSE_SMTP_ENABLE_START_TLS: false           # (необязательно, по умолчанию true)
DISCOURSE_SMTP_DOMAIN: burlyqna.org              # (требуется некоторыми провайдерами)
DISCOURSE_NOTIFICATION_EMAIL: noreply@talk.burlyqna.org

Финальное обновление: почта работает!

Проблемы, с которыми я столкнулся по пути:

  • DISCOURSE_SMTP_PASSWORD содержала символы, но не была заключена в кавычки
  • DISCOURSE_SMTP_FORCE_TLS: true для включения SSL
  • DISCOURSE_SMTP_ENABLE_START_TLS: false для отключения рукопожатия TLS
  • DISCOURSE_NOTIFICATION_EMAIL установлен на несуществующий адрес электронной почты
DISCOURSE_SMTP_ADDRESS: smtp.mailfence.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: example@mailfence.com
DISCOURSE_SMTP_PASSWORD: 'passwd'
DISCOURSE_SMTP_FORCE_TLS: true                  
DISCOURSE_SMTP_ENABLE_START_TLS: false
DISCOURSE_NOTIFICATION_EMAIL: admin@example.org