Il polling delle email POP3 ha smesso di funzionare

Abbiamo un problema strano con il nostro server Discourse. Per diverse settimane il polling delle email dal nostro server POP3 interno ha funzionato senza alcun problema. Il 16 febbraio la ricezione delle email si è interrotta improvvisamente. Stranamente, nei file di log del nostro server POP3 vediamo attività da parte di Discourse:

Feb 25 13:54:49 mailout popa3d[12458]: Autenticazione superata per discourse
Feb 25 13:54:49 mailout popa3d[12458]: 1545 messaggi (12060237 byte) caricati
Feb 25 13:54:49 mailout popa3d[12458]: 0 (0) eliminati, 1545 (12060237) rimasti

Tuttavia, non vengono elaborate nuove email.

Stiamo utilizzando l’ultima versione di Discourse 2.7.0.beta4 (da oggi; prima era la 2.7.0.beta3). Queste sono le nostre impostazioni email:

Avete qualche idea su cosa possa non funzionare? Cosa possiamo fare per indagare ulteriormente sull’errore?

Sono queste vecchie e-mail? Quali sono le date di queste e-mail?

Ho praticamente la stessa situazione.

POP3 funzionava da anni, poi a partire dal 23 febbraio le email hanno smesso di arrivare.

Ho controllato il server di posta e Discourse ha interrogato diligentemente il server ogni pochi minuti. Tuttavia, non è stato ricevuto nulla.

Le email rimangono sul server di posta.

Nota: Ho eseguito un aggiornamento alla versione 2.7.0.beta4 il 22 febbraio, quindi credo che questo abbia probabilmente a che fare con ciò…

Le e-mail bloccate nel server di posta sono tutte datate DOPO che il POP3 ha smesso di funzionare, ovvero dopo il 23 febbraio nel mio caso.

Ok, prova così:

Accedi al server di posta, elimina tutte le email presenti. Ovviamente, serve un modo per conservare quelle che vuoi mantenere…

Poi attendi che Discourse esegua di nuovo il POP3.

Ora funziona per me e le email ricompaiono.

Ho il sospetto che durante l’ultimo aggiornamento della versione qualche contatore interno degli ID email si sia inceppato. @codinghorror Forse è impostato su un numero molto alto, così tutte le email vengono trattate come “già lette” o qualcosa del genere…

Se non elimino tutte le email esistenti, quelle nuove si accumulano.

1 Mi Piace

L’ultima modifica al polling POP3 è avvenuta a gennaio.

Da sola, questa modifica non dovrebbe impedire a Discourse di effettuare il polling, ma è possibile che un’email in arrivo generi un’eccezione. Nel nuovo codice non è prevista alcuna gestione degli errori…

@jzedlitz, stai ancora riscontrando il problema e vuoi aiutare a individuarne la causa? Ci sono errori correlati in /logs? Vedi un errore in /sidekiq/scheduler quando cerchi Jobs::PollMailbox? Vedi un errore quando esegui manualmente il polling dalla console di Rails?

./launcher enter app
rails c

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

Di solito, almeno per me, la situazione è che il polling POP3 ha successo.

Vedo che Discourse esegue il polling dal server di posta.

Tuttavia, Discourse si disconnette semplicemente senza scaricare alcuna email.

Almeno per me non ci sono errori di alcun tipo.

Abbiamo anche aggiunto un controllo di sicurezza per ignorare la posta molto vecchia un po’ di tempo fa, forse @martin se lo ricorda.

Sì, era la PR collegata da @gerhard in POP3 email polling stopped working - #6 by gerhard. Non dovrebbe rompere nulla, credo. Avrei bisogno dell’intero messaggio email originale per poterlo testare. Ecco la modifica principale al codice:

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

Quindi, forse potrebbe esserci un errore silenzioso se Time.parse fallisce? Dato che non tentiamo di fare nulla se l’intestazione Date è mancante.

2 Mi Piace

Scusa per non aver risposto prima. Abbiamo più o meno risolto il problema svuotando la casella di posta POP3 per Discourse. Immediatamente, Discourse è stato in grado di ricevere di nuovo i messaggi. Ho trasferito alcune delle email più recenti nella casella POP3 ora vuota. Anche queste sono state elaborate. Tuttavia, non appena ho inserito alcune delle 1.400 email più vecchie nella casella di posta, Discourse non ha più elaborato alcun messaggio.

3 Mi Piace

Ho appena incrociato lo stesso problema. Ho notato qualcosa di strano quando le email avrebbero dovuto generare messaggi. La casella di posta POP3 conteneva alcune email (gestisco un’istanza piccola). Inserire i messaggi uno per uno sembra aver risolto il problema; penso che ora funzioni meglio, ma devo aspettare un po’ per confermarlo.

1 Mi Piace

Purtroppo, il problema si è verificato di nuovo. Utilizzando formail, ho suddiviso la casella di posta in singoli messaggi e li ho inviati uno per uno all’account POP3. Alcuni messaggi (anche più vecchi) sono stati elaborati da Discourse, altri no.

Esiste un modo per generare ulteriori messaggi di log da Jobs::PollMailbox.new.execute({}) per capire perché un messaggio viene ignorato?

Hai controllato /logs quando è stata trovata un’email che rifiuta di essere elaborata?

I post sopra sembrano indicare che sono messaggi specifici a fallire.

1 Mi Piace

Quale file di log esattamente? Ho provato tail -f /var/discourse/shared/standalone/log/rails/*.log, ma non compaiono messaggi mentre Discourse sta cercando di recuperare le email.

Come amministratore, visita https://discourse.example.com/logs nel tuo browser web.

In particolare, la cartella si chiama /log/, e non era a quella che mi riferivo :smirk:

1 Mi Piace

Grazie per la spiegazione. Purtroppo, /logs/ rimane vuoto durante il recupero delle email. C’è un modo per aumentare il livello di log?

1 Mi Piace

Potrebbe esserci un problema nella gestione degli errori nel polling POP3. Qualcuno deve esaminare il codice e verificare se gli errori vengono ignorati.

Potresti applicare le seguenti modifiche a app/jobs/scheduled/poll_mailbox.rb all’interno del contenitore Docker prima di eseguire Jobs::PollMailbox.new.execute({}) nella console di 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 Mi Piace

Ora che so in quale file guardare, sono riuscito a fare qualche esperimento da solo. Il problema è il controllo mail_too_old. Dopo averlo rimosso, i messaggi bloccati sono stati elaborati.

1 Mi Piace

Sì, lo sospettavo anch’io, ma sarebbe interessante sapere quale email ha impedito a mail_too_old? di funzionare. Era davvero troppo vecchia? Ha fallito nell’analizzare l’indirizzo email? O qualcos’altro? Se vuoi, puoi inviarmi in privato l’email che bloccava il funzionamento di POP3.