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:
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({})
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?
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.
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.