diff --git a/app/models/mail_handler.rb b/app/models/mail_handler.rb index 402be4f51..53f37a29e 100644 --- a/app/models/mail_handler.rb +++ b/app/models/mail_handler.rb @@ -445,19 +445,21 @@ class MailHandler < ActionMailer::Base def plain_text_body return @plain_text_body unless @plain_text_body.nil? - parts = if (text_parts = email.all_parts.select {|p| p.mime_type == 'text/plain'}).present? - text_parts - elsif (html_parts = email.all_parts.select {|p| p.mime_type == 'text/html'}).present? - html_parts - else - [email] - end + @plain_text_body = email_parts_to_text(email.all_parts.select {|p| p.mime_type == 'text/plain'}).presence + @plain_text_body ||= email_parts_to_text(email.all_parts.select {|p| p.mime_type == 'text/html'}).presence + + @plain_text_body ||= email_parts_to_text([email]) + + @plain_text_body + end + + def email_parts_to_text(parts) parts.reject! do |part| part.attachment? end - @plain_text_body = parts.map do |p| + parts.map do |p| body_charset = Mail::RubyVer.respond_to?(:pick_encoding) ? Mail::RubyVer.pick_encoding(p.charset).to_s : p.charset @@ -465,8 +467,6 @@ class MailHandler < ActionMailer::Base # convert html parts to text p.mime_type == 'text/html' ? self.class.html_body_to_text(body) : self.class.plain_text_body_to_text(body) end.join("\r\n") - - @plain_text_body end def cleaned_up_text_body diff --git a/test/fixtures/mail_handler/empty_text_part.eml b/test/fixtures/mail_handler/empty_text_part.eml new file mode 100644 index 000000000..7e770249f --- /dev/null +++ b/test/fixtures/mail_handler/empty_text_part.eml @@ -0,0 +1,36 @@ +From JSmith@somenet.foo Fri Mar 22 08:30:28 2013 +From: John Smith +Content-Type: multipart/mixed; boundary="Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9" +Message-Id: +Mime-Version: 1.0 (Mac OS X Mail 6.3 \(1503\)) +Subject: Test with an empty text part +Date: Fri, 22 Mar 2013 17:30:20 +0200 +To: redmine@somenet.foo +X-Mailer: Apple Mail (2.1503) + + + +--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; + charset=us-ascii + + +--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; + charset=us-ascii + + + + + + + +

The html part.

+ + + + +--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9-- diff --git a/test/unit/mail_handler_test.rb b/test/unit/mail_handler_test.rb index 562359a38..73040f766 100644 --- a/test/unit/mail_handler_test.rb +++ b/test/unit/mail_handler_test.rb @@ -623,6 +623,11 @@ class MailHandlerTest < ActiveSupport::TestCase assert_include 'third', issue.description end + def test_empty_text_part_should_not_stop_looking_for_content + issue = submit_email('empty_text_part.eml', :issue => {:project => 'ecookbook'}) + assert_equal 'The html part.', issue.description + end + def test_attachment_text_part_should_be_added_as_issue_attachment issue = submit_email('multiple_text_parts.eml', :issue => {:project => 'ecookbook'}) assert_not_include 'Plain text attachment', issue.description