У нас возникла странная проблема с нашим сервером Discourse. В течение нескольких недель опрос почты с нашего внутреннего POP3-сервера работал без проблем. 16 февраля получение писем внезапно прекратилось. Странно, что в логах нашего POP3-сервера мы видим активность со стороны Discourse:
Feb 25 13:54:49 mailout popa3d[12458]: Authentication passed for discourse
Feb 25 13:54:49 mailout popa3d[12458]: 1545 messages (12060237 bytes) loaded
Feb 25 13:54:49 mailout popa3d[12458]: 0 (0) deleted, 1545 (12060237) left
Однако новые письма не обрабатываются.
Мы используем новейшую версию Discourse 2.7.0.beta4 (сегодня, до этого была 2.7.0.beta3). Вот наши настройки почты:
Зайдите на почтовый сервер и удалите все письма. Очевидно, должен быть способ сохранить те, которые вы хотите оставить…
Затем дождитесь, пока Discourse снова подключится по POP3.
Теперь у меня это работает, и письма снова начинают появляться.
У меня есть подозрение, что какой-то внутренний счётчик ID писем сбился во время последнего обновления версии. @codinghorror Возможно, он установлен на очень большое число, из-за чего все письма помечаются как «уже прочитанные» или что-то в этом роде…
Если я не удалю все существующие письма, новые просто накапливаются.
Последнее изменение в опросе POP3 произошло в январе.
Само по себе это не должно останавливать опрос в Discourse, но возможно, что входящее письмо вызывает исключение. В новом коде нет обработки ошибок…
@jzedlitz, вы всё ещё сталкиваетесь с этой проблемой и хотите помочь разобраться в ней? Есть ли какие-либо связанные ошибки в /logs? Видите ли вы ошибку в /sidekiq/scheduler, когда ищете Jobs::PollMailbox? Видите ли вы ошибку при ручном опросе в консоли rails?
./launcher enter app
rails c
Jobs::PollMailbox.new.execute({})
Да, это был тот PR, на который ссылался @gerhard в POP3 email polling stopped working - #6 by gerhard. Насколько я понимаю, это не должно ничего сломать. Для тестирования мне потребовалось бы полное исходное сообщение электронной почты. Вот основное изменение кода:
def mail_too_old?(mail_string)
mail = Mail.new(mail_string)
date_header = mail.header['Date']
return false if date_header.blank?
date = Time.parse(date_header.to_s)
date < 1.week.ago
end
Так что, возможно, может возникнуть тихая ошибка, если Time.parse не удастся? Поскольку мы даже не пытаемся что-либо делать, если заголовок Date отсутствует.
Извините за задержку с ответом. Мы более или менее решили проблему, очистив POP3-почтовый ящик для Discourse. Сразу после этого Discourse снова начал получать сообщения. Я перенёс некоторые из новых писем в теперь пустой POP3-ящик, и они тоже были обработаны. Однако, как только я поместил в ящик некоторые из 1400 старых писем, Discourse перестал обрабатывать любые сообщения.
Я только что наткнулся на ту же проблему. Я заметил что-то странное, когда письма должны были создавать сообщения. В почтовом ящике POP3 было несколько писем (у меня работает небольшой экземпляр).
Поочередная загрузка сообщений, похоже, решила проблему. Я думаю, теперь всё работает лучше, но мне нужно немного подождать, чтобы это подтвердить.
К сожалению, проблема возникла снова. С помощью formail я разделил mbox на отдельные сообщения и по одному загрузил их в учётную запись POP3. Некоторые (даже старые) сообщения были обработаны Discourse, другие — нет.
Есть ли способ получить больше сообщений журнала из Jobs::PollMailbox.new.execute({}), чтобы понять, почему сообщение игнорируется?
Какой именно лог-файл? Я попробовал tail -f /var/discourse/shared/standalone/log/rails/*.log, но пока Discourse пытается получить письма, никаких сообщений не появляется.
Не могли бы вы применить следующие изменения к файлу app/jobs/scheduled/poll_mailbox.rb внутри контейнера Docker перед запуском Jobs::PollMailbox.new.execute({}) в консоли Rails?
pop3.start(SiteSetting.pop3_polling_username, SiteSetting.pop3_polling_password) do |pop|
+ mail_string = nil
pop.each_mail do |p|
+ mail_string = nil
mail_string = p.pop
break if mail_too_old?(mail_string)
process_popmail(mail_string)
p.delete if SiteSetting.pop3_polling_delete_from_server?
+ rescue => e
+ puts e.message
+ puts e.backtrace.join("\n\t")
+ puts "", "MESSAGE:", mail_string if mail_string
end
end
Теперь, когда я знаю, в каком файле искать, я смог провести несколько экспериментов самостоятельно. Проблема заключалась в проверке mail_too_old. После её удаления зависшие сообщения были обработаны.
Да, я так и думал, но было бы интересно узнать, какое именно письмо мешало работать методу mail_too_old?. Оно действительно было слишком старым? Произошла ошибка при парсинге адреса электронной почты? Или что-то другое? Если хочешь, можешь отправить мне это письмо в личные сообщения, которое мешало работе POP3.