## Notion document https://www.notion.so/chatwoot/Email-IMAP-Issue-30aa5f274c928062aa6bddc2e5877a63?showMoveTo=true&saveParent=true ## Description PLAIN IMAP channels (non-OAuth) were silently retrying failed authentication every minute, forever. When credentials are wrong/expired, Net::IMAP::NoResponseError was caught and logged but channel.authorization_error! was never called — so the Redis error counter never incremented, reauthorization_required? was never set, and admins were never notified. OAuth channels already had this handled correctly via the Reauthorizable concern. Additionally, Net::IMAP::ResponseParseError (raised by non-RFC-compliant IMAP servers) was falling through to the StandardError catch-all, flooding Estimated impact before fix: ~70–75 broken IMAP inboxes generating ~700k–750k wasted Sidekiq jobs/week. ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
26 lines
1.2 KiB
Ruby
26 lines
1.2 KiB
Ruby
require 'net/imap'
|
|
|
|
module ExceptionList
|
|
REST_CLIENT_EXCEPTIONS = [RestClient::NotFound, RestClient::GatewayTimeout, RestClient::BadRequest,
|
|
RestClient::MethodNotAllowed, RestClient::Forbidden, RestClient::InternalServerError,
|
|
RestClient::Exceptions::OpenTimeout, RestClient::Exceptions::ReadTimeout,
|
|
RestClient::TemporaryRedirect, RestClient::SSLCertificateNotVerified, RestClient::PaymentRequired,
|
|
RestClient::BadGateway, RestClient::Unauthorized, RestClient::PayloadTooLarge,
|
|
RestClient::MovedPermanently, RestClient::ServiceUnavailable, Errno::ECONNREFUSED, SocketError].freeze
|
|
SMTP_EXCEPTIONS = [
|
|
Net::SMTPSyntaxError
|
|
].freeze
|
|
|
|
IMAP_EXCEPTIONS = [
|
|
Errno::ECONNREFUSED, Net::OpenTimeout,
|
|
Errno::ECONNRESET, Errno::ENETUNREACH, Net::IMAP::ByeResponseError,
|
|
SocketError
|
|
].freeze
|
|
|
|
IMAP_TRANSIENT_EXCEPTIONS = (IMAP_EXCEPTIONS + [
|
|
EOFError, OpenSSL::SSL::SSLError, Net::IMAP::NoResponseError, Net::IMAP::BadResponseError,
|
|
Net::IMAP::InvalidResponseError, Net::IMAP::ResponseParseError,
|
|
Net::IMAP::ResponseReadError, Net::IMAP::ResponseTooLargeError
|
|
]).freeze
|
|
end
|