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

1 „Gefällt mir“

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.

2 „Gefällt mir“

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.

3 „Gefällt mir“

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.

1 „Gefällt mir“

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.

1 „Gefällt mir“

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:

1 „Gefällt mir“

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?

1 „Gefällt mir“

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
1 „Gefällt mir“

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.

1 „Gefällt mir“

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.