Email::Processor não deve ser chamado com mail=nil

Meu log de erros está cheio dessas mensagens:

Job exception: undefined method `is_bounce?’ for nil.

Backtrace:
/var/www/discourse/lib/email/processor.rb:27:in `rescue in process!' 
/var/www/discourse/lib/email/processor.rb:16:in `process!' 
/var/www/discourse/lib/email/processor.rb:13:in `process!' 
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:23:in `process_popmail' 
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:43:in `block (2 levels) in poll_pop3' 
net-pop-0.1.2/lib/net/pop.rb:669:in `each' 
net-pop-0.1.2/lib/net/pop.rb:669:in `each_mail' 
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:40:in `block in poll_pop3' 
net-pop-0.1.2/lib/net/pop.rb:531:in `start' 
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:39:in `poll_pop3' 
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:14:in `execute' 
/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform' 
rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/app/jobs/base.rb:236:in `block in perform' 
/var/www/discourse/app/jobs/base.rb:232:in `each' 
/var/www/discourse/app/jobs/base.rb:232:in `perform' 
/var/www/discourse/app/jobs/base.rb:297:in `perform' 
mini_scheduler-0.15.0/lib/mini_scheduler/manager.rb:122:in `process_queue' 
mini_scheduler-0.15.0/lib/mini_scheduler/manager.rb:70:in `worker_loop' 
mini_scheduler-0.15.0/lib/mini_scheduler/manager.rb:59:in `block (2 levels) in ensure_worker_threads' 

Estou imaginando como @receiver pode se tornar nil em

1 curtida

Meu entendimento atual é que Email::Processor.process! chama Email::Receiver.new com mail=nil, o que levanta um Email::Receiver.EmptyEmailError, deixando @receiver indefinido.

A parte rescue seguinte espera um @receiver inicializado.

O Email::Processor.initialize não deveria levantar algum erro quando chamado com mail==nil?

Minha suposição é que de alguma forma :arrow_double_up: está explodindo.

Acho que um PR que muda:

@receiver.is_bounce? para @receiver&.is_bounce? seria bom, pelo menos o erro flutuaria para handle_bounce.

Estamos vendo o mesmo problema, veja https://meta.discourse.org/t/problems-with-email-processing-undefined-method-is-bounce-for-nil-nilclass/259813/2. Existe alguma solução alternativa, algo que possamos fazer para que o e-mail seja processado novamente? Isso é causado por um e-mail ou usuário específico?

Atualização: Ok, definitivamente confirmado que este é o problema. Graças à análise de @thoka, agora sei o que procurar, o problema são de fato e-mails vazios. Note como as mensagens ficam não lidas exatamente até o ponto em que um e-mail vazio aparece?

Excluí-lo da caixa de entrada faz com que o processamento volte a funcionar. Ou seja, até atingir o próximo e-mail que estava em branco:

Portanto, e-mails em branco atualmente travam o sistema para nós, pelo menos além de um certo número, porque parece ser um pouco aleatório se ele fica permanentemente travado ou não.

Acho que teremos que monitorar as coisas por enquanto, mas seria ótimo se isso pudesse ser corrigido. Obrigado!!

Olá @mekentosj, estou investigando este problema. Você sabe como os e-mails em branco estão sendo gerados atualmente? Estou imaginando se há uma causa raiz que preciso investigar (junto com a correção do erro).

1 curtida

Ótimo, obrigado por investigar isso! Não tenho certeza de como eles conseguem enviar esses e-mails. Os exemplos na captura de tela parecem ser respostas em que alguém (ou seu aplicativo de e-mail) simplesmente removeu todo o conteúdo do corpo antes de responder (parece ocorrer com mais frequência com pessoas respondendo em chinês, então talvez um problema de codificação de caracteres ou um certo tipo de aplicativo de e-mail). Mas outras maneiras que eu poderia imaginar que seriam relevantes/possíveis em nossa configuração é alguém nos enviar um e-mail apenas com um anexo sem conteúdo no corpo e apenas um assunto, ou (algumas pessoas ainda parecem fazer isso), sua pergunta inteiramente no assunto do e-mail, sem conteúdo no corpo.

1 curtida

Na verdade, acabei de encontrar o e-mail, enviarei o arquivo eml em uma DM (pois contém o endereço de e-mail do usuário), talvez ele contenha mais pistas.

2 curtidas

Obrigado, o e-mail parece ter sido gerado por um terceiro (Tencent/China). Dei uma olhada nos cabeçalhos do e-mail e notei algumas coisas incomuns (destaquei as partes interessantes abaixo). O e-mail não contém corpo algum, mas parece ser uma resposta automática a um e-mail enviado para essa caixa de correio qq.

Fiz uma rápida pesquisa por X-QQ-MIME e parece que vários outros sites estão enfrentando problemas semelhantes ao processar e-mails de endereços qq.com.

Acho que é seguro ignorarmos qualquer e-mail que não contenha o corpo do e-mail. Podemos registrá-lo silenciosamente e impedir que o erro seja gerado.

From: "=?utf-8?B?YWJjYzEwMDQwNTA3?=" <abcc10040507@qq.com>
Subject: =?utf-8?B?6Ieq5Yqo5Zue5aSNOiBGb2N1cyBhbmQgRmxvYXQg?=
 =?utf-8?B?d2l0aCBBZ2VuZGEgMTc=?=
Content-Transfer-Encoding: base64
X-QQ-AUTO-REPLY: true
Message-ID: <tencent_2BE587DA387104D27A33C94B@qq.com>
X-QQ-MIME: TCMime 1.0 by Tencent
1 curtida

Legal, então sim, isso confirma minha sensação de que estava afetando principalmente usuários chineses de nossa comunidade.

Acho que é seguro pularmos qualquer e-mail que não contenha o corpo do e-mail. Podemos registrá-lo silenciosamente e impedir que o erro seja gerado.

Sim, desde que não pule e-mails que contenham apenas anexos, mesmo que o remetente não tenha digitado nada (não sou especialista em e-mail, então talvez isso ainda contenha um corpo).

O outro cenário que mencionei, onde o usuário digitaria apenas no assunto, mas deixaria o e-mail em branco, acho que já é pulado atualmente? Se não for, você teria que identificar esses e-mails problemáticos de alguma forma.

A alternativa seria ter o campo de cabeçalho X-QQ-AUTO-REPLY: true reconhecido antes que o erro seja gerado pelo mecanismo que detecta e-mails gerados automaticamente.

Além disso, você provavelmente ainda vai querer que esse erro específico seja resolvido fazendo o que Sam sugeriu

Eu decodifiquei o assunto do e-mail em base64 e obtive:
你好,我是Focus and Flat Agile 17

Acho que isso se deve aos caracteres chineses, que são codificados em base64 antes do envio. Isso explica o formato ilegível para o nome do remetente e o assunto.

Espero que a lógica existente já lide com isso, mas vou verificar como lidamos com anexos e assuntos de e-mail ao processar e-mails do pop3.

Acho que isso seria pulado pela lógica de processamento de e-mail atual. Quando não há texto no corpo, mas tudo o mais está no lugar, eu recebo:

Email can not be processed: Email::Receiver::NoBodyDetectedError

Eu testei isso usando um corpo vazio do Gmail multipart para texto simples e html:

Content-Type: multipart/alternative; boundary="00000000000042cfbf05faef451e"

--00000000000042cfbf05faef451e
Content-Type: text/plain; charset="UTF-8"


--00000000000042cfbf05faef451e
Content-Type: text/html; charset="UTF-8"

	<div dir="ltr"><br></div>

--00000000000042cfbf05faef451e--
1 curtida

:+1:

Sim, era o que eu imaginava/esperava.

No meu caso, parece que um timeout do POP3 causou o e-mail vazio:

Job exception: Net::ReadTimeout

Backtrace

/usr/local/lib/ruby/3.2.0/net/protocol.rb:229:in `rbuf_fill'
/usr/local/lib/ruby/3.2.0/net/protocol.rb:199:in `readuntil'
/usr/local/lib/ruby/3.2.0/net/protocol.rb:377:in `each_message_chunk'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-pop-0.1.2/lib/net/pop.rb:958:in `block in retr'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-pop-0.1.2/lib/net/pop.rb:1016:in `critical'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-pop-0.1.2/lib/net/pop.rb:956:in `retr'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-pop-0.1.2/lib/net/pop.rb:810:in `pop'
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:41:in `block (2 levels) in poll_pop3'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-pop-0.1.2/lib/net/pop.rb:669:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-pop-0.1.2/lib/net/pop.rb:669:in `each_mail'
1 curtida

