actionmailer 1.1.5 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionmailer might be problematic. Click here for more details.
- data/CHANGELOG +17 -0
- data/lib/action_mailer/adv_attr_accessor.rb +7 -3
- data/lib/action_mailer/base.rb +21 -10
- data/lib/action_mailer/part.rb +13 -8
- data/lib/action_mailer/part_container.rb +9 -0
- data/lib/action_mailer/vendor/tmail/attachments.rb +7 -2
- data/lib/action_mailer/vendor/tmail/quoting.rb +1 -1
- data/lib/action_mailer/version.rb +2 -2
- data/rakefile +3 -2
- data/test/fixtures/path.with.dots/multipart_with_template_path_with_dots.rhtml +1 -0
- data/test/fixtures/raw_email13 +29 -0
- data/test/fixtures/raw_email7 +10 -0
- data/test/fixtures/test_mailer/implicitly_multipart_example.ignored.rhtml +1 -0
- data/test/fixtures/test_mailer/implicitly_multipart_example.rhtml.bak +1 -0
- data/test/mail_service_test.rb +71 -2
- metadata +102 -94
data/CHANGELOG
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
*1.2.0* (March 27th, 2005)
|
2
|
+
|
3
|
+
* Nil charset caused subject line to be improperly quoted in implicitly multipart messages #2662 [ehalvorsen+rails@runbox.com]
|
4
|
+
|
5
|
+
* Parse content-type apart before using it so that sub-parts of the header can be set correctly #2918 [Jamis Buck]
|
6
|
+
|
7
|
+
* Make custom headers work in subparts #4034 [elan@bluemandrill.com]
|
8
|
+
|
9
|
+
* Template paths with dot chars in them no longer mess up implicit template selection for multipart messages #3332 [Chad Fowler]
|
10
|
+
|
11
|
+
* Make sure anything with content-disposition of "attachment" is passed to the attachment presenter when parsing an email body [Jamis Buck]
|
12
|
+
|
13
|
+
* Make sure TMail#attachments includes anything with content-disposition of "attachment", regardless of content-type [Jamis Buck]
|
14
|
+
|
15
|
+
|
1
16
|
*1.1.5* (December 13th, 2005)
|
2
17
|
|
3
18
|
* Become part of Rails 1.0
|
@@ -7,6 +22,8 @@
|
|
7
22
|
|
8
23
|
* Rename Version constant to VERSION. #2802 [Marcel Molina Jr.]
|
9
24
|
|
25
|
+
* 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 <dave@burt.id.au>, Jeremy Kemper]
|
26
|
+
|
10
27
|
|
11
28
|
*1.1.3* (November 7th, 2005)
|
12
29
|
|
@@ -8,16 +8,20 @@ module ActionMailer
|
|
8
8
|
module ClassMethods #:nodoc:
|
9
9
|
def adv_attr_accessor(*names)
|
10
10
|
names.each do |name|
|
11
|
+
ivar = "@#{name}"
|
12
|
+
|
11
13
|
define_method("#{name}=") do |value|
|
12
|
-
instance_variable_set(
|
14
|
+
instance_variable_set(ivar, value)
|
13
15
|
end
|
14
16
|
|
15
17
|
define_method(name) do |*parameters|
|
16
18
|
raise ArgumentError, "expected 0 or 1 parameters" unless parameters.length <= 1
|
17
19
|
if parameters.empty?
|
18
|
-
|
20
|
+
if instance_variables.include?(ivar)
|
21
|
+
instance_variable_get(ivar)
|
22
|
+
end
|
19
23
|
else
|
20
|
-
instance_variable_set(
|
24
|
+
instance_variable_set(ivar, parameters.first)
|
21
25
|
end
|
22
26
|
end
|
23
27
|
end
|
data/lib/action_mailer/base.rb
CHANGED
@@ -4,7 +4,7 @@ require 'action_mailer/part_container'
|
|
4
4
|
require 'action_mailer/utils'
|
5
5
|
require 'tmail/net'
|
6
6
|
|
7
|
-
module ActionMailer
|
7
|
+
module ActionMailer #:nodoc:
|
8
8
|
# Usage:
|
9
9
|
#
|
10
10
|
# class ApplicationMailer < ActionMailer::Base
|
@@ -121,6 +121,10 @@ module ActionMailer
|
|
121
121
|
class Base
|
122
122
|
include AdvAttrAccessor, PartContainer
|
123
123
|
|
124
|
+
# Action Mailer subclasses should be reloaded by the dispatcher in Rails
|
125
|
+
# when Dependencies.mechanism = :load.
|
126
|
+
include Reloadable::Subclasses
|
127
|
+
|
124
128
|
private_class_method :new #:nodoc:
|
125
129
|
|
126
130
|
cattr_accessor :template_root
|
@@ -278,15 +282,17 @@ module ActionMailer
|
|
278
282
|
if @parts.empty?
|
279
283
|
templates = Dir.glob("#{template_path}/#{@template}.*")
|
280
284
|
templates.each do |path|
|
281
|
-
|
282
|
-
|
283
|
-
|
285
|
+
# TODO: don't hardcode rhtml|rxml
|
286
|
+
basename = File.basename(path)
|
287
|
+
next unless md = /^([^\.]+)\.([^\.]+\.[^\+]+)\.(rhtml|rxml)$/.match(basename)
|
288
|
+
template_name = basename
|
289
|
+
content_type = md.captures[1].gsub('.', '/')
|
290
|
+
@parts << Part.new(:content_type => content_type,
|
284
291
|
:disposition => "inline", :charset => charset,
|
285
|
-
:body => render_message(
|
292
|
+
:body => render_message(template_name, @body))
|
286
293
|
end
|
287
294
|
unless @parts.empty?
|
288
295
|
@content_type = "multipart/alternative"
|
289
|
-
@charset = nil
|
290
296
|
@parts = sort_parts(@parts, @implicit_parts_order)
|
291
297
|
end
|
292
298
|
end
|
@@ -296,7 +302,7 @@ module ActionMailer
|
|
296
302
|
# normal template exists (or if there were no implicit parts) we render
|
297
303
|
# it.
|
298
304
|
template_exists = @parts.empty?
|
299
|
-
template_exists ||= Dir.glob("#{template_path}/#{@template}.*").any? { |i| i.split(".").length == 2 }
|
305
|
+
template_exists ||= Dir.glob("#{template_path}/#{@template}.*").any? { |i| File.basename(i).split(".").length == 2 }
|
300
306
|
@body = render_message(@template, @body) if template_exists
|
301
307
|
|
302
308
|
# Finally, if there are other message parts and a textual body exists,
|
@@ -406,14 +412,16 @@ module ActionMailer
|
|
406
412
|
m.date = sent_on.to_time rescue sent_on if sent_on
|
407
413
|
headers.each { |k, v| m[k] = v }
|
408
414
|
|
415
|
+
real_content_type, ctype_attrs = parse_content_type
|
416
|
+
|
409
417
|
if @parts.empty?
|
410
|
-
m.set_content_type
|
418
|
+
m.set_content_type(real_content_type, nil, ctype_attrs)
|
411
419
|
m.body = Utils.normalize_new_lines(body)
|
412
420
|
else
|
413
421
|
if String === body
|
414
422
|
part = TMail::Mail.new
|
415
423
|
part.body = Utils.normalize_new_lines(body)
|
416
|
-
part.set_content_type
|
424
|
+
part.set_content_type(real_content_type, nil, ctype_attrs)
|
417
425
|
part.set_content_disposition "inline"
|
418
426
|
m.parts << part
|
419
427
|
end
|
@@ -423,7 +431,10 @@ module ActionMailer
|
|
423
431
|
m.parts << part
|
424
432
|
end
|
425
433
|
|
426
|
-
|
434
|
+
if real_content_type =~ /multipart/
|
435
|
+
ctype_attrs.delete "charset"
|
436
|
+
m.set_content_type(real_content_type, nil, ctype_attrs)
|
437
|
+
end
|
427
438
|
end
|
428
439
|
|
429
440
|
@mail = m
|
data/lib/action_mailer/part.rb
CHANGED
@@ -56,6 +56,8 @@ module ActionMailer
|
|
56
56
|
def to_mail(defaults)
|
57
57
|
part = TMail::Mail.new
|
58
58
|
|
59
|
+
real_content_type, ctype_attrs = parse_content_type(defaults)
|
60
|
+
|
59
61
|
if @parts.empty?
|
60
62
|
part.content_transfer_encoding = transfer_encoding || "quoted-printable"
|
61
63
|
case (transfer_encoding || "").downcase
|
@@ -71,20 +73,20 @@ module ActionMailer
|
|
71
73
|
# Also don't set filename and name when there is none (like in
|
72
74
|
# non-attachment parts)
|
73
75
|
if content_disposition == "attachment"
|
74
|
-
|
75
|
-
|
76
|
+
ctype_attrs.delete "charset"
|
77
|
+
part.set_content_type(real_content_type, nil,
|
78
|
+
squish("name" => filename).merge(ctype_attrs))
|
76
79
|
part.set_content_disposition(content_disposition,
|
77
|
-
squish("filename" => filename))
|
80
|
+
squish("filename" => filename).merge(ctype_attrs))
|
78
81
|
else
|
79
|
-
part.set_content_type(
|
80
|
-
"charset" => (charset || defaults.charset))
|
82
|
+
part.set_content_type(real_content_type, nil, ctype_attrs)
|
81
83
|
part.set_content_disposition(content_disposition)
|
82
84
|
end
|
83
85
|
else
|
84
86
|
if String === body
|
85
87
|
part = TMail::Mail.new
|
86
88
|
part.body = body
|
87
|
-
part.set_content_type
|
89
|
+
part.set_content_type(real_content_type, nil, ctype_attrs)
|
88
90
|
part.set_content_disposition "inline"
|
89
91
|
m.parts << part
|
90
92
|
end
|
@@ -94,13 +96,16 @@ module ActionMailer
|
|
94
96
|
part.parts << prt
|
95
97
|
end
|
96
98
|
|
97
|
-
part.set_content_type(
|
99
|
+
part.set_content_type(real_content_type, nil, ctype_attrs) if real_content_type =~ /multipart/
|
98
100
|
end
|
99
|
-
|
101
|
+
|
102
|
+
headers.each { |k,v| part[k] = v }
|
103
|
+
|
100
104
|
part
|
101
105
|
end
|
102
106
|
|
103
107
|
private
|
108
|
+
|
104
109
|
def squish(values={})
|
105
110
|
values.delete_if { |k,v| v.nil? }
|
106
111
|
end
|
@@ -38,5 +38,14 @@ module ActionMailer
|
|
38
38
|
part(params, &block)
|
39
39
|
end
|
40
40
|
|
41
|
+
private
|
42
|
+
|
43
|
+
def parse_content_type(defaults=nil)
|
44
|
+
return [defaults && defaults.content_type, {}] if content_type.blank?
|
45
|
+
ctype, *attrs = content_type.split(/;\s*/)
|
46
|
+
attrs = attrs.inject({}) { |h,s| k,v = s.split(/=/, 2); h[k] = v; h }
|
47
|
+
[ctype, {"charset" => charset || defaults && defaults.charset}.merge(attrs)]
|
48
|
+
end
|
49
|
+
|
41
50
|
end
|
42
51
|
end
|
@@ -7,13 +7,18 @@ module TMail
|
|
7
7
|
|
8
8
|
class Mail
|
9
9
|
def has_attachments?
|
10
|
-
multipart? && parts.any? { |part| part
|
10
|
+
multipart? && parts.any? { |part| attachment?(part) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def attachment?(part)
|
14
|
+
(part['content-disposition'] && part['content-disposition'].disposition == "attachment") ||
|
15
|
+
part.header['content-type'].main_type != "text"
|
11
16
|
end
|
12
17
|
|
13
18
|
def attachments
|
14
19
|
if multipart?
|
15
20
|
parts.collect { |part|
|
16
|
-
if part
|
21
|
+
if attachment?(part)
|
17
22
|
content = part.body # unquoted automatically by TMail#body
|
18
23
|
file_name = (part['content-location'] &&
|
19
24
|
part['content-location'].body) ||
|
data/rakefile
CHANGED
@@ -25,6 +25,7 @@ Rake::TestTask.new { |t|
|
|
25
25
|
t.libs << "test"
|
26
26
|
t.pattern = 'test/*_test.rb'
|
27
27
|
t.verbose = true
|
28
|
+
t.warning = false
|
28
29
|
}
|
29
30
|
|
30
31
|
|
@@ -32,7 +33,7 @@ Rake::TestTask.new { |t|
|
|
32
33
|
Rake::RDocTask.new { |rdoc|
|
33
34
|
rdoc.rdoc_dir = 'doc'
|
34
35
|
rdoc.title = "Action Mailer -- Easy email delivery and testing"
|
35
|
-
rdoc.options << '--line-numbers --inline-source
|
36
|
+
rdoc.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
|
36
37
|
rdoc.template = "#{ENV['template']}.rb" if ENV['template']
|
37
38
|
rdoc.rdoc_files.include('README', 'CHANGELOG')
|
38
39
|
rdoc.rdoc_files.include('lib/action_mailer.rb')
|
@@ -53,7 +54,7 @@ spec = Gem::Specification.new do |s|
|
|
53
54
|
s.rubyforge_project = "actionmailer"
|
54
55
|
s.homepage = "http://www.rubyonrails.org"
|
55
56
|
|
56
|
-
s.add_dependency('actionpack', '= 1.
|
57
|
+
s.add_dependency('actionpack', '= 1.12.0' + PKG_BUILD)
|
57
58
|
|
58
59
|
s.has_rdoc = true
|
59
60
|
s.requirements << 'none'
|
@@ -0,0 +1 @@
|
|
1
|
+
Have a lovely picture, from me. Enjoy!
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Mime-Version: 1.0 (Apple Message framework v730)
|
2
|
+
Content-Type: multipart/mixed; boundary=Apple-Mail-13-196941151
|
3
|
+
Message-Id: <9169D984-4E0B-45EF-82D4-8F5E53AD7012@example.com>
|
4
|
+
From: foo@example.com
|
5
|
+
Subject: testing
|
6
|
+
Date: Mon, 6 Jun 2005 22:21:22 +0200
|
7
|
+
To: blah@example.com
|
8
|
+
|
9
|
+
|
10
|
+
--Apple-Mail-13-196941151
|
11
|
+
Content-Transfer-Encoding: quoted-printable
|
12
|
+
Content-Type: text/plain;
|
13
|
+
charset=ISO-8859-1;
|
14
|
+
delsp=yes;
|
15
|
+
format=flowed
|
16
|
+
|
17
|
+
This is the first part.
|
18
|
+
|
19
|
+
--Apple-Mail-13-196941151
|
20
|
+
Content-Type: text/x-ruby-script; name="hello.rb"
|
21
|
+
Content-Transfer-Encoding: 7bit
|
22
|
+
Content-Disposition: attachment;
|
23
|
+
filename="api.rb"
|
24
|
+
|
25
|
+
puts "Hello, world!"
|
26
|
+
gets
|
27
|
+
|
28
|
+
--Apple-Mail-13-196941151--
|
29
|
+
|
data/test/fixtures/raw_email7
CHANGED
@@ -21,6 +21,16 @@ Content-Type: text/plain;
|
|
21
21
|
|
22
22
|
This is the first part.
|
23
23
|
|
24
|
+
--Apple-Mail-12-196940926
|
25
|
+
Content-Transfer-Encoding: 7bit
|
26
|
+
Content-Type: text/x-ruby-script;
|
27
|
+
x-unix-mode=0666;
|
28
|
+
name="test.rb"
|
29
|
+
Content-Disposition: attachment;
|
30
|
+
filename=test.rb
|
31
|
+
|
32
|
+
puts "testing, testing"
|
33
|
+
|
24
34
|
--Apple-Mail-12-196940926
|
25
35
|
Content-Transfer-Encoding: base64
|
26
36
|
Content-Type: application/pdf;
|
@@ -0,0 +1 @@
|
|
1
|
+
Ignored when searching for implicitly multipart parts.
|
@@ -0,0 +1 @@
|
|
1
|
+
Ignored when searching for implicitly multipart parts.
|
data/test/mail_service_test.rb
CHANGED
@@ -23,6 +23,20 @@ class Net::SMTP
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
class FunkyPathMailer < ActionMailer::Base
|
27
|
+
def multipart_with_template_path_with_dots(recipient)
|
28
|
+
recipients recipient
|
29
|
+
subject "Have a lovely picture"
|
30
|
+
from "Chad Fowler <chad@chadfowler.com>"
|
31
|
+
attachment :content_type => "image/jpeg",
|
32
|
+
:body => "not really a jpeg, we're only testing, after all"
|
33
|
+
end
|
34
|
+
|
35
|
+
def template_path
|
36
|
+
"#{File.dirname(__FILE__)}/fixtures/path.with.dots"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
26
40
|
class TestMailer < ActionMailer::Base
|
27
41
|
|
28
42
|
def signed_up(recipient)
|
@@ -153,6 +167,14 @@ class TestMailer < ActionMailer::Base
|
|
153
167
|
@implicit_parts_order = order if order
|
154
168
|
end
|
155
169
|
|
170
|
+
def implicitly_multipart_with_utf8
|
171
|
+
recipients "no.one@nowhere.test"
|
172
|
+
subject "Foo áëô îü"
|
173
|
+
from "some.one@somewhere.test"
|
174
|
+
template "implicitly_multipart_example"
|
175
|
+
body ({ "recipient" => "no.one@nowhere.test" })
|
176
|
+
end
|
177
|
+
|
156
178
|
def html_mail(recipient)
|
157
179
|
recipients recipient
|
158
180
|
subject "html mail"
|
@@ -204,6 +226,15 @@ class TestMailer < ActionMailer::Base
|
|
204
226
|
end
|
205
227
|
attachment :content_type => "application/octet-stream",:filename => "test.txt", :body => "test abcdefghijklmnopqstuvwxyz"
|
206
228
|
end
|
229
|
+
|
230
|
+
def attachment_with_custom_header(recipient)
|
231
|
+
recipients recipient
|
232
|
+
subject "custom header in attachment"
|
233
|
+
from "test@example.com"
|
234
|
+
content_type "multipart/related"
|
235
|
+
part :content_type => "text/html", :body => 'yo'
|
236
|
+
attachment :content_type => "image/jpeg",:filename => "test.jpeg", :body => "i am not a real picture", :headers => { 'Content-ID' => '<test@test.com>' }
|
237
|
+
end
|
207
238
|
|
208
239
|
def unnamed_attachment(recipient)
|
209
240
|
recipients recipient
|
@@ -223,6 +254,14 @@ class TestMailer < ActionMailer::Base
|
|
223
254
|
body "testing"
|
224
255
|
end
|
225
256
|
|
257
|
+
def custom_content_type_attributes
|
258
|
+
recipients "no.one@nowhere.test"
|
259
|
+
subject "custom content types"
|
260
|
+
from "some.one@somewhere.test"
|
261
|
+
content_type "text/plain; format=flowed"
|
262
|
+
body "testing"
|
263
|
+
end
|
264
|
+
|
226
265
|
class <<self
|
227
266
|
attr_accessor :received_body
|
228
267
|
end
|
@@ -270,6 +309,12 @@ class ActionMailerTest < Test::Unit::TestCase
|
|
270
309
|
assert_equal "application/octet-stream", created.parts[1].content_type
|
271
310
|
end
|
272
311
|
|
312
|
+
def test_attachment_with_custom_header
|
313
|
+
created = nil
|
314
|
+
assert_nothing_raised { created = TestMailer.create_attachment_with_custom_header(@recipient)}
|
315
|
+
assert_equal "<test@test.com>", created.parts[1].header['content-id'].to_s
|
316
|
+
end
|
317
|
+
|
273
318
|
def test_signed_up
|
274
319
|
expected = new_mail
|
275
320
|
expected.to = @recipient
|
@@ -573,6 +618,14 @@ EOF
|
|
573
618
|
assert_equal "Photo25.jpg", mail.attachments.first.original_filename
|
574
619
|
end
|
575
620
|
|
621
|
+
def test_attachment_with_text_type
|
622
|
+
fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email13")
|
623
|
+
mail = TMail::Mail.parse(fixture)
|
624
|
+
assert mail.has_attachments?
|
625
|
+
assert_equal 1, mail.attachments.length
|
626
|
+
assert_equal "hello.rb", mail.attachments.first.original_filename
|
627
|
+
end
|
628
|
+
|
576
629
|
def test_decode_part_without_content_type
|
577
630
|
fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email4")
|
578
631
|
mail = TMail::Mail.parse(fixture)
|
@@ -601,6 +654,11 @@ EOF
|
|
601
654
|
assert_match(/\nSubject: =\?utf-8\?Q\?Foo_.*?\?=/, mail.encoded)
|
602
655
|
end
|
603
656
|
|
657
|
+
def test_implicitly_multipart_with_utf8
|
658
|
+
mail = TestMailer.create_implicitly_multipart_with_utf8
|
659
|
+
assert_match(/\nSubject: =\?utf-8\?Q\?Foo_.*?\?=/, mail.encoded)
|
660
|
+
end
|
661
|
+
|
604
662
|
def test_explicitly_multipart_messages
|
605
663
|
mail = TestMailer.create_explicitly_multipart_example(@recipient)
|
606
664
|
assert_equal 3, mail.parts.length
|
@@ -697,7 +755,7 @@ EOF
|
|
697
755
|
def test_recursive_multipart_processing
|
698
756
|
fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email7")
|
699
757
|
mail = TMail::Mail.parse(fixture)
|
700
|
-
assert_equal "This is the first part.\n\nAttachment: test.pdf\n\n\nAttachment: smime.p7s\n", mail.body
|
758
|
+
assert_equal "This is the first part.\n\nAttachment: test.rb\nAttachment: test.pdf\n\n\nAttachment: smime.p7s\n", mail.body
|
701
759
|
end
|
702
760
|
|
703
761
|
def test_decode_encoded_attachment_filename
|
@@ -741,9 +799,20 @@ EOF
|
|
741
799
|
end
|
742
800
|
|
743
801
|
def test_deliver_with_mail_object
|
744
|
-
mail = TestMailer
|
802
|
+
mail = TestMailer.create_headers_with_nonalpha_chars(@recipient)
|
745
803
|
assert_nothing_raised { TestMailer.deliver(mail) }
|
746
804
|
assert_equal 1, TestMailer.deliveries.length
|
747
805
|
end
|
806
|
+
|
807
|
+
def test_multipart_with_template_path_with_dots
|
808
|
+
mail = FunkyPathMailer.create_multipart_with_template_path_with_dots(@recipient)
|
809
|
+
assert_equal 2, mail.parts.length
|
810
|
+
end
|
811
|
+
|
812
|
+
def test_custom_content_type_attributes
|
813
|
+
mail = TestMailer.create_custom_content_type_attributes
|
814
|
+
assert_match %r{format=flowed}, mail['content-type'].to_s
|
815
|
+
assert_match %r{charset=utf-8}, mail['content-type'].to_s
|
816
|
+
end
|
748
817
|
end
|
749
818
|
|
metadata
CHANGED
@@ -3,11 +3,11 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: actionmailer
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.
|
7
|
-
date:
|
6
|
+
version: 1.2.0
|
7
|
+
date: 2006-03-27 00:00:00 -06:00
|
8
8
|
summary: Service layer for easy email delivery and testing.
|
9
9
|
require_paths:
|
10
|
-
|
10
|
+
- lib
|
11
11
|
email: david@loudthinking.com
|
12
12
|
homepage: http://www.rubyonrails.org
|
13
13
|
rubyforge_project: actionmailer
|
@@ -18,107 +18,115 @@ bindir: bin
|
|
18
18
|
has_rdoc: true
|
19
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
20
|
requirements:
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
version: 0.0.0
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
25
24
|
version:
|
26
25
|
platform: ruby
|
27
26
|
signing_key:
|
28
27
|
cert_chain:
|
29
28
|
authors:
|
30
|
-
|
29
|
+
- David Heinemeier Hansson
|
31
30
|
files:
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
31
|
+
- rakefile
|
32
|
+
- install.rb
|
33
|
+
- README
|
34
|
+
- CHANGELOG
|
35
|
+
- MIT-LICENSE
|
36
|
+
- lib/action_mailer
|
37
|
+
- lib/action_mailer.rb
|
38
|
+
- lib/action_mailer/adv_attr_accessor.rb
|
39
|
+
- lib/action_mailer/base.rb
|
40
|
+
- lib/action_mailer/helpers.rb
|
41
|
+
- lib/action_mailer/mail_helper.rb
|
42
|
+
- lib/action_mailer/part.rb
|
43
|
+
- lib/action_mailer/part_container.rb
|
44
|
+
- lib/action_mailer/quoting.rb
|
45
|
+
- lib/action_mailer/utils.rb
|
46
|
+
- lib/action_mailer/vendor
|
47
|
+
- lib/action_mailer/version.rb
|
48
|
+
- lib/action_mailer/vendor/text
|
49
|
+
- lib/action_mailer/vendor/tmail
|
50
|
+
- lib/action_mailer/vendor/tmail.rb
|
51
|
+
- lib/action_mailer/vendor/text/format.rb
|
52
|
+
- lib/action_mailer/vendor/tmail/address.rb
|
53
|
+
- lib/action_mailer/vendor/tmail/attachments.rb
|
54
|
+
- lib/action_mailer/vendor/tmail/base64.rb
|
55
|
+
- lib/action_mailer/vendor/tmail/config.rb
|
56
|
+
- lib/action_mailer/vendor/tmail/encode.rb
|
57
|
+
- lib/action_mailer/vendor/tmail/facade.rb
|
58
|
+
- lib/action_mailer/vendor/tmail/header.rb
|
59
|
+
- lib/action_mailer/vendor/tmail/info.rb
|
60
|
+
- lib/action_mailer/vendor/tmail/loader.rb
|
61
|
+
- lib/action_mailer/vendor/tmail/mail.rb
|
62
|
+
- lib/action_mailer/vendor/tmail/mailbox.rb
|
63
|
+
- lib/action_mailer/vendor/tmail/mbox.rb
|
64
|
+
- lib/action_mailer/vendor/tmail/net.rb
|
65
|
+
- lib/action_mailer/vendor/tmail/obsolete.rb
|
66
|
+
- lib/action_mailer/vendor/tmail/parser.rb
|
67
|
+
- lib/action_mailer/vendor/tmail/port.rb
|
68
|
+
- lib/action_mailer/vendor/tmail/quoting.rb
|
69
|
+
- lib/action_mailer/vendor/tmail/scanner.rb
|
70
|
+
- lib/action_mailer/vendor/tmail/scanner_r.rb
|
71
|
+
- lib/action_mailer/vendor/tmail/stringio.rb
|
72
|
+
- lib/action_mailer/vendor/tmail/tmail.rb
|
73
|
+
- lib/action_mailer/vendor/tmail/utils.rb
|
74
|
+
- test/fixtures
|
75
|
+
- test/mail_helper_test.rb
|
76
|
+
- test/mail_render_test.rb
|
77
|
+
- test/mail_service_test.rb
|
78
|
+
- test/quoting_test.rb
|
79
|
+
- test/tmail_test.rb
|
80
|
+
- test/fixtures/helper_mailer
|
81
|
+
- test/fixtures/helpers
|
82
|
+
- test/fixtures/path.with.dots
|
83
|
+
- test/fixtures/raw_email
|
84
|
+
- test/fixtures/raw_email10
|
85
|
+
- test/fixtures/raw_email11
|
86
|
+
- test/fixtures/raw_email12
|
87
|
+
- test/fixtures/raw_email13
|
88
|
+
- test/fixtures/raw_email2
|
89
|
+
- test/fixtures/raw_email3
|
90
|
+
- test/fixtures/raw_email4
|
91
|
+
- test/fixtures/raw_email5
|
92
|
+
- test/fixtures/raw_email6
|
93
|
+
- test/fixtures/raw_email7
|
94
|
+
- test/fixtures/raw_email8
|
95
|
+
- test/fixtures/raw_email9
|
96
|
+
- test/fixtures/templates
|
97
|
+
- test/fixtures/test_mailer
|
98
|
+
- test/fixtures/helper_mailer/use_helper.rhtml
|
99
|
+
- test/fixtures/helper_mailer/use_helper_method.rhtml
|
100
|
+
- test/fixtures/helper_mailer/use_mail_helper.rhtml
|
101
|
+
- test/fixtures/helper_mailer/use_test_helper.rhtml
|
102
|
+
- test/fixtures/helpers/test_helper.rb
|
103
|
+
- test/fixtures/path.with.dots/multipart_with_template_path_with_dots.rhtml
|
104
|
+
- test/fixtures/templates/signed_up.rhtml
|
105
|
+
- test/fixtures/test_mailer/implicitly_multipart_example.ignored.rhtml
|
106
|
+
- test/fixtures/test_mailer/implicitly_multipart_example.rhtml.bak
|
107
|
+
- test/fixtures/test_mailer/implicitly_multipart_example.text.html.rhtml
|
108
|
+
- test/fixtures/test_mailer/implicitly_multipart_example.text.plain.rhtml
|
109
|
+
- test/fixtures/test_mailer/implicitly_multipart_example.text.yaml.rhtml
|
110
|
+
- test/fixtures/test_mailer/signed_up.rhtml
|
107
111
|
test_files: []
|
112
|
+
|
108
113
|
rdoc_options: []
|
114
|
+
|
109
115
|
extra_rdoc_files: []
|
116
|
+
|
110
117
|
executables: []
|
118
|
+
|
111
119
|
extensions: []
|
120
|
+
|
112
121
|
requirements:
|
113
|
-
|
122
|
+
- none
|
114
123
|
dependencies:
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
version:
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: actionpack
|
126
|
+
version_requirement:
|
127
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 1.12.0
|
132
|
+
version:
|