diff --git a/actionmailer/CHANGELOG b/actionmailer/CHANGELOG index bec81dfa1d..ce95327ba2 100644 --- a/actionmailer/CHANGELOG +++ b/actionmailer/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Make sure TMail#attachments includes anything with content-disposition of "attachment", regardless of content-type [Jamis Buck] + * Rename Version constant to VERSION. #2802 [Marcel Molina Jr.] * Stricter matching for implicitly multipart filenames excludes files ending in unsupported extensions (such as foo.rhtml.bak) and without a two-part content type (such as foo.text.rhtml or foo.text.really.plain.rhtml). #2398 [Dave Burt , Jeremy Kemper] diff --git a/actionmailer/lib/action_mailer/vendor/tmail/attachments.rb b/actionmailer/lib/action_mailer/vendor/tmail/attachments.rb index cdc4ba8631..abadd20a8a 100644 --- a/actionmailer/lib/action_mailer/vendor/tmail/attachments.rb +++ b/actionmailer/lib/action_mailer/vendor/tmail/attachments.rb @@ -10,10 +10,15 @@ module TMail multipart? && parts.any? { |part| part.header["content-type"].main_type != "text" } end + def attachment?(part) + (part['content-disposition'] && part['content-disposition'].disposition == "attachment") || + part.header['content-type'].main_type != "text" + end + def attachments if multipart? parts.collect { |part| - if part.header["content-type"].main_type != "text" + if attachment?(part) content = part.body # unquoted automatically by TMail#body file_name = (part['content-location'] && part['content-location'].body) || diff --git a/actionmailer/test/fixtures/raw_email13 b/actionmailer/test/fixtures/raw_email13 new file mode 100644 index 0000000000..7d9314e36a --- /dev/null +++ b/actionmailer/test/fixtures/raw_email13 @@ -0,0 +1,29 @@ +Mime-Version: 1.0 (Apple Message framework v730) +Content-Type: multipart/mixed; boundary=Apple-Mail-13-196941151 +Message-Id: <9169D984-4E0B-45EF-82D4-8F5E53AD7012@example.com> +From: foo@example.com +Subject: testing +Date: Mon, 6 Jun 2005 22:21:22 +0200 +To: blah@example.com + + +--Apple-Mail-13-196941151 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; + charset=ISO-8859-1; + delsp=yes; + format=flowed + +This is the first part. + +--Apple-Mail-13-196941151 +Content-Type: text/x-ruby-script; name="hello.rb" +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; + filename="api.rb" + +puts "Hello, world!" +gets + +--Apple-Mail-13-196941151-- + diff --git a/actionmailer/test/mail_service_test.rb b/actionmailer/test/mail_service_test.rb index c5b2cdec84..94dd70200b 100755 --- a/actionmailer/test/mail_service_test.rb +++ b/actionmailer/test/mail_service_test.rb @@ -573,6 +573,13 @@ EOF assert_equal "Photo25.jpg", mail.attachments.first.original_filename end + def test_attachment_with_text_type + fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email13") + mail = TMail::Mail.parse(fixture) + assert_equal 1, mail.attachments.length + assert_equal "hello.rb", mail.attachments.first.original_filename + end + def test_decode_part_without_content_type fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email4") mail = TMail::Mail.parse(fixture)