FIX: Processing incoming email should be done in a background job.

This commit is contained in:
Guo Xiang Tan 2017-04-24 12:06:28 +08:00
parent dad2024094
commit 423f2ab228
5 changed files with 16 additions and 6 deletions

View File

@ -84,8 +84,8 @@ class Admin::EmailController < Admin::AdminController
def handle_mail
params.require(:email)
Email::Processor.process!(params[:email])
render plain: "email was processed"
Jobs.enqueue(:process_email, mail: params[:email], retry_on_rate_limit: true)
render plain: "email has been received and is queued for processing"
end
def raw_email

View File

@ -4,7 +4,7 @@ module Jobs
sidekiq_options retry: 3
def execute(args)
Email::Processor.process!(args[:mail], false)
Email::Processor.process!(args[:mail], args[:retry_on_rate_limit] || false)
end
sidekiq_retries_exhausted do |msg|

View File

@ -553,7 +553,7 @@ module Email
def create_post_with_attachments(options={})
# deal with attachments
attachments.each do |attachment|
tmp = Tempfile.new("discourse-email-attachment")
tmp = Tempfile.new(["discourse-email-attachment", File.extname(attachment.filename)])
begin
# read attachment
File.open(tmp.path, "w+b") { |f| f.write attachment.body.decoded }

View File

@ -71,4 +71,16 @@ describe Admin::EmailController do
end
end
context '#handle_mail' do
before do
log_in_user(Fabricate(:admin))
SiteSetting.queue_jobs = true
end
it 'should enqueue the right job' do
expect { xhr :post, :handle_mail, email: email('cc') }
.to change { Jobs::ProcessEmail.jobs.count }.by(1)
end
end
end

View File

@ -232,6 +232,4 @@ describe EmailController do
end
end
end