Существует ли способ увеличить интервал тайм-аута, пока Discourse ожидает подтверждения от SMTP-сервера о том, что письмо отправлено? Или, возможно, можно настроить Discourse так, чтобы он не требовал этого подтверждения?
У меня возникла проблема с дублированием писем на экземпляре Discourse. При отправке писем на доставку возникает ошибка Net::Timeout. Мой провайдер электронной почты фактически доставляет письма, но Discourse об этом не знает и продолжает пересылать их снова. Этот процесс повторяется бесконечно.
Да, насколько я могу судить. Соединение устанавливается, сообщение электронной почты отправляется, но после этого сообщается об ошибке Net::Timeout.
Используя скрипт discourse_doctor, я вижу, что при успешной транзакции возвращается ID сообщения, а при ошибке — Net::Timeout.
Эта проблема проявилась после обновления до версии Discourse 2.9.0.beta5. Предполагаю, что с этим обновлением Discourse стал менее терпим к такой ошибке.
Я не нашёл никаких связанных изменений в почтовых библиотеках Ruby и gem’ах net/smtp. Возможно, ваш SMTP-сервер работает некорректно? Есть ли возможность перейти на другой?
Спасибо за проверку. Я согласен, похоже, что проблема вызвана моим почтовым провайдером, который не отвечает достаточно быстро после отправки письма. Я могу лишь предположить, что проблема связана с нагрузкой, поскольку в некоторые дни я не сталкиваюсь с ней.
Смена почтового провайдера — это значительная сложность по ряду причин. Поэтому наиболее привлекательным решением является поиск способа настроить Discourse так, чтобы обойти эту проблему.
Переход на нового почтового провайдера кажется единственным решением этой проблемы, но это потребует перенастройки почтового провайдера для всего моего домена, чего я хотел бы избежать.
Можно ли внести какие-то изменения в код Discourse, отвечающий за отправку исходящей почты, чтобы он игнорировал ошибки отправки писем, как это делалось ранее? Я не разработчик на Rails, поэтому даже не знаю, с чего начать. Я не хочу нарушить возможность получения будущих обновлений Discourse.
На чем основано ваше утверждение? На самом деле получать почту можно только по одной инфраструктуре на домен/поддомен, но несколько сервисов могут пересылать почту от его имени.
В качестве альтернативы вы также можете создать новый поддомен, выделенный под ваш экземпляр, для настройки которого даже не потребуется пересборка.
Я пытался сделать это в прошлом, но неправильно настроил параметры и не смог разобраться, поэтому я неохотно меняю что-либо. Я также предпочел бы, чтобы письма от Discourse отправлялись с домена моей компании, но раз это больше не сработает, я попробую снова следовать вашей рекомендации и использовать поддомен для исходящей почты.
Я создал поддомен для электронной почты в Rackspace Cloud и подтвердил, что могу отправлять почту через него со своего Mac с помощью Apple Mail и curl. Также я подтвердил, что могу отправлять почту с моего сервера с помощью curl. Однако я получаю эту ошибку от discourse-doctor:
Testing sending to support@latenightsw.com using secure.emailsrvr.com:465, username:username with plain auth.
======================================== ERROR ========================================
UNEXPECTED ERROR
Net::ReadTimeout
====================================== SOLUTION =======================================
This is not a common error. No recommended solution exists!
Please report the exact error message above to https://meta.discourse.org/
(And a solution, if you find one!)
Мой файл app.yml содержит следующие настройки:
DISCOURSE_SMTP_ADDRESS: secure.emailsrvr.com # (mandatory)
DISCOURSE_SMTP_PORT: 465 # (optional)
DISCOURSE_SMTP_USER_NAME: username # (optional)
DISCOURSE_SMTP_PASSWORD: password # (optional, WARNING the char '#' in pw can cause problems!)
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (optional, default true)
Я пробовал установить DISCOURSE_SMTP_ENABLE_START_TLS в значение false. Другие сообщения об ошибке Net::ReadTimeout предлагают попробовать эту настройку, но это не дало никаких результатов:
@Falco, как мне внести это изменение в конфигурацию Discourse? Я не могу найти никакой документации о настройке, которую можно добавить в мой файл app.yml.