Commit d3fc2e6b9f5ae9039869a2b01dee44a1c7e46008

Authored by Antonio Terceiro
1 parent 3da8f8c0

Don't abort the batch because of invidual emails

ActionItem2318
app/models/mailing.rb
... ... @@ -9,7 +9,11 @@ class Mailing < ActiveRecord::Base
9 9 xss_terminate :only => [ :subject, :body ], :with => 'white_list', :on => 'validation'
10 10  
11 11 after_create do |mailing|
12   - Delayed::Job.enqueue MailingJob.new(mailing.id)
  12 + mailing.schedule
  13 + end
  14 +
  15 + def schedule
  16 + Delayed::Job.enqueue MailingJob.new(self.id)
13 17 end
14 18  
15 19 def generate_from
... ... @@ -30,8 +34,14 @@ class Mailing < ActiveRecord::Base
30 34  
31 35 def deliver
32 36 each_recipient do |recipient|
33   - Mailing::Sender.deliver_mail(self, recipient.email)
34   - self.mailing_sents.create(:person => recipient)
  37 + begin
  38 + Mailing::Sender.deliver_mail(self, recipient.email)
  39 + self.mailing_sents.create(:person => recipient)
  40 + rescue Exception
  41 + # FIXME should not discard errors silently. An idea is to collect all
  42 + # errors and generate a task (notification) for the +source+
  43 + # (environment/organization) listing these errors.
  44 + end
35 45 end
36 46 end
37 47  
... ...
test/unit/mailing_test.rb
... ... @@ -92,4 +92,22 @@ class MailingTest < ActiveSupport::TestCase
92 92 environment.domains << Domain.create(:name => 'noosfero.net', :is_default => true)
93 93 assert_equal '', mailing.url
94 94 end
  95 +
  96 + should 'process the entire batch even if individual emails crash' do
  97 + mailing = Mailing.new(:source => environment, :person => Person['user_one'], :body => 'test', :subject => 'test')
  98 + def mailing.each_recipient
  99 + user_one = Person['user_one']
  100 + user_two = Person['user_two']
  101 + user_one.stubs(:email).raises(RuntimeError.new)
  102 + [user_one, user_two].each do |p|
  103 + yield p
  104 + end
  105 + end
  106 + mailing.stubs(:schedule)
  107 + mailing.save!
  108 + mailing.deliver
  109 +
  110 + assert_equal 1, ActionMailer::Base.deliveries.size
  111 + end
  112 +
95 113 end
... ...