Email::Processor non si aspetta di essere chiamato con mail=nil

Il mio file di log degli errori è pieno di questi messaggi:

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' 

Mi chiedo come @receiver possa diventare nil in

1 Mi Piace

La mia attuale comprensione è che Email::Processor.process! chiami Email::Receiver.new con mail=nil che solleva un Email::Receiver.EmptyEmailError, lasciando @receiver indefinito.

La parte rescue successiva si aspetta un @receiver inizializzato.

Non dovrebbe Email::Processor.initialize sollevare un errore quando chiamato con mail==nil?

La mia ipotesi è che in qualche modo :arrow_double_up: stia esplodendo.

Penso che una PR che cambi:

@receiver.is_bounce? in @receiver&.is_bounce? andrebbe bene, almeno l’errore finirebbe in handle_bounce.

Stiamo riscontrando lo stesso problema, vedi https://meta.discourse.org/t/problems-with-email-processing-undefined-method-is-bounce-for-nil-nilclass/259813/2. Esiste una soluzione alternativa, qualcosa che possiamo fare per far elaborare nuovamente le email? È causato da un’email o un utente specifico?

Aggiornamento: Ok, confermato definitivamente che questo è il problema. Grazie all’analisi di @thoka ora so cosa cercare, il problema sono effettivamente le email vuote. Nota come i messaggi sono non letti esattamente fino al punto in cui appare un’email vuota?

Eliminarla dalla casella di posta fa ripartire l’elaborazione. Cioè, finché non incontra la prossima email che era vuota:

Quindi le email vuote attualmente bloccano il sistema per noi, almeno oltre un certo numero perché sembra essere un po’ un caso di successo o fallimento se si blocca permanentemente o meno.

Suppongo che per ora dovremo monitorare le cose, ma sarebbe fantastico se questo potesse essere risolto. Grazie!!

Ciao @mekentosj, sto esaminando questo problema. Sai come vengono generate attualmente le email vuote? Mi chiedo se ci sia una causa principale che devo indagare (oltre a correggere l’errore).

1 Mi Piace

Ottimo, grazie per aver approfondito la questione! Non sono del tutto sicuro di come riescano a inviare queste email. Gli esempi nello screenshot sembrano essere risposte in cui qualcuno (o la loro app di posta elettronica) ha semplicemente rimosso tutto il contenuto dal corpo prima di rispondere (sembra accadere più spesso con persone che rispondono in cinese, quindi forse un problema di codifica dei caratteri o un certo tipo di app di posta elettronica). Ma altri modi che potrei immaginare come rilevanti/possibili nella nostra configurazione sono che qualcuno ci invii un’email solo con un allegato senza contenuto nel corpo e solo un oggetto, oppure (alcune persone sembrano ancora farlo), la loro domanda interamente nell’oggetto dell’email, senza contenuto nel corpo.

1 Mi Piace

In realtà, ho appena trovato l’email, invierò il file eml in un DM (poiché contiene l’indirizzo email dell’utente), forse contiene altri indizi.

2 Mi Piace

Grazie, l’email sembra essere generata da una terza parte (Tencent/Cina). Ho dato un’occhiata agli header dell’email e ho notato alcune cose insolite (ho evidenziato le parti interessanti qui sotto). L’email non contiene alcun corpo, ma sembra essere una risposta automatica a un’email inviata a quella casella di posta qq.

Ho fatto una rapida ricerca per X-QQ-MIME e sembra che numerosi altri siti stiano riscontrando problemi simili nell’elaborazione della posta dagli indirizzi qq.com.

Penso che possiamo tranquillamente ignorare qualsiasi email che non contenga il corpo dell’email. Possiamo registrarla silenziosamente e impedire che venga generato l’errore.

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 Mi Piace

Fantastico, quindi sì, questo conferma la mia sensazione che stesse interessando principalmente gli utenti cinesi della nostra community.

Penso che sia sicuro per noi saltare qualsiasi email che non contenga il corpo dell’email. Possiamo registrarla silenziosamente e impedire che venga generato l’errore.

Sì, purché non salti le email che contengono solo allegati anche se il mittente non ha digitato nulla (non sono un esperto di email, quindi forse quello contiene ancora un corpo).

L’altro scenario che ho menzionato in cui l’utente digita solo nell’oggetto ma lascia vuoto il corpo dell’email, immagino che venga già saltato? In caso contrario, dovresti in qualche modo identificarli da queste email che causano problemi.

L’alternativa sarebbe far riconoscere il campo header X-QQ-AUTO-REPLY: true prima che l’errore venga generato dal meccanismo che rileva le email generate automaticamente.

Inoltre, probabilmente vorrai comunque che questo particolare errore venga risolto facendo ciò che Sam ha suggerito

Ho decodificato l’oggetto dell’email in base64 e ho ottenuto:
你好,我是Focus and Flat Agile 17

Penso che ciò sia dovuto ai caratteri cinesi, che vengono codificati in base64 prima dell’invio. Questo spiega il formato confuso per il nome del mittente e l’oggetto.

Spero che la logica esistente gestisca già questo, ma verificherò come gestiamo gli allegati e l’oggetto dell’email quando elaboriamo la posta da pop3.

Penso che questo verrebbe saltato dalla logica di elaborazione della posta attuale. Quando non c’è testo nel corpo ma tutto il resto è a posto, ottengo:

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

Ho testato questo utilizzando un corpo vuoto di Gmail multipart per testo normale 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 Mi Piace

:+1:

Sì, è quello che pensavo/mi aspettavo.

Nel mio caso sembra che un timeout pop3 abbia causato l’email vuota:

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 Mi Piace

Ho apportato un aggiornamento per prevenire l’errore causato da is_bounce?.

Esiste un’impostazione del sito per il tracciamento dei log di posta:

SiteSetting.log_mail_processing_failures
Registra tutti i fallimenti nell'elaborazione delle email in /logs

Se questa è abilitata, l’errore dell’email vuota apparirà comunque nei log di posta ma non causerà il fallimento del job come accade attualmente. Ho aggiunto i dettagli del commit qui per riferimento:

1 Mi Piace

Sto riscontrando questo errore nei log, è correlato? Sembra che non riceviamo email dal nostro POP3 da giorni e ciò sta causando molti problemi. Ho controllato e non ho email vuote su POP3, come posso sbloccarlo? Ho appena aggiornato all’ultima versione, non ha aiutato.

750194 Email non può essere elaborata: 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'

Questo argomento è stato chiuso automaticamente dopo 37 ore. Non sono più consentite nuove risposte.