Проблемы с отправкой почты через SMTP-ретранслятор

Здравствуйте,
у нас возникли проблемы с отправкой писем через SMTP-релей без необходимости ввода логина и пароля. Отправка писем на релей с помощью mailx / sendmail работает.
Вот используемые настройки:

 DISCOURSE_SMTP_ADDRESS: xyz.example.com (скрыто)
 DISCOURSE_SMTP_PORT: 587
 DISCOURSE_SMTP_AUTHENTICATION: plain

При запуске утилиты discourse_doctor возвращается следующая ошибка:

Net::ReadTimeout

Кажется, что отправляемое SMTP-сообщение сформировано некорректно, так как мы отправляем данные, но ничего не получаем обратно на порт 587. Это можно подтвердить с помощью трассировки Wireshark.

Не могли бы вы подробнее объяснить, как включить более подробное логирование или дополнительную отладку, чтобы мы могли глубже проанализировать проблему? Обычные логи ничего не показывают. Я нашел backtrace, но я не разработчик на Ruby, поэтому не могу его интерпретировать.

/usr/local/lib/ruby/3.2.0/net/protocol.rb:229:in `rbuf_fill'

/usr/local/lib/ruby/3.2.0/net/protocol.rb:199:in `readuntil'

/usr/local/lib/ruby/3.2.0/net/protocol.rb:209:in `readline'

net-smtp-0.3.3/lib/net/smtp.rb:1057:in `recv_response'

net-smtp-0.3.3/lib/net/smtp.rb:659:in `block in do_start'

net-smtp-0.3.3/lib/net/smtp.rb:1067:in `critical'

net-smtp-0.3.3/lib/net/smtp.rb:659:in `do_start'

net-smtp-0.3.3/lib/net/smtp.rb:611:in `start'

/var/www/discourse/vendor/bundle/ruby/3.2.0/bundler/gems/mail-5b700fc95ee6/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'

/var/www/discourse/vendor/bundle/ruby/3.2.0/bundler/gems/mail-5b700fc95ee6/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'

/var/www/discourse/vendor/bundle/ruby/3.2.0/bundler/gems/mail-5b700fc95ee6/lib/mail/message.rb:269:in `deliver!'

/usr/local/lib/ruby/3.2.0/delegate.rb:87:in `method_missing'

/var/www/discourse/lib/email/sender.rb:286:in `send'

/var/www/discourse/app/jobs/regular/user_email.rb:79:in `send_user_email'

/var/www/discourse/app/jobs/regular/user_email.rb:39:in `execute'

/var/www/discourse/plugins/chat/lib/chat/user_email_extension.rb:6:in `execute'

/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform'

rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in `with_connection'

/var/www/discourse/app/jobs/base.rb:236:in `block in perform'

/var/www/discourse/app/jobs/base.rb:232:in `each'

/var/www/discourse/app/jobs/base.rb:232:in `perform'

sidekiq-6.5.8/lib/sidekiq/processor.rb:202:in `execute_job'

sidekiq-6.5.8/lib/sidekiq/processor.rb:170:in `block (2 levels) in process'

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:177:in `block in invoke'

/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call'

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:179:in `block in invoke'

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:182:in `invoke'

sidekiq-6.5.8/lib/sidekiq/processor.rb:169:in `block in process'

sidekiq-6.5.8/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:113:in `local'

sidekiq-6.5.8/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'

sidekiq-6.5.8/lib/sidekiq.rb:44:in `block in <module:Sidekiq>'

sidekiq-6.5.8/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'

sidekiq-6.5.8/lib/sidekiq/processor.rb:263:in `stats'

sidekiq-6.5.8/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:13:in `call'

sidekiq-6.5.8/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:80:in `global'

sidekiq-6.5.8/lib/sidekiq/processor.rb:124:in `block in dispatch'

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:39:in `prepare'

sidekiq-6.5.8/lib/sidekiq/processor.rb:123:in `dispatch'

sidekiq-6.5.8/lib/sidekiq/processor.rb:168:in `process'

sidekiq-6.5.8/lib/sidekiq/processor.rb:78:in `process_one'

sidekiq-6.5.8/lib/sidekiq/processor.rb:68:in `run'

sidekiq-6.5.8/lib/sidekiq/component.rb:8:in `watchdog'

sidekiq-6.5.8/lib/sidekiq/component.rb:17:in `block in safe_thread'

Я откатил приложение до последней стабильной версии, но это не решило проблему. Человек, который занимался этим ранее, находится в отпуске, поэтому я не могу узнать, какая версия использовалась до последнего обновления. Также я заметил, что недавно были внесены изменения в код, касающиеся работы с почтой. Возможно, проблема там?

Спасибо

Возможно, в вашем почтовом движке возникают таймауты — это уже упоминалось в одной из недавних тем. По умолчанию в Postfix таймаут составляет 5 секунд.

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

При этом я ещё даже не начал решать проблемы с почтовым агентом, в частности, получение включения в белый список у нескольких интернет-провайдеров. У меня уже работают SPF и DKIM.

Спасибо за ответ, да, но я ищу что-то, что подскажет, в чём проблема. Это непросто, так как трассировка Wireshark показывает, что письмо отправлено, но ответа нет. Обычная отправка писем через Linux sendmail работает без проблем. SPF и DKIM также настроены для соответствующих доменов. Я могу воспроизвести проблему в консоли Rails.

message = TestMailer.send_test(“ycxi@examle.com”)
Email::Sender.new(message, :test_message).send

Я совсем не эксперт в Ruby, попробую получить более подробное логирование, чем просто стек вызовов:

[5] pry(main)> wtf?
Exception: Net::ReadTimeout: Net::ReadTimeout

Мы решили аналогичную проблему, увеличив пороги тайм-аута SMTP в файле app.yml — обратитесь к этой теме:

Как был изменён файл app.yml:
image

После изменения YAML-файла приложение было пересобрано:
sudo ./launcher destroy app && sudo ./launcher start app

Изменения отобразились в графическом интерфейсе: