POP3のメールポーリングが動作しなくなりました

Discourse サーバーで奇妙な問題が発生しています。数週間、内部の POP3 サーバーからのメールポーリングは何の問題もなく動作していました。しかし、2 月 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 は長年問題なく動作していましたが、2月23日以降、メールが届かなくなりました。

メールサーバーを確認したところ、Discourse は数分ごとにサーバーを丁寧にポーリングしているようですが、何も受信されていません。

メールはメールサーバー上に残ったままです。

備考: 2月22日にバージョン 2.7.0.beta4 に更新したため、おそらくこれが原因ではないかと考えています。

メールサーバーに滞留しているメールはすべて、POP3が機能しなくなった後(私の場合は2月23日以降)の日付です。

OK、これを試してみてください:

メールサーバーにアクセスし、そこに保存されているすべてのメールを削除します。もちろん、保存しておきたいメールを除外する仕組みは必要です。

その後、Discourse が再度 POP3 で取得するのを待ちます。

これで私の環境では動作し、メールが再び表示されるようになりました。

最新のバージョン更新中に、何らかの内部メール ID カウンターが破損しているのではないかと疑っています。@codinghorror 恐らく、このカウンターが非常に大きな数値に設定されており、すべてのメールが「既読」として処理されているのかもしれません。

既存のメールをすべて削除しなければ、新しいメールが蓄積されるだけで表示されません。

「いいね!」 1

POP3 ポーリングに関する最新の変更は 1 月に発生しました。

これ単独では Discourse のポーリングを停止させるはずではありませんが、受信メールによって例外が発生している可能性があります。新しいコードにはエラーハンドリングが実装されていません…

@jzedlitz 現在も同様の問題が発生しており、原因究明にご協力いただけますか?/logs に関連するエラーはありますか?/sidekiq/schedulerJobs::PollMailbox を検索した際にエラーが表示されますか?Rails コンソールで手動ポーリングを実行した際にエラーが発生しますか?

./launcher enter app
rails c

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

通常、少なくとも私の場合、POP3 ポールは「成功」します。

Discourse がメールサーバーからポーリングしている様子は確認できます。

しかし、Discourse はメールをダウンロードすることなく、ただ切断してしまいます。

少なくとも私の場合、エラーは一切発生しません。

以前、非常に古いメールを無視するための安全チェックを追加しました。@martin さんが覚えているかもしれません。

はい、それは @gerhardPOP3 email polling stopped working - #6 by gerhard でリンクした PR ですね。それで何か壊れることはないと思います。テストするには、元のメールメッセージ全体が必要です。主なコードの変更点は以下の通りです。

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 ヘッダーが存在しない場合は、何も実行しようとしませんからね。

「いいね!」 2

お返事が遅くなり申し訳ございません。Discourse の POP3 メールボックスを空にすることで、問題はおおむね解決いたしました。すぐに Discourse がメッセージの受信を再開できました。新しいメールの一部を空になった POP3 メールボックスに転送したところ、それらも正常に処理されました。しかし、1,400 通ある古いメールの一部をメールボックスに投入した瞬間、Discourse はそれ以降のメッセージを処理しなくなりました。

「いいね!」 3

私も同じ問題に遭遇しました。メールがメッセージとして作成されるはずの時点で何かがおかしいことに気づきました。POP3 メールボックスには数通のメールが入っていました(私は小規模なインスタンスを運用しています)。
メッセージを一つずつ追加することで問題が解決したようです。今ではうまく動作していると思いますが、確認するにはもう少し待つ必要があります。

「いいね!」 1

残念ながら、問題が再度発生しました。formail を使用して mbox を個別のメッセージに分割し、それらを POP3 アカウントに 1 つずつ投入しました。一部の(より古い)メッセージは Discourse によって処理されましたが、他のメッセージは処理されませんでした。

Jobs::PollMailbox.new.execute({}) からさらに多くのログメッセージを出力して、なぜメッセージが無視されるのかを確認する方法はありますか?

メールの処理が拒否された場合、/logs を確認しましたか?

上記の投稿は、特定のメッセージが失敗しているように聞こえます。

「いいね!」 1

具体的にどのログファイルでしょうか?tail -f /var/discourse/shared/standalone/log/rails/*.log を試してみましたが、Discourse がメールの取得を試行している間、メッセージは表示されませんでした。

管理者として、Web ブラウザで https://discourse.example.com/logs にアクセスしてください。

ちなみに、フォルダ名は /log/ です。私が言及していたのはそれではありませんでした :smirk:

「いいね!」 1

ご説明ありがとうございます。残念ながら、メールの取得中は /logs/ が空のままです。ログレベルを上げる方法はありますか?

「いいね!」 1

POP3 ポーリングのエラーハンドリングに問題がある可能性があります。コードを確認し、エラーが隠されていないか確認する必要があります。

Docker コンテナ内で app/jobs/scheduled/poll_mailbox.rb に以下の変更を適用し、その後 Rails コンソールで Jobs::PollMailbox.new.execute({}) を実行してください。

       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
「いいね!」 1

どのファイルを確認すべきか分かったおかげで、自分でもいくつか試すことができました。問題は mail_too_old のチェックにあります。これを削除したところ、止まっていたメッセージが処理されるようになりました。

「いいね!」 1

はい、私もそう疑っていましたが、どのメールが mail_too_old? の動作を妨げたのかを知ることは興味深いですね。実際に古すぎたのでしょうか?メールの解析に失敗したのでしょうか?それとも別の理由でしょうか?POP3 の動作を止めていたメールを PM で送っていただいても構いません。