From 539d9b355f40b1668b4ad4e8fe628e0a3d9760b8 Mon Sep 17 00:00:00 2001 From: Mikel Lindsaar Date: Fri, 20 Nov 2009 14:10:57 +1100 Subject: [PATCH] More updates... 45 errors left to get it working with Mail gem --- actionmailer/lib/action_mailer/base.rb | 40 +++++-- actionmailer/lib/action_mailer/test_case.rb | 2 +- .../lib/action_mailer/vendor/tmail_compat.rb | 14 --- .../test/fixtures/attachments/test.jpg | Bin 0 -> 2029 bytes actionmailer/test/mail_helper_test.rb | 2 +- actionmailer/test/mail_service_test.rb | 100 ++++++++++-------- actionmailer/test/quoting_test.rb | 4 +- actionmailer/test/tmail_test.rb | 2 +- actionmailer/test/url_test.rb | 2 +- 9 files changed, 94 insertions(+), 72 deletions(-) create mode 100644 actionmailer/test/fixtures/attachments/test.jpg diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 7f31aeb7f5..d5deb96427 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -366,10 +366,27 @@ module ActionMailer #:nodoc: # Alias controller_path to mailer_name so render :partial in views work. alias :controller_path :mailer_name + # Add a part to a multipart message, with the given content-type. The + # part itself is yielded to the block so that other properties (charset, + # body, headers, etc.) can be set on it. def part(params) + params = {:content_type => params} if String === params + if custom_headers = params.delete(:headers) + STDERR.puts("Passing custom headers with :headers => {} is deprecated. Please just pass in custom headers directly.") + params = params.merge(custom_headers) + end part = Mail::Part.new(params) - yield part - self.parts << part + yield part if block_given? + @parts << part + end + + # Add an attachment to a multipart message. This is simply a part with the + # content-disposition set to "attachment". + def attachment(params, &block) + params = { :content_type => params } if String === params + params = { :disposition => "attachment", + :transfer_encoding => "base64" }.merge(params) + part(params, &block) end class << self @@ -417,8 +434,7 @@ module ActionMailer #:nodoc: # end def receive(raw_email) logger.info "Received mail:\n #{raw_email}" unless logger.nil? - mail = Mail.parse(raw_email) - mail.base64_decode + mail = Mail.new(raw_email) new.receive(mail) end @@ -598,25 +614,31 @@ module ActionMailer #:nodoc: real_content_type, ctype_attrs = parse_content_type if @parts.empty? - m.set_content_type(real_content_type, nil, ctype_attrs) + main_type, sub_type = split_content_type(real_content_type) + m.content_type(main_type, sub_type, ctype_attrs) m.body = normalize_new_lines(body) elsif @parts.size == 1 && @parts.first.parts.empty? - m.set_content_type(real_content_type, nil, ctype_attrs) + main_type, sub_type = split_content_type(real_content_type) + m.content_type(main_type, sub_type, ctype_attrs) m.body = normalize_new_lines(@parts.first.body) else @parts.each do |p| - part = (Mail === p ? p : p.to_mail(self)) - m.parts << part + m.parts << p end if real_content_type =~ /multipart/ ctype_attrs.delete "charset" - m.set_content_type(real_content_type, nil, ctype_attrs) + main_type, sub_type = split_content_type(real_content_type) + m.content_type([main_type.to_s, sub_type.to_s, ctype_attrs]) end end @mail = m end + + def split_content_type(ct) + ct.to_s.split("/") + end def parse_content_type(defaults=nil) if content_type.blank? diff --git a/actionmailer/lib/action_mailer/test_case.rb b/actionmailer/lib/action_mailer/test_case.rb index 3f69b12c97..49f6d680a2 100644 --- a/actionmailer/lib/action_mailer/test_case.rb +++ b/actionmailer/lib/action_mailer/test_case.rb @@ -44,7 +44,7 @@ module ActionMailer def set_expected_mail @expected = Mail.new - @expected.set_content_type "text", "plain", { "charset" => charset } + @expected.content_type ["text", "plain", { "charset" => charset }] @expected.mime_version = '1.0' end diff --git a/actionmailer/lib/action_mailer/vendor/tmail_compat.rb b/actionmailer/lib/action_mailer/vendor/tmail_compat.rb index 988a2d3378..0e240eb478 100644 --- a/actionmailer/lib/action_mailer/vendor/tmail_compat.rb +++ b/actionmailer/lib/action_mailer/vendor/tmail_compat.rb @@ -2,22 +2,8 @@ # Created in 1.2 of Mail. Will be deprecated STDERR.puts("DEPRECATION WARNING, Mail running in TMail compatibility mode. This will be deprecated soon.") -module Mail - - def Mail.parse(string) - STDERR.puts("DEPRECATION WARNING, Mail.parse(string) is deprecated, please use Mail.new") - ::Mail.new(string) - end - -end - class Mail::Message - def set_content_type(*args) - STDERR.puts("DEPRECATION WARNING, Message#set_content_type is deprecated, please use Message#content_type") - content_type(args) - end - def set_content_disposition(*args) STDERR.puts("DEPRECATION WARNING, Message#set_content_disposition is deprecated, please use Message#content_disposition") content_disposition(args) diff --git a/actionmailer/test/fixtures/attachments/test.jpg b/actionmailer/test/fixtures/attachments/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b976fe5e002bf58f55dedbf9a147aa6df9bf39b5 GIT binary patch literal 2029 zcma)6dpK0<8eelYjlmi-!eGt}B9!}m%VmUNyUj?MXo{iB5yg&SOOi39BL+pv{Z^aZ zCK8Uzo^h+=2x&Vmd$-ZBwN1(;IZ<;~>Zx=7JHPd;=lQg@;Cy4NF)%{ z)zs9~|MCSe85tQloSX^>s*sfMN~AA=|92r30eB2x3WOqHcmR%vA@DG156}zQLBL=z zNdIS`5J)r}fSCWKp-LbCBnpIV!XYEj<})B3j|8cTD2lNOLCevJh&I(Wx3I)R2Vn^G z4yYQR00Z!F1XYnhF>zu=;vNSfK82 z&>I|IeY{zj!00J;$I&^$lrU9p7W#&n`fpd62PcBZx4uPQ>_wO20<9l)R)PkQa12yv z7z&<=@l8c%*a_T;0=L_h?!{R|IxX$OGrZNlroctRskeLE1uxu!9N%1@#kR$reGr-0 z^{>kq-^8N(Lb=qO_gRwIvGq;A^}&{BV`=@3hR0I8+8K42!;SX8Um{YS(w#okygWMA z#hJ`*31?3gbgC^W_eX5S>cn~uxn)2HDq`QORlnq{MwEoLDj!_gXRo=KZ`n79OEs(i zTeWY~Wu*E(NSHe@cIV*Z-aMM3ojM(YwRdwzgacvQ1T-)x_}Wu3m0^6lwqKHZb}^+j zMwrOm4kA7V|F{!mkm<3kw^SuVR6qhR+gBI+YP+;iPGK(x7{EHn4ry@s~+|HvfncN_&f+^c+O#iEMt0kNuu)t2{@ zVzS!l`x`suw(PTW8|P<_4(}WP!}qT%ylK+w(I%?xFJ6A+yBE{Pcp6iqUE8*x@4|sP zevoNcf5yu>cUEFRdaLooP`g^&34ZF@J=wdaiSc znEVKwH!vUs90unIzbe2($4q}STz|;tQGO+qegB?m*C(pNq+Hc>n+BDa{I6SvsNEDi z>lp}t=p{7e)YUybe5037*O&xcI54$ zChQLQ)bWqW9F_NJe3NuV=N;w9gzj#Y9LFP|Lo!8hMuu-PLqp23h--X1S8;YeN4B{y zJx@W$AxzvaX?PCZ@bxzUvU|9Hvbc&b%4YQqH-~OX62M0d!!f4E?-TWI4KgwaNlYp5 zr5&I^t|B1QjTatPHCH`Pe`wTLY?C#kuMwP4(|bmQ?2ju~TDWrm7c_k;qS9BKXkP!1 zK7M#eae6ZKO42!Qt6l?L}u8ZIMkh;sf;Y>ERfKd)K=HRaB=Q*qvk=cc;XwIiQ}w1vRrxFU6bv4!J!_3G>nlmnL!fD*eWv& zv%tQAl%64kNGpIc=X|mui}NsAQaNFwM?6;yW@0F5KJ9GUv5TYndqEzwW7tM1wwQ~2 zb>+QEQ$@$_^}o<9WpUn=e3<}H-kwea>w6@@J+&Ok{z#W`o`vVtN#$?frs;CzHASr5 z)6C%`t^&K}@FoGOWjuW{AUf81!yqx_h&GAubHK`_#KplzrAHFQ*K|xynpc@sH#^tN byIhVj-iS)$Q858g9Rv}WnzjIqz{Gz5qc95o literal 0 HcmV?d00001 diff --git a/actionmailer/test/mail_helper_test.rb b/actionmailer/test/mail_helper_test.rb index 7b0716048f..a5cf789035 100644 --- a/actionmailer/test/mail_helper_test.rb +++ b/actionmailer/test/mail_helper_test.rb @@ -56,7 +56,7 @@ end class MailerHelperTest < Test::Unit::TestCase def new_mail( charset="utf-8" ) mail = Mail.new - mail.set_content_type "text", "plain", { "charset" => charset } if charset + mail.content_type ["text", "plain", { "charset" => charset }] mail end diff --git a/actionmailer/test/mail_service_test.rb b/actionmailer/test/mail_service_test.rb index 077c5c4480..75be2a01af 100644 --- a/actionmailer/test/mail_service_test.rb +++ b/actionmailer/test/mail_service_test.rb @@ -251,8 +251,8 @@ class TestMailer < ActionMailer::Base subject "custom header in attachment" from "test@example.com" content_type "multipart/related" - part :content_type => "text/html", :body => 'yo' - attachment :content_type => "image/jpeg",:filename => "test.jpeg", :body => "i am not a real picture", :headers => { 'Content-ID' => '' } + part :content_type => "text/html", :body => 'yo' + attachment :content_type => "image/jpeg", :filename => File.join(File.dirname(__FILE__), "fixtures", "attachments", "test.jpg"), :body => "i am not a real picture", :headers => { 'Content-ID' => '' } end def unnamed_attachment(recipient) @@ -272,11 +272,12 @@ class TestMailer < ActionMailer::Base bcc "Five: Six " render :text => "testing" end - +require 'ruby-debug' def custom_content_type_attributes recipients "no.one@nowhere.test" subject "custom content types" from "some.one@somewhere.test" + debugger content_type "text/plain; format=flowed" render :text => "testing" end @@ -322,7 +323,7 @@ class ActionMailerTest < Test::Unit::TestCase mail = Mail.new mail.mime_version = "1.0" if charset - mail.set_content_type "text", "plain", { "charset" => charset } + mail.content_type ["text", "plain", { "charset" => charset }] end mail end @@ -375,6 +376,7 @@ class ActionMailerTest < Test::Unit::TestCase def test_attachment_with_custom_header created = nil assert_nothing_raised { created = TestMailer.create_attachment_with_custom_header(@recipient) } + created.encoded assert created.parts.any? { |p| p.header['content-id'].to_s == "" } end @@ -440,12 +442,12 @@ class ActionMailerTest < Test::Unit::TestCase assert_nothing_raised { created = TestMailer.create_custom_templating_extension(@recipient) } assert_not_nil created assert_equal 2, created.parts.length - assert_equal 'text/plain', created.parts[0].content_type - assert_equal 'text/html', created.parts[1].content_type + assert_equal 'text/plain', created.parts[0].content_type.content_type + assert_equal 'text/html', created.parts[1].content_type.content_type end def test_cancelled_account - expected = new_mail + expected = new_mail('US-ASCII') expected.to = @recipient expected.subject = "[Cancelled] Goodbye #{@recipient}" expected.body = "Goodbye, Mr. #{@recipient}" @@ -455,15 +457,21 @@ class ActionMailerTest < Test::Unit::TestCase created = nil assert_nothing_raised { created = TestMailer.create_cancelled_account(@recipient) } assert_not_nil created + expected.message_id = '<123@456>' + created.message_id = '<123@456>' assert_equal expected.encoded, created.encoded assert_nothing_raised { TestMailer.deliver_cancelled_account(@recipient) } assert_not_nil ActionMailer::Base.deliveries.first - assert_equal expected.encoded, ActionMailer::Base.deliveries.first.encoded + delivered = ActionMailer::Base.deliveries.first + expected.message_id = '<123@456>' + delivered.message_id = '<123@456>' + + assert_equal expected.encoded, delivered.encoded end def test_cc_bcc - expected = new_mail + expected = new_mail('US-ASCII') expected.to = @recipient expected.subject = "testing bcc/cc" expected.body = "Nothing to see here." @@ -477,6 +485,8 @@ class ActionMailerTest < Test::Unit::TestCase created = TestMailer.create_cc_bcc @recipient end assert_not_nil created + expected.message_id = '<123@456>' + created.message_id = '<123@456>' assert_equal expected.encoded, created.encoded assert_nothing_raised do @@ -484,7 +494,11 @@ class ActionMailerTest < Test::Unit::TestCase end assert_not_nil ActionMailer::Base.deliveries.first - assert_equal expected.encoded, ActionMailer::Base.deliveries.first.encoded + delivered = ActionMailer::Base.deliveries.first + expected.message_id = '<123@456>' + delivered.message_id = '<123@456>' + + assert_equal expected.encoded, delivered.encoded end def test_reply_to @@ -636,7 +650,7 @@ Content-Type: text/plain; charset=iso-8859-1 The body EOF - mail = Mail.parse(msg) + mail = Mail.new(msg) assert_equal "testing testing \326\244", mail.subject.decoded assert_equal "=?utf-8?Q?testing_testing_=D6=A4?=", mail.quoted_subject end @@ -649,7 +663,7 @@ Content-Type: text/plain; charset=iso-8859-1 The body EOF - mail = Mail.parse(msg) + mail = Mail.new(msg) assert_equal "this == working?", mail.subject.decoded assert_equal "this == working?", mail.quoted_subject end @@ -663,7 +677,7 @@ Content-Transfer-Encoding: 7bit The=3Dbody EOF - mail = Mail.parse(msg) + mail = Mail.new(msg) assert_equal "The=3Dbody", mail.body.decoded.strip assert_equal "The=3Dbody", mail.quoted_body.strip end @@ -677,7 +691,7 @@ Content-Transfer-Encoding: quoted-printable The=3Dbody EOF - mail = Mail.parse(msg) + mail = Mail.new(msg) assert_equal "The=body", mail.body.decoded.strip assert_equal "The=3Dbody", mail.quoted_body.strip end @@ -691,7 +705,7 @@ Content-Transfer-Encoding: base64 VGhlIGJvZHk= EOF - mail = Mail.parse(msg) + mail = Mail.new(msg) assert_equal "The body", mail.body.decoded.strip assert_equal "VGhlIGJvZHk=", mail.quoted_body.strip end @@ -763,7 +777,7 @@ EOF def test_receive_attachments fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email2") - mail = Mail.parse(fixture) + mail = Mail.new(fixture) attachment = mail.attachments.last assert_equal "smime.p7s", attachment.original_filename assert_equal "application/pkcs7-signature", attachment.content_type @@ -771,21 +785,21 @@ EOF def test_decode_attachment_without_charset fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email3") - mail = Mail.parse(fixture) + mail = Mail.new(fixture) attachment = mail.attachments.last assert_equal 1026, attachment.read.length end def test_attachment_using_content_location fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email12") - mail = Mail.parse(fixture) + mail = Mail.new(fixture) assert_equal 1, mail.attachments.length 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 = Mail.parse(fixture) + mail = Mail.new(fixture) assert mail.has_attachments? assert_equal 1, mail.attachments.length assert_equal "hello.rb", mail.attachments.first.original_filename @@ -793,19 +807,19 @@ EOF def test_decode_part_without_content_type fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email4") - mail = Mail.parse(fixture) + mail = Mail.new(fixture) assert_nothing_raised { mail.body } end def test_decode_message_without_content_type fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email5") - mail = Mail.parse(fixture) + mail = Mail.new(fixture) assert_nothing_raised { mail.body } end def test_decode_message_with_incorrect_charset fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email6") - mail = Mail.parse(fixture) + mail = Mail.new(fixture) assert_nothing_raised { mail.body } end @@ -858,14 +872,14 @@ EOF mail = TestMailer.create_implicitly_multipart_example(@recipient) assert_equal 3, mail.parts.length - assert_equal "1.0", mail.mime_version - assert_equal "multipart/alternative", mail.content_type - assert_equal "application/x-yaml", mail.parts[0].content_type - assert_equal "utf-8", mail.parts[0].sub_header("content-type", "charset") - assert_equal "text/plain", mail.parts[1].content_type - assert_equal "utf-8", mail.parts[1].sub_header("content-type", "charset") - assert_equal "text/html", mail.parts[2].content_type - assert_equal "utf-8", mail.parts[2].sub_header("content-type", "charset") + assert_equal "1.0", mail.mime_version.decoded + assert_equal "multipart/alternative", mail.content_type.content_type + assert_equal "application/x-yaml", mail.parts[0].content_type.content_type + assert_equal "utf-8", mail.parts[0].content_type.parameters[:charset] + assert_equal "text/plain", mail.parts[1].content_type.content_type + assert_equal "utf-8", mail.parts[1].content_type.parameters[:charset] + assert_equal "text/html", mail.parts[2].content_type.content_type + assert_equal "utf-8", mail.parts[2].content_type.parameters[:charset] end def test_implicitly_multipart_messages_with_custom_order @@ -873,19 +887,19 @@ EOF mail = TestMailer.create_implicitly_multipart_example(@recipient, nil, ["application/x-yaml", "text/plain"]) assert_equal 3, mail.parts.length - assert_equal "text/html", mail.parts[0].content_type - assert_equal "text/plain", mail.parts[1].content_type - assert_equal "application/x-yaml", mail.parts[2].content_type + assert_equal "text/html", mail.parts[0].content_type.content_type + assert_equal "text/plain", mail.parts[1].content_type.content_type + assert_equal "application/x-yaml", mail.parts[2].content_type.content_type end def test_implicitly_multipart_messages_with_charset mail = TestMailer.create_implicitly_multipart_example(@recipient, 'iso-8859-1') - assert_equal "multipart/alternative", mail.header['content-type'].body + assert_equal "multipart/alternative", mail.header['content-type'].content_type - assert_equal 'iso-8859-1', mail.parts[0].sub_header("content-type", "charset") - assert_equal 'iso-8859-1', mail.parts[1].sub_header("content-type", "charset") - assert_equal 'iso-8859-1', mail.parts[2].sub_header("content-type", "charset") + assert_equal 'iso-8859-1', mail.parts[0].content_type.parameters[:charset] + assert_equal 'iso-8859-1', mail.parts[1].content_type.parameters[:charset] + assert_equal 'iso-8859-1', mail.parts[2].content_type.parameters[:charset] end def test_html_mail @@ -935,13 +949,13 @@ EOF def test_recursive_multipart_processing fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email7") - mail = Mail.parse(fixture) + mail = Mail.new(fixture) assert_equal "This is the first part.\n\nAttachment: test.rb\nAttachment: test.pdf\n\n\nAttachment: smime.p7s\n", mail.body.decoded end def test_decode_encoded_attachment_filename fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email8") - mail = Mail.parse(fixture) + mail = Mail.new(fixture) attachment = mail.attachments.last expected = "01 Quien Te Dij\212at. Pitbull.mp3" @@ -952,7 +966,7 @@ EOF def test_decode_message_with_unknown_charset fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email10") - mail = Mail.parse(fixture) + mail = Mail.new(fixture) assert_nothing_raised { mail.body } end @@ -987,8 +1001,8 @@ EOF def test_custom_content_type_attributes mail = TestMailer.create_custom_content_type_attributes - assert_match %r{format=flowed}, mail['content-type'].to_s - assert_match %r{charset=utf-8}, mail['content-type'].to_s + assert_match %r{format=flowed}, mail.content_type.encoded + assert_match %r{charset=utf-8}, mail.content_type.encoded end def test_return_path_with_create @@ -1005,7 +1019,7 @@ EOF def test_body_is_stored_as_an_ivar mail = TestMailer.create_body_ivar(@recipient) - assert_equal "body: foo\nbar: baz", mail.body + assert_equal "body: foo\nbar: baz", mail.body.encoded end def test_starttls_is_enabled_if_supported diff --git a/actionmailer/test/quoting_test.rb b/actionmailer/test/quoting_test.rb index edac786906..1410712123 100644 --- a/actionmailer/test/quoting_test.rb +++ b/actionmailer/test/quoting_test.rb @@ -65,14 +65,14 @@ class QuotingTest < Test::Unit::TestCase # test an email that has been created using \r\n newlines, instead of # \n newlines. def test_email_quoted_with_0d0a - mail = Mail.parse(IO.read("#{File.dirname(__FILE__)}/fixtures/raw_email_quoted_with_0d0a")) + mail = Mail.new(IO.read("#{File.dirname(__FILE__)}/fixtures/raw_email_quoted_with_0d0a")) # CHANGED: subject returns an object now # assert_match %r{Elapsed time}, mail.body assert_match %r{Elapsed time}, mail.body.decoded end def test_email_with_partially_quoted_subject - mail = Mail.parse(IO.read("#{File.dirname(__FILE__)}/fixtures/raw_email_with_partially_quoted_subject")) + mail = Mail.new(IO.read("#{File.dirname(__FILE__)}/fixtures/raw_email_with_partially_quoted_subject")) # CHANGED: subject returns an object now # assert_equal "Re: Test: \"\346\274\242\345\255\227\" mid \"\346\274\242\345\255\227\" tail", mail.subject assert_equal "Re: Test: \"\346\274\242\345\255\227\" mid \"\346\274\242\345\255\227\" tail", mail.subject.decoded diff --git a/actionmailer/test/tmail_test.rb b/actionmailer/test/tmail_test.rb index 2097efdd65..2a3f2a9e55 100644 --- a/actionmailer/test/tmail_test.rb +++ b/actionmailer/test/tmail_test.rb @@ -14,7 +14,7 @@ class TMailMailTest < Test::Unit::TestCase def test_nested_attachments_are_recognized_correctly fixture = File.read("#{File.dirname(__FILE__)}/fixtures/raw_email_with_nested_attachment") - mail = Mail.parse(fixture) + mail = Mail.new(fixture) assert_equal 2, mail.attachments.length assert_equal "image/png", mail.attachments.first.content_type assert_equal 1902, mail.attachments.first.length diff --git a/actionmailer/test/url_test.rb b/actionmailer/test/url_test.rb index f654b2a3ae..427833b36c 100644 --- a/actionmailer/test/url_test.rb +++ b/actionmailer/test/url_test.rb @@ -34,7 +34,7 @@ class ActionMailerUrlTest < Test::Unit::TestCase mail = Mail.new mail.mime_version = "1.0" if charset - mail.set_content_type "text", "plain", { "charset" => charset } + mail.content_type ["text", "plain", { "charset" => charset }] end mail end