Fiz uma atualização para evitar o erro causado por is_bounce?.

Existe uma configuração do site para rastrear logs de e-mail:

SiteSetting.log_mail_processing_failures
Registra todas as falhas de processamento de e-mail em /logs

Se isso estiver ativado, o erro de e-mail em branco ainda aparecerá nos logs de e-mail, mas não fará com que o trabalho falhe como acontece atualmente. Adicionei os detalhes do commit aqui para referência:

1 curtida

Estou vendo este erro nos logs, isso está relacionado? Parece que não recebemos e-mails do nosso POP3 há dias e isso está causando muitos problemas. Verifiquei e não tenho e-mails vazios no POP3, como posso resolver isso? Acabei de atualizar para a versão mais recente e isso não ajudou.

750194 Email não pode ser processado: Email::Receiver::EmptyEmailError

/var/www/discourse/lib/email/processor.rb:183:in `log_email_process_failure' 
/var/www/discourse/lib/email/processor.rb:29:in `rescue in process!' 
/var/www/discourse/lib/email/processor.rb:16:in `process!' 
/var/www/discourse/lib/email/processor.rb:13:in `process!' 
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:23:in `process_popmail' 
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:43:in `block (2 levels) in poll_pop3' 
net-pop-0.1.2/lib/net/pop.rb:669:in `each' 
net-pop-0.1.2/lib/net/pop.rb:669:in `each_mail' 
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:40:in `block in poll_pop3' 
net-pop-0.1.2/lib/net/pop.rb:531:in `start' 
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:39:in `poll_pop3' 
/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:14:in `execute' 
/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform' 
rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/app/jobs/base.rb:236:in `block in perform' 
/var/www/discourse/app/jobs/base.rb:232:in `each' 
/var/www/discourse/app/jobs/base.rb:232:in `perform' 
/var/www/discourse/app/jobs/base.rb:297:in `perform' 
mini_scheduler-0.16.0/lib/mini_scheduler/manager.rb:122:in `process_queue' 
mini_scheduler-0.16.0/lib/mini_scheduler/manager.rb:70:in `worker_loop' 
mini_scheduler-0.16.0/lib/mini_scheduler/manager.rb:59:in `block (2 levels) in ensure_worker_threads' 

Este tópico foi fechado automaticamente após 37 horas. Novas respostas não são mais permitidas.