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