Temos um problema estranho com nosso servidor Discourse. Por várias semanas, a coleta de e-mails do nosso servidor POP3 interno funcionou sem problemas. Em 16 de fevereiro, o recebimento de e-mails parou repentinamente. Curiosamente, vemos atividade do Discourse nos arquivos de log do nosso servidor 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
No entanto, nenhum novo e-mail está sendo processado.
Estamos usando a versão mais recente do Discourse, 2.7.0.beta4 (desde hoje; antes era a 2.7.0.beta3). Estas são nossas configurações de e-mail:
Acesse o servidor de e-mail e exclua todos os e-mails lá. Obviamente, precisa haver uma maneira de manter aqueles que você deseja preservar…
Em seguida, aguarde o Discourse fazer POP3 novamente.
Isso agora funciona para mim e os e-mails começam a aparecer novamente.
Suspeito que algum contador interno de ID de e-mail tenha sido corrompido durante a atualização mais recente. @codinghorror Talvez esteja definido para um número muito alto, fazendo com que todos os e-mails sejam tratados como “já lidos” ou algo assim…
Se eu não excluir todos os e-mails existentes, os novos e-mails apenas se acumulam.
A mudança mais recente na verificação POP3 ocorreu em janeiro.
Isso sozinho não deveria impedir o Discourse de realizar a verificação, mas é possível que um e-mail recebido gere uma exceção. Não há tratamento de erros no novo código…
@jzedlitz Você ainda está enfrentando o problema e gostaria de ajudar a descobrir a causa raiz? Há algum erro relacionado em /logs? Você vê um erro em /sidekiq/scheduler ao pesquisar por Jobs::PollMailbox? Você vê um erro ao realizar a verificação manualmente no console do Rails?
./launcher enter app
rails c
Jobs::PollMailbox.new.execute({})
Sim, era esse o PR que o @gerhard linkou em POP3 email polling stopped working - #6 by gerhard. Isso não deve quebrar nada, eu acho. Eu precisaria da mensagem de e-mail original completa para testar. Esta é a principal alteração no código:
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
Então, talvez possa haver um erro silencioso se o Time.parse falhar? Já que nem sequer tentamos fazer qualquer coisa se o cabeçalho Date estiver ausente.
Desculpe não ter respondido mais cedo. Resolvemos mais ou menos o problema esvaziando a caixa de correio POP3 do Discourse. Imediatamente, o Discourse voltou a conseguir capturar mensagens. Transferi alguns e-mails mais recentes para a caixa de correio POP3, agora vazia, e eles também foram processados. No entanto, assim que coloquei alguns dos 1.400 e-mails mais antigos na caixa de correio, o Discourse parou de processar qualquer mensagem.
Acabei de encontrar o mesmo problema. Percebi que algo estava errado quando os e-mails deveriam ter criado mensagens. A caixa postal POP3 tinha alguns e-mails (eu executo uma instância pequena).
Inserir as mensagens uma por uma parece ter resolvido. Acredito que agora funcione melhor, mas preciso esperar um pouco para confirmar isso.
Infelizmente, o problema ocorreu novamente. Usando formail, dividi o mbox em mensagens individuais e as alimentei uma a uma na conta POP3. Algumas mensagens (até mesmo mais antigas) foram processadas pelo Discourse, outras não.
Existe alguma maneira de gerar mais mensagens de log a partir de Jobs::PollMailbox.new.execute({}) para ver por que uma mensagem foi ignorada?
Qual arquivo de log exatamente? Tive tail -f /var/discourse/shared/standalone/log/rails/*.log, mas nenhuma mensagem aparece enquanto o Discourse tenta buscar os e-mails.
Você poderia aplicar as seguintes alterações em app/jobs/scheduled/poll_mailbox.rb dentro do contêiner Docker antes de executar Jobs::PollMailbox.new.execute({}) no console do 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
Agora que sei em qual arquivo procurar, consegui fazer algumas experimentações por conta própria. O problema é a verificação mail_too_old. Depois que a removi, as mensagens travadas foram processadas.
Sim, eu suspeitava disso, mas seria interessante saber qual e-mail impediu que mail_too_old? funcionasse. Ele estava realmente muito antigo? Falhou ao analisar o e-mail? Ou foi algo mais? Se quiser, pode me enviar o e-mail que estava impedindo o POP3 de funcionar por mensagem privada.