Проверка почты по POP3 перестала работать

У нас возникла странная проблема с нашим сервером 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). Вот наши настройки почты:

У вас есть какая-либо идея, что может быть не так? Что мы можем сделать, чтобы провести дальнейшее расследование ошибки?

Это старые письма? Какие даты указаны на этих письмах?

У меня практически такая же ситуация.

POP3 работал годами, но с 23 февраля письма перестали приходить.

Я проверил почтовый сервер: Discourse исправно опрашивал сервер каждые несколько минут, однако ничего не получалось.

Письма остаются на почтовом сервере.

Примечание: 22 февраля я обновился до версии 2.7.0.beta4, поэтому, полагаю, проблема, скорее всего, связана с этим…

Письма, застрявшие на почтовом сервере, все датированы ПОСЛЕ того, как перестал работать POP3, то есть после 23 февраля в моём случае.

Хорошо, попробуйте это:

Зайдите на почтовый сервер и удалите все письма. Очевидно, должен быть способ сохранить те, которые вы хотите оставить…

Затем дождитесь, пока Discourse снова подключится по POP3.

Теперь у меня это работает, и письма снова начинают появляться.

У меня есть подозрение, что какой-то внутренний счётчик ID писем сбился во время последнего обновления версии. @codinghorror Возможно, он установлен на очень большое число, из-за чего все письма помечаются как «уже прочитанные» или что-то в этом роде…

Если я не удалю все существующие письма, новые просто накапливаются.

Последнее изменение в опросе POP3 произошло в январе.

Само по себе это не должно останавливать опрос в Discourse, но возможно, что входящее письмо вызывает исключение. В новом коде нет обработки ошибок…

@jzedlitz, вы всё ещё сталкиваетесь с этой проблемой и хотите помочь разобраться в ней? Есть ли какие-либо связанные ошибки в /logs? Видите ли вы ошибку в /sidekiq/scheduler, когда ищете Jobs::PollMailbox? Видите ли вы ошибку при ручном опросе в консоли rails?

./launcher enter app
rails c

Jobs::PollMailbox.new.execute({})

Обычно, по крайней мере в моём случае, ситуация такова, что опрос POP3 завершается успешно.

Я вижу, что Discourse выполняет опрос почтового сервера.

Однако Discourse просто разрывает соединение, не загрузив ни одного письма.

По крайней мере в моём случае никаких ошибок вообще нет.

Некоторое время назад мы также добавили проверку безопасности для игнорирования очень старой почты, возможно, @martin помнит об этом.

Да, это был тот 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({}), чтобы понять, почему сообщение игнорируется?

Проверяли ли вы /logs, когда обнаруживалось письмо, которое отказывается обрабатываться?

Сообщения выше, безусловно, указывают на то, что не удаётся обработать конкретные сообщения.

Какой именно лог-файл? Я попробовал tail -f /var/discourse/shared/standalone/log/rails/*.log, но пока Discourse пытается получить письма, никаких сообщений не появляется.

Как администратор, перейдите по адресу https://discourse.example.com/logs в вашем веб-браузере.

Отметим, что папка называется /log/, и я не имел в виду именно её :smirk:

Спасибо за объяснение. К сожалению, /logs/ остаётся пустым при получении писем. Есть ли способ повысить уровень логирования?

Возможно, проблема в обработке ошибок при опросе POP3. Нужно проверить код и убедиться, что ошибки не подавляются.

Не могли бы вы применить следующие изменения к файлу 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.