discourse/app/jobs/scheduled/poll_mailbox.rb
Benjamin Kampmann 024597e643 Switch to proper exception handling system for better user feedback
- Replace implicit return code-system in Email::Receiver with proper exception system
 - Update tests to check for exceptions instead
 - Test the PollMailbox for expected failures
 - Add proper email-handling of problematic emails
"
2014-02-28 17:02:58 +01:00

57 lines
1.7 KiB
Ruby

#
# Connects to a mailbox and checks for replies
#
require 'net/pop'
require_dependency 'email/receiver'
require_dependency 'email/sender'
require_dependency 'email/message_builder'
module Jobs
class PollMailbox < Jobs::Scheduled
every 5.minutes
sidekiq_options retry: false
include Email::BuildEmailHelper
def execute(args)
if SiteSetting.pop3s_polling_enabled?
poll_pop3s
end
end
def handle_mail(mail)
begin
Email::Receiver.new(mail).process
rescue Email::Receiver::UserNotSufficientTrustLevelError => e
# inform the user about the rejection
@message = Mail::Message.new(mail)
clientMessage = RejectionMailer.send_trust_level(@message.from, @message.body)
email_sender = Email::Sender.new(clientMessage, :email_reject_trust_level)
email_sender.send
rescue Email::Receiver::ProcessingError
# all other ProcessingErrors are ok to be dropped
rescue StandardError => e
# Inform Admins about error
GroupMessage.create(Group[:admins].name, :email_error_notification,
{limit_once_per: false, message_params: {source: mail, error: e}})
ensure
mail.delete
end
end
def poll_pop3s
Net::POP3.enable_ssl(OpenSSL::SSL::VERIFY_NONE)
Net::POP3.start(SiteSetting.pop3s_polling_host,
SiteSetting.pop3s_polling_port,
SiteSetting.pop3s_polling_username,
SiteSetting.pop3s_polling_password) do |pop|
unless pop.mails.empty?
pop.each do |mail|
handle_mail mail.pop
end
end
end
end
end
end