diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 150d4351401d3..f0b1fcbe63b11 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -684,7 +684,7 @@ def mail(headers={}, &block) m.charset = charset = headers[:charset] # Set configure delivery behavior - wrap_delivery_behavior!(headers.delete(:delivery_method)) + wrap_delivery_behavior!(headers.delete(:delivery_method),headers.delete(:perform_deliveries)) # Assign all headers except parts_order, content_type and body assignable = headers.except(:parts_order, :content_type, :body, :template_name, :template_path) diff --git a/actionmailer/lib/action_mailer/delivery_methods.rb b/actionmailer/lib/action_mailer/delivery_methods.rb index 3b38dbccc763e..0b8d0019eb0e5 100644 --- a/actionmailer/lib/action_mailer/delivery_methods.rb +++ b/actionmailer/lib/action_mailer/delivery_methods.rb @@ -57,7 +57,7 @@ def add_delivery_method(symbol, klass, default_options={}) self.delivery_methods = delivery_methods.merge(symbol.to_sym => klass).freeze end - def wrap_delivery_behavior(mail, method=nil) #:nodoc: + def wrap_delivery_behavior(mail, method=nil, perform_deliveries_header=nil) #:nodoc: method ||= self.delivery_method mail.delivery_handler = self @@ -74,7 +74,7 @@ def wrap_delivery_behavior(mail, method=nil) #:nodoc: mail.delivery_method(method) end - mail.perform_deliveries = perform_deliveries + mail.perform_deliveries = perform_deliveries && (perform_deliveries_header.nil? || perform_deliveries_header) mail.raise_delivery_errors = raise_delivery_errors end end diff --git a/actionmailer/test/delivery_methods_test.rb b/actionmailer/test/delivery_methods_test.rb index 08f84dbf3b40e..886e79aae94f4 100644 --- a/actionmailer/test/delivery_methods_test.rb +++ b/actionmailer/test/delivery_methods_test.rb @@ -82,6 +82,7 @@ class DeliveryMailer < ActionMailer::Base def welcome(hash={}) mail(DEFAULT_HEADERS.merge(hash)) end + end def setup @@ -129,6 +130,18 @@ def teardown DeliveryMailer.welcome.deliver end + test "does not perform deliveries if customized per instance" do + DeliveryMailer.perform_deliveries = true + m = DeliveryMailer.welcome(:perform_deliveries => false) + assert_equal(false,m.perform_deliveries) + end + + test "does not perform deliveries if globally set to off but instance instructs delivery" do + DeliveryMailer.perform_deliveries = false + m = DeliveryMailer.welcome(:perform_deliveries => true) + assert_equal(false,m.perform_deliveries) + end + test "does not append the deliveries collection if told not to perform the delivery" do DeliveryMailer.perform_deliveries = false DeliveryMailer.deliveries.clear