Le sondage des e-mails POP3 a cessé de fonctionner

Nous rencontrons un problème étrange avec notre serveur Discourse. Depuis plusieurs semaines, la récupération des emails depuis notre serveur POP3 interne fonctionnait sans aucun problème. Le 16 février, la réception des emails s’est soudainement arrêtée. Étrangement, nous constatons une activité de Discourse dans les fichiers journaux de notre serveur POP3 :

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

Cependant, aucun nouvel email n’est traité.

Nous utilisons la toute dernière version de Discourse 2.7.0.beta4 (depuis aujourd’hui, c’était la 2.7.0.beta3 auparavant). Voici nos paramètres de messagerie :

Avez-vous une idée de ce qui pourrait ne pas fonctionner ? Que pouvons-nous faire pour investiguer davantage cette erreur ?

Sont-ce d’anciens e-mails ? Quelles sont les dates de ces e-mails ?

Je suis dans presque exactement la même situation.

POP3 fonctionnait depuis des années, puis à partir du 23 février, les e-mails ont cessé d’arriver.

J’ai vérifié le serveur de messagerie et Discourse interrogait régulièrement le serveur toutes les quelques minutes. Cependant, rien n’est reçu.

Les e-mails restent sur le serveur de messagerie.

Remarque : J’ai effectué une mise à jour vers la version 2.7.0.beta4 le 22 février, donc je pense que cela est probablement lié…

Les e-mails bloqués sur le serveur de messagerie sont tous datés APRÈS l’arrêt du fonctionnement du protocole POP3, c’est-à-dire après le 23 février dans mon cas.

D’accord, essayez ceci :

Accédez au serveur de messagerie et supprimez tous les e-mails qui s’y trouvent. Bien sûr, il doit exister un moyen de conserver ceux que vous souhaitez garder…

Ensuite, attendez que Discourse récupère à nouveau via POP3.

Cela fonctionne maintenant pour moi et les e-mails réapparaissent.

Je soupçonne qu’un compteur d’ID d’e-mail interne est corrompu lors de la dernière mise à jour. @codinghorror Peut-être est-il défini sur un nombre très élevé, ce qui fait que tous les e-mails sont traités comme « déjà lus » ou autre…

Si je ne supprime pas tous les e-mails existants, les nouveaux e-mails s’accumulent simplement.

1 « J'aime »

Le dernier changement concernant le sondage POP3 a eu lieu en janvier.

Cela seul ne devrait pas empêcher Discourse de sonder, mais il est possible qu’un e-mail entrant déclenche une exception. Le nouveau code ne gère pas les erreurs…

@jzedlitz, rencontrez-vous toujours ce problème et souhaitez-vous nous aider à en trouver la cause ? Y a-t-il des erreurs connexes dans /logs ? Voyez-vous une erreur dans /sidekiq/scheduler lorsque vous recherchez Jobs::PollMailbox ? Voyez-vous une erreur lorsque vous lancez manuellement le sondage dans la console Rails ?

./launcher enter app
rails c

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

Habituellement, du moins pour moi, la situation est que le sondage POP3 réussit.

Je vois que Discourse interroge le serveur de messagerie.

Cependant, Discourse se déconnecte simplement sans télécharger aucun message.

Du moins pour moi, il n’y a aucune erreur.

Nous avons également ajouté une vérification de sécurité pour ignorer les courriers très anciens il y a quelque temps, peut-être que @martin s’en souvient.

Oui, c’était la PR que @gerhard a liée dans POP3 email polling stopped working - #6 by gerhard. Cela ne devrait rien casser, je ne le pense pas. J’aurais besoin du message email original complet pour le tester. Voici le principal changement de code :

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

Donc, je suppose qu’il pourrait y avoir une erreur silencieuse si Time.parse échoue ? Puisque nous n’essayons même pas de faire quoi que ce soit si l’en-tête Date est manquant.

2 « J'aime »

Désolé de ne pas avoir répondu plus tôt. Nous avons plus ou moins résolu le problème en vidant la boîte POP3 de Discourse. Immédiatement, Discourse a pu à nouveau récupérer les messages. J’ai transféré certains des e-mails plus récents dans la boîte POP3 maintenant vide. Ceux-ci ont également pu être traités. Cependant, dès que j’ai mis certains des 1 400 anciens e-mails dans la boîte, Discourse n’a plus traité aucun message.

3 « J'aime »

Je viens de tomber sur le même problème. J’ai remarqué quelque chose d’étrange lorsque des emails auraient dû créer des messages. La boîte aux lettres POP3 contenait quelques emails (je fais tourner une petite instance). Ajouter les messages un par un semble avoir fait l’affaire. Je pense que cela fonctionne mieux maintenant, mais je dois attendre un peu pour le confirmer.

1 « J'aime »

Malheureusement, le problème s’est à nouveau produit. En utilisant formail, j’ai séparé le fichier mbox en messages individuels et les ai injectés un par un dans le compte POP3. Certains messages (même anciens) ont été traités par Discourse, d’autres non.

Existe-t-il un moyen de générer plus de messages de journal à partir de Jobs::PollMailbox.new.execute({}) pour comprendre pourquoi un message est ignoré ?

Avez-vous vérifié /logs lorsqu’un e-mail refusant d’être traité est détecté ?

Les messages ci-dessus semblent indiquer que ce sont des messages spécifiques qui échouent.

1 « J'aime »

Quel fichier de log exactement ? J’ai essayé tail -f /var/discourse/shared/standalone/log/rails/*.log, mais aucun message n’apparaît pendant que Discourse tente de récupérer les e-mails.

En tant qu’administrateur, visitez https://discourse.example.com/logs dans votre navigateur web.

Notamment, le dossier est nommé /log/, et ce n’était pas ce à quoi je faisais référence :smirk:

1 « J'aime »

Merci pour l’explication. Malheureusement, /logs/ reste vide lors de la récupération des e-mails. Existe-t-il un moyen d’augmenter le niveau de journalisation ?

1 « J'aime »

Il pourrait y avoir un problème dans la gestion des erreurs lors de la vérification POP3. Quelqu’un doit examiner le code pour voir s’il étouffe les erreurs.

Pourriez-vous appliquer les modifications suivantes à app/jobs/scheduled/poll_mailbox.rb dans le conteneur Docker avant d’exécuter Jobs::PollMailbox.new.execute({}) dans la console 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
1 « J'aime »

Maintenant que je sais dans quel fichier chercher, j’ai pu faire quelques essais moi-même. Le problème vient de la vérification mail_too_old. Après l’avoir supprimée, les messages bloqués ont été traités.

1 « J'aime »

Oui, je le soupçonnais, mais il serait intéressant de savoir quel e-mail a empêché mail_too_old? de fonctionner. Était-il vraiment trop ancien ? L’analyse de l’e-mail a-t-elle échoué ? Quelque chose d’autre ? Si tu le souhaites, tu peux m’envoyer en MP l’e-mail qui bloquait le fonctionnement de POP3.