Polling de email POP3 parou de funcionar

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:

Você tem alguma ideia do que pode estar errado? O que podemos fazer para investigar o erro mais a fundo?

Esses são e-mails antigos? Quais são as datas desses e-mails?

Estou com praticamente a mesma situação.

O POP3 funcionou por anos, mas a partir de 23 de fevereiro, os e-mails pararam de chegar.

Verifiquei o servidor de e-mail e o Discourse consultou diligentemente o servidor a cada poucos minutos. No entanto, nada foi recebido.

Os e-mails permanecem no servidor de e-mail.

Nota: Fiz uma atualização para a versão 2.7.0.beta4 em 22 de fevereiro, então acredito que isso provavelmente tenha a ver com isso…

Os e-mails presos no servidor de e-mail estão todos datados DEPOIS que o POP3 parou de funcionar, ou seja, após 23 de fevereiro, no meu caso.

OK, tente isto:

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

Geralmente, pelo menos para mim, a situação é que a consulta POP3 tem sucesso.

Consigo ver o Discourse fazendo a consulta no servidor de e-mail.

No entanto, o Discourse simplesmente se desconecta sem baixar nenhum e-mail.

Pelo menos para mim, não há erros de nenhum tipo.

Também adicionamos uma verificação de segurança para ignorar e-mails muito antigos há algum tempo, talvez o @martin se lembre.

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?

Você tem verificado /logs quando um e-mail que se recusa a ser processado é encontrado?

As mensagens acima certamente sugerem que são mensagens específicas que estão falhando.

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.

Como administrador, acesse https://discourse.example.com/logs no seu navegador.

Vale destacar que a pasta se chama /log/, e não era a isso que eu estava me referindo :smirk:

Obrigado pela explicação. Infelizmente, /logs/ permanece vazio durante a busca de e-mails. Há alguma maneira de aumentar o nível de log?

Pode haver um problema no tratamento de erros na verificação POP3, então. Alguém precisa analisar o código e ver se ele está suprimindo erros.

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.