POP3-E-Mail-Abfrage funktioniert nicht mehr

Wir haben ein seltsames Problem mit unserem Discourse-Server. Seit mehreren Wochen funktionierte das Abrufen von E-Mails von unserem internen POP3-Server problemlos. Am 16. Februar wurde der Empfang von E-Mails plötzlich unterbrochen. Seltsamerweise sehen wir in den Logdateien unseres POP3-Servers Aktivitäten von 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

Dennoch werden keine neuen E-Mails verarbeitet.

Wir verwenden die neueste Discourse-Version 2.7.0.beta4 (seit heute, zuvor 2.7.0.beta3). Dies sind unsere E-Mail-Einstellungen:

Haben Sie eine Idee, was schiefgehen könnte? Was können wir tun, um den Fehler weiter zu untersuchen?

Sind das alte E-Mails? Welche Daten stehen auf diesen E-Mails?

Ich befinde mich in fast derselben Situation.

POP3 hat jahrelang funktioniert, aber seit dem 23. Februar kommen keine E-Mails mehr an.

Ich habe den E-Mail-Server überprüft, und Discourse hat den Server fleißig alle paar Minuten abgefragt. Allerdings wurde nichts empfangen.

Die E-Mails verbleiben auf dem E-Mail-Server.

Hinweis: Ich habe am 22. Februar ein Update auf Version 2.7.0.beta4 durchgeführt, daher glaube ich, dass dies wahrscheinlich damit zusammenhängt…

Die E-Mails, die im E-Mail-Server stecken, sind alle mit einem Datum NACH dem Ausfall von POP3 versehen, also nach dem 23. Februar in meinem Fall.

OK, versuch es mal so:

Gehe auf den E-Mail-Server und lösche alle E-Mails dort. Natürlich muss es eine Möglichkeit geben, die E-Mails zu behalten, die du behalten möchtest…

Warte dann, bis Discourse erneut per POP3 abruft.

Bei mir funktioniert das jetzt und E-Mails werden wieder angezeigt.

Ich vermute, dass ein interner E-Mail-ID-Zähler während des letzten Version-Updates beschädigt wurde. @codinghorror Vielleicht ist er auf eine sehr große Zahl gesetzt, sodass alle E-Mails als „bereits gelesen

Die letzte Änderung beim POP3-Abfragen fand im Januar statt.

Allein dies sollte das Abfragen durch Discourse nicht verhindern, aber es ist möglich, dass eine eingehende E-Mail eine Ausnahme auslöst. Im neuen Code gibt es keine Fehlerbehandlung…

@jzedlitz: Siehst du das Problem immer noch und möchtest helfen, die Ursache zu finden? Gibt es verwandte Fehler in /logs? Siehst du einen Fehler in /sidekiq/scheduler, wenn du nach Jobs::PollMailbox suchst? Tritt ein Fehler auf, wenn du das Abfragen manuell in der Rails-Konsole ausführst?

./launcher enter app
rails c

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

Normalerweise ist die Situation zumindest bei mir, dass der POP3-Abfrageversuch erfolgreich ist.

Ich kann sehen, dass Discourse vom E-Mail-Server abruft.

Allerdings trennt Discourse die Verbindung einfach, ohne E-Mails herunterzuladen.

Zumindest bei mir treten keinerlei Fehler auf.

Wir haben vor einiger Zeit auch eine Sicherheitsprüfung hinzugefügt, um sehr alte E-Mails zu ignorieren. Vielleicht erinnert sich @martin daran.

Ja, das war der PR, den @gerhard unter POP3 email polling stopped working - #6 by gerhard verlinkt hat. Das sollte meiner Meinung nach nichts kaputt machen. Ich bräuchte die vollständige ursprüngliche E-Mail, um sie damit testen zu können. Hier ist die wichtigste Code-Änderung:

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

Vielleicht könnte es also einen stillen Fehler geben, falls Time.parse fehlschlägt? Da wir ohnehin nichts unternehmen, wenn der Date-Header fehlt.

Entschuldigung für die späte Antwort. Wir haben das Problem mehr oder weniger gelöst, indem wir das POP3-Postfach für Discourse geleert haben. Sofort konnte Discourse wieder Nachrichten abrufen. Ich habe einige der neueren E-Mails in das nun leere POP3-Postfach übertragen. Diese konnten ebenfalls verarbeitet werden. Sobald ich jedoch einige der 1.400 älteren E-Mails in das Postfach legte, konnte Discourse keine Nachrichten mehr verarbeiten.

Ich bin gerade auf das gleiche Problem gestoßen. Mir ist aufgefallen, dass etwas nicht stimmte, als E-Mails eigentlich Nachrichten erstellen sollten. Der POP3-Mailbox waren einige E-Mails enthalten (ich betreibe eine kleine Instanz). Das schrittweise Hinzufügen der Nachrichten scheint zu funktionieren; ich glaube, es läuft jetzt besser, aber ich muss noch etwas warten, um das zu bestätigen.

Leider ist das Problem erneut aufgetreten. Mit formail habe ich das mbox in einzelne Nachrichten aufgeteilt und diese nacheinander in das POP3-Konto eingespeist. Einige (sogar ältere) Nachrichten wurden von Discourse verarbeitet, andere nicht.

Gibt es eine Möglichkeit, mehr Logmeldungen von Jobs::PollMailbox.new.execute({}) auszulösen, um zu sehen, warum eine Nachricht ignoriert wird?

Haben Sie /logs überprüft, wenn eine E-Mail gefunden wird, die nicht verarbeitet werden kann?

Die oben genannten Beiträge deuten darauf hin, dass es sich um bestimmte Nachrichten handelt, die fehlschlagen.

Welche Protokolldatei genau? Ich habe tail -f /var/discourse/shared/standalone/log/rails/*.log versucht, aber es werden keine Meldungen angezeigt, während Discourse versucht, die E-Mails abzurufen.

Als Admin besuchen Sie https://discourse.example.com/logs in Ihrem Webbrowser.

Auffällig ist, dass der Ordner /log/ heißt, und das war nicht das, worauf ich mich bezog :smirk:

Danke für die Erklärung. Leider bleibt /logs/ leer, während E-Mails abgerufen werden. Gibt es eine Möglichkeit, die Protokollierungsstufe zu erhöhen?

Dann könnte es ein Problem in der Fehlerbehandlung beim POP3-Abfragen geben. Jemand muss den Code überprüfen und prüfen, ob Fehler unterdrückt werden.

Könntest du die folgenden Änderungen in app/jobs/scheduled/poll_mailbox.rb innerhalb des Docker-Containers anwenden, bevor du Jobs::PollMailbox.new.execute({}) in der Rails-Konsole ausführst?

       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

Da ich nun weiß, in welcher Datei ich suchen muss, konnte ich selbst einige Experimente durchführen. Das Problem war die Prüfung mail_too_old. Nachdem ich sie entfernt habe, wurden die hängenden Nachrichten verarbeitet.

Ja, das habe ich auch vermutet, aber es wäre interessant zu wissen, welche E-Mail dafür gesorgt hat, dass mail_too_old? nicht funktioniert hat. War sie wirklich zu alt? Konnte die E-Mail nicht geparst werden? Oder lag etwas anderes vor? Wenn du möchtest, kannst du mir die E-Mail, die POP3 blockiert hat, per PN schicken.