Мы только что перенесли наш самодостаточный экземпляр Discourse с одного сервера на другой. Все настройки были перенесены со старой системы на новую, включая «ответ через электронную почту» и «разрешение новых сообщений через электронную почту». Для обработки электронной почты мы используем связку discourse/mail-receiver.
Функционал «ответить» и «создать новое сообщение по почте» отлично работал в старой системе, но на новом сервере возникла проблема: функция «ответить» больше не работает.
Как неизвестный пользователь, когда я отправляю письмо на специально настроенный для этого адрес, я вижу входящее письмо. Создается новый пользователь в статусе «на рассмотрении». Сообщение публикуется. Отлично!
Как пользователь команды, я могу ответить на это сообщение, и оно доставляется корректно. Супер!
НО повторная отправка ответа на это письмо, которая должна привести к ответу в Discourse, не удаётся. Когда сообщение поступает в mail-receiver, он пытается передать его через API, но это завершается ошибкой, о чём свидетельствуют следующие записи в логах.
(По соображениям конфиденциальности я изменил имена пользователей и домены)
Как я уже сказал, вся эта цепочка обмена сообщениями отлично работала в старой настройке. Новая настройка полностью идентична старой (local_discourse/app и local_discourse/mail-receiver).
Не могли бы вы подсказать, почему API handle_mail возвращает ошибку 400 при ответе на письмо?
Возможно ли сделать логирование более подробным, чтобы я мог глубже разобраться в проблеме?
Меня интересует, в чём разница между «новым письмом» и «ответом на письмо». Я бы сказал, что единственное существенное различие — это получатель. Однако оба типа писем обрабатываются одним и тем же обработчиком (mail-receiver) и отправляются в один и тот же API: https://forum.acme.org/admin/email/handle_mail.
Проблема не в части MX. Письма действительно доходят до mail-receiver, как показывают логи, но как только они отправляются в API, возвращается ошибка 400 (что означает некорректный запрос).
Однако в настройках есть разница: я поставил перед ним обратный прокси (nginx), чтобы получить функциональность «временного отключения» и, возможно, разместить другие сайты на том же хосте. Всё равно не понимаю, в чём может быть проблема, ведь новые темы принимаются без сбоев. Тем не менее, я проверю, что произойдёт, если исключить обратный прокси из схемы…
Обновление
Увы! Я перенёс установку Discourse из-за обратного прокси nginx (фактически пересоздав app с правильными настройками и остановив nginx), но это совсем не решило проблему!
Теперь я действительно в тупике. Что здесь происходит?
Краткое резюме:
Наша предыдущая установка Discourse (app и mail-receiver) могла принимать новые темы и ответы
После миграции на новый сервер (абсолютно идентичный) новые темы всё ещё принимаются, но ответы отклоняются с ошибкой 400 Bad Request.
Я нашел проблему, вызывающую эту ситуацию.
При тестировании с несколькими почтовыми клиентами я обнаружил, что письма, отправленные через мой настольный клиент (Thunderbird), возвращали ошибку «400 Bad Request», тогда как при использовании веб-клиента ответ успешно доставлялся.
При дальнейшем расследовании выяснилось, что Thunderbird каким-то образом переключился на кодировку Western (Windows-1252) при ответе, в то время как веб-клиент оставался на UTF-8. После принудительного переключения Thunderbird на UTF-8 письмо также было успешно доставлено.
Считаю, что почтовый получатель должен выполнять проверку и очистку кодировки, но я не разработчик на Ruby, поэтому передаю эту часть кода разработчикам