diff --git a/app/models/mail_handler.rb b/app/models/mail_handler.rb index da2c5c4e5..e2dba0e41 100644 --- a/app/models/mail_handler.rb +++ b/app/models/mail_handler.rb @@ -46,6 +46,14 @@ class MailHandler < ActionMailer::Base super(email) end + # Receives an email and rescues any exception + def self.safe_receive(*args) + receive(*args) + rescue => e + logger.error "An unexpected error occurred when receiving email: #{e.message}" if logger + return false + end + # Extracts MailHandler options from environment variables # Use when receiving emails with rake tasks def self.extract_options_from_env(env) diff --git a/lib/redmine/imap.rb b/lib/redmine/imap.rb index e164ba8ac..dc4334c2d 100644 --- a/lib/redmine/imap.rb +++ b/lib/redmine/imap.rb @@ -32,7 +32,7 @@ module Redmine imap.uid_search(['NOT', 'SEEN']).each do |uid| msg = imap.uid_fetch(uid,'RFC822')[0].attr['RFC822'] logger.debug "Receiving message #{uid}" if logger && logger.debug? - if MailHandler.receive(msg, options) + if MailHandler.safe_receive(msg, options) logger.debug "Message #{uid} successfully received" if logger && logger.debug? if imap_options[:move_on_success] imap.uid_copy(uid, imap_options[:move_on_success]) diff --git a/lib/redmine/pop3.rb b/lib/redmine/pop3.rb index 3ceeeb4a0..fcedb5003 100644 --- a/lib/redmine/pop3.rb +++ b/lib/redmine/pop3.rb @@ -36,7 +36,7 @@ module Redmine pop_session.each_mail do |msg| message = msg.pop message_id = (message =~ /^Message-I[dD]: (.*)/ ? $1 : '').strip - if MailHandler.receive(message, options) + if MailHandler.safe_receive(message, options) msg.delete logger.debug "--> Message #{message_id} processed and deleted from the server" if logger && logger.debug? else