diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 4ab37618071..e95643ca44b 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -415,7 +415,7 @@ module ActionMailer #:nodoc: # Should be removed when old API is deprecated @mail_was_called = true - m, sort_parts = @message, true + m = @message # Give preference to headers and fallback to the ones set in mail content_type = headers[:content_type] || m.content_type @@ -425,12 +425,16 @@ module ActionMailer #:nodoc: headers[:subject] ||= default_subject quote_fields(m, headers, charset) + sort_order = headers[:parts_order] || self.class.default_implicit_parts_order.dup + responses = if headers[:body] [ { :body => headers[:body], :content_type => self.class.default_content_type.dup } ] elsif block_given? - sort_parts = false collector = ActionMailer::Collector.new(self) { render(action_name) } yield(collector) + # Collect the sort order of the parts from the collector as Mail will always + # sort parts on encode into a "sane" sequence. + sort_order = collector.responses.map { |r| r[:content_type] } collector.responses else # TODO Ensure that we don't need to pass I18n.locale as detail @@ -447,8 +451,8 @@ module ActionMailer #:nodoc: m.charset = charset m.mime_version = mime_version - if sort_parts && m.parts.present? - m.body.set_sort_order(headers[:parts_order] || self.class.default_implicit_parts_order.dup) + if m.multipart? + m.body.set_sort_order(sort_order) m.body.sort_parts! end diff --git a/actionmailer/test/base_test.rb b/actionmailer/test/base_test.rb index 83943162d2c..ad0e1d9fe2c 100644 --- a/actionmailer/test/base_test.rb +++ b/actionmailer/test/base_test.rb @@ -304,16 +304,15 @@ class BaseTest < ActiveSupport::TestCase assert_equal("HTML Explicit Multipart", email.parts[1].parts[1].body.encoded) end - # TODO Seems Mail is sorting the templates automatically, and not on demand - # test "explicit multipart with templates" do - # email = BaseMailer.deliver_explicit_multipart_templates - # assert_equal(2, email.parts.size) - # assert_equal("multipart/alternate", email.mime_type) - # assert_equal("text/html", email.parts[0].mime_type) - # assert_equal("HTML Explicit Multipart Templates", email.parts[0].body.encoded) - # assert_equal("text/plain", email.parts[1].mime_type) - # assert_equal("TEXT Explicit Multipart Templates", email.parts[1].body.encoded) - # end + test "explicit multipart with templates" do + email = BaseMailer.deliver_explicit_multipart_templates + assert_equal(2, email.parts.size) + assert_equal("multipart/alternate", email.mime_type) + assert_equal("text/html", email.parts[0].mime_type) + assert_equal("HTML Explicit Multipart Templates", email.parts[0].body.encoded) + assert_equal("text/plain", email.parts[1].mime_type) + assert_equal("TEXT Explicit Multipart Templates", email.parts[1].body.encoded) + end test "explicit multipart with any" do email = BaseMailer.deliver_explicit_multipart_with_any