Cannot receive email via POP3

AI-generated summary

schungx reports that their Discourse forum suddenly stopped receiving emails via POP3, despite no configuration changes. The logs show an EmptyEmail exception occurring during email processing, preceded by a network protocol error in net/protocol.rb while retrieving messages. Manual POP3 access via an email client works normally, indicating the issue is specific to Discourse’s email polling job. The stack trace points to failures in poll_mailbox.rb and email/processor.rb, suggesting a problem with how Discourse handles empty or malformed emails during POP3 retrieval. The error appears to originate in the Ruby net-pop library during message download, potentially due to server-side email corruption, malformed headers, or transient network issues. The user seeks help diagnosing why Discourse fails where standard email clients succeed.

Suddenly my forum cannot receive any email. It just happened out of the blue. Nothing was changed.

There are the following logs:

activesupport-7.1.4/lib/active_support/broadcast_logger.rb:130:in `block in warn'

activesupport-7.1.4/lib/active_support/broadcast_logger.rb:231:in `block in dispatch'

activesupport-7.1.4/lib/active_support/broadcast_logger.rb:231:in `each'

activesupport-7.1.4/lib/active_support/broadcast_logger.rb:231:in `dispatch'

activesupport-7.1.4/lib/active_support/broadcast_logger.rb:130:in `warn'

/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:29:in `process_popmail'

/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:49: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:46: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:45:in `poll_pop3'

/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:14:in `execute'

/var/www/discourse/app/jobs/base.rb:307:in `block (2 levels) in perform'

rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:294:in `block in perform'

/var/www/discourse/app/jobs/base.rb:290:in `each'

/var/www/discourse/app/jobs/base.rb:290:in `perform'

/var/www/discourse/app/jobs/base.rb:361:in `perform'

mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:137:in `process_queue'

mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:77:in `worker_loop'

mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:63:in `block (2 levels) in ensure_worker_threads'

It throws an EmptyEmail exception…

Manually connecting to the email account via POP3 using a regular email app works just fine.

An error preceeds this error in the log:

/usr/local/lib/ruby/3.3.0/net/protocol.rb:237:in `rbuf_fill'
/usr/local/lib/ruby/3.3.0/net/protocol.rb:199:in `readuntil'
/usr/local/lib/ruby/3.3.0/net/protocol.rb:377:in `each_message_chunk'
net-pop-0.1.2/lib/net/pop.rb:958:in `block in retr'

net-pop-0.1.2/lib/net/pop.rb:1016:in `critical'

net-pop-0.1.2/lib/net/pop.rb:956:in `retr'

net-pop-0.1.2/lib/net/pop.rb:810:in `pop'

/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:47: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:46: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:45:in `poll_pop3'

/var/www/discourse/app/jobs/scheduled/poll_mailbox.rb:14:in `execute'

/var/www/discourse/app/jobs/base.rb:307:in `block (2 levels) in perform'

rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:294:in `block in perform'

/var/www/discourse/app/jobs/base.rb:290:in `each'

/var/www/discourse/app/jobs/base.rb:290:in `perform'

/var/www/discourse/app/jobs/base.rb:361:in `perform'

mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:137:in `process_queue'

mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:77:in `worker_loop'

mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:63:in `block (2 levels) in ensure_worker_threads'