actionmailer 5.0.7.2 → 5.1.0.beta1
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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +16 -183
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/lib/action_mailer.rb +11 -11
- data/lib/action_mailer/base.rb +150 -137
- data/lib/action_mailer/collector.rb +3 -3
- data/lib/action_mailer/delivery_job.rb +1 -1
- data/lib/action_mailer/delivery_methods.rb +7 -7
- data/lib/action_mailer/gem_version.rb +3 -3
- data/lib/action_mailer/inline_preview_interceptor.rb +4 -8
- data/lib/action_mailer/log_subscriber.rb +2 -2
- data/lib/action_mailer/mail_helper.rb +1 -1
- data/lib/action_mailer/message_delivery.rb +4 -4
- data/lib/action_mailer/parameterized.rb +152 -0
- data/lib/action_mailer/preview.rb +13 -12
- data/lib/action_mailer/railtie.rb +6 -6
- data/lib/action_mailer/test_case.rb +17 -19
- data/lib/action_mailer/test_helper.rb +3 -3
- data/lib/action_mailer/version.rb +1 -1
- data/lib/rails/generators/mailer/mailer_generator.rb +10 -11
- metadata +13 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 696c4f88a697ba0b0e13676985474e95a7223d3c
|
4
|
+
data.tar.gz: b96c279018c5233b31710b12789a436a6995f3bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 268f4af128811bec3ee5fcc8c3f524155db0d7263a1b7ba7f7a7f7fc09d623b886bcf9c5ca704aaa2ea39f905fcda273e67f1922cbd3bc58571a56a83c134ef5
|
7
|
+
data.tar.gz: bd1ea358a8ba9a02f7e13fc0154c9ce1415c83dbc21561e7bcf20f36bceec1d523cbaf93fe2d1ed42aced1fb3cc6478c632dbb932bd95b427f5d58999bbb0c54
|
data/CHANGELOG.md
CHANGED
@@ -1,200 +1,33 @@
|
|
1
|
-
## Rails 5.0.
|
1
|
+
## Rails 5.1.0.beta1 (February 23, 2017) ##
|
2
2
|
|
3
|
-
*
|
4
|
-
|
5
|
-
|
6
|
-
## Rails 5.0.7.1 (November 27, 2018) ##
|
7
|
-
|
8
|
-
* No changes.
|
9
|
-
|
10
|
-
|
11
|
-
## Rails 5.0.7 (March 29, 2018) ##
|
12
|
-
|
13
|
-
* No changes.
|
14
|
-
|
15
|
-
|
16
|
-
## Rails 5.0.6 (September 07, 2017) ##
|
17
|
-
|
18
|
-
* No changes.
|
19
|
-
|
20
|
-
|
21
|
-
## Rails 5.0.6.rc1 (August 24, 2017) ##
|
22
|
-
|
23
|
-
* No changes.
|
24
|
-
|
25
|
-
|
26
|
-
## Rails 5.0.5 (July 31, 2017) ##
|
27
|
-
|
28
|
-
* No changes.
|
29
|
-
|
30
|
-
|
31
|
-
## Rails 5.0.5.rc2 (July 25, 2017) ##
|
32
|
-
|
33
|
-
* No changes.
|
34
|
-
|
35
|
-
|
36
|
-
## Rails 5.0.5.rc1 (July 19, 2017) ##
|
37
|
-
|
38
|
-
* No changes.
|
39
|
-
|
40
|
-
|
41
|
-
## Rails 5.0.4 (June 19, 2017) ##
|
42
|
-
|
43
|
-
* No changes.
|
44
|
-
|
45
|
-
|
46
|
-
## Rails 5.0.3 (May 12, 2017) ##
|
47
|
-
|
48
|
-
* No changes.
|
49
|
-
|
50
|
-
|
51
|
-
## Rails 5.0.2 (March 01, 2017) ##
|
52
|
-
|
53
|
-
* No changes.
|
54
|
-
|
55
|
-
|
56
|
-
## Rails 5.0.1 (December 21, 2016) ##
|
57
|
-
|
58
|
-
* No changes.
|
59
|
-
|
60
|
-
|
61
|
-
## Rails 5.0.1.rc2 (December 10, 2016) ##
|
62
|
-
|
63
|
-
* No changes.
|
64
|
-
|
65
|
-
|
66
|
-
## Rails 5.0.1.rc1 (December 01, 2016) ##
|
67
|
-
|
68
|
-
* No changes.
|
69
|
-
|
70
|
-
|
71
|
-
## Rails 5.0.0 (June 30, 2016) ##
|
72
|
-
|
73
|
-
* Exception handling: use `rescue_from` to handle exceptions raised by
|
74
|
-
mailer actions, by message delivery, and by deferred delivery jobs.
|
75
|
-
|
76
|
-
*Jeremy Daer*
|
77
|
-
|
78
|
-
* Disallow calling `#deliver_later` after making local modifications to
|
79
|
-
the message which would be lost when the delivery job is enqueued.
|
80
|
-
|
81
|
-
Prevents a common, hard-to-find bug like:
|
82
|
-
|
83
|
-
message = Notifier.welcome(user, foo)
|
84
|
-
message.message_id = my_generated_message_id
|
85
|
-
message.deliver_later
|
86
|
-
|
87
|
-
The message_id is silently lost! *Only the mailer arguments are passed
|
88
|
-
to the delivery job.*
|
89
|
-
|
90
|
-
This raises an exception now. Make modifications to the message within
|
91
|
-
the mailer method instead, or use a custom Active Job to manage delivery
|
92
|
-
instead of using #deliver_later.
|
93
|
-
|
94
|
-
*Jeremy Daer*
|
95
|
-
|
96
|
-
* Removes `-t` from default Sendmail arguments to match the underlying
|
97
|
-
`Mail::Sendmail` setting.
|
98
|
-
|
99
|
-
*Clayton Liggitt*
|
100
|
-
|
101
|
-
* Add support for fragment caching in Action Mailer views.
|
102
|
-
|
103
|
-
*Stan Lo*
|
104
|
-
|
105
|
-
* Reset `ActionMailer::Base.deliveries` after every test in
|
106
|
-
`ActionDispatch::IntegrationTest`.
|
107
|
-
|
108
|
-
*Yves Senn*
|
109
|
-
|
110
|
-
* `config.action_mailer.default_url_options[:protocol]` is now set to `https` if `config.force_ssl` is set to `true`.
|
111
|
-
|
112
|
-
*Andrew Kampjes*
|
113
|
-
|
114
|
-
* Add `config.action_mailer.deliver_later_queue_name` configuration to set the
|
115
|
-
mailer queue name.
|
116
|
-
|
117
|
-
*Chris McGrath*
|
118
|
-
|
119
|
-
* `assert_emails` in block form, uses the given number as expected value.
|
120
|
-
This makes the error message much easier to understand.
|
3
|
+
* Add `:args` to `process.action_mailer` event.
|
121
4
|
|
122
5
|
*Yuji Yaginuma*
|
123
6
|
|
124
|
-
* Add
|
125
|
-
|
126
|
-
|
127
|
-
*Andrew White*
|
128
|
-
|
129
|
-
* Mailer preview now uses `url_for` to fix links to emails for apps running on
|
130
|
-
a subdirectory.
|
7
|
+
* Add parameterized invocation of mailers as a way to share before filters and defaults between actions.
|
8
|
+
See `ActionMailer::Parameterized` for a full example of the benefit.
|
131
9
|
|
132
|
-
*
|
10
|
+
*DHH*
|
133
11
|
|
134
|
-
*
|
135
|
-
(`NullMail`).
|
12
|
+
* Allow lambdas to be used as lazy defaults in addition to procs.
|
136
13
|
|
137
|
-
|
14
|
+
*DHH*
|
138
15
|
|
139
|
-
|
140
|
-
|
141
|
-
* Make sure labels and values line up in mailer previews.
|
142
|
-
|
143
|
-
*Yves Senn*
|
144
|
-
|
145
|
-
* Add `assert_enqueued_emails` and `assert_no_enqueued_emails`.
|
16
|
+
* Mime type: allow to custom content type when setting body in headers
|
17
|
+
and attachments.
|
146
18
|
|
147
19
|
Example:
|
148
20
|
|
149
21
|
def test_emails
|
150
|
-
|
151
|
-
|
152
|
-
ContactMailer.welcome.deliver_later
|
153
|
-
end
|
22
|
+
attachments["invoice.pdf"] = "This is test File content"
|
23
|
+
mail(body: "Hello there", content_type: "text/html")
|
154
24
|
end
|
155
25
|
|
156
|
-
|
157
|
-
assert_no_enqueued_emails do
|
158
|
-
# No emails enqueued here
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
*George Claghorn*
|
163
|
-
|
164
|
-
* Add `_mailer` suffix to mailers created via generator, following the same
|
165
|
-
naming convention used in controllers and jobs.
|
166
|
-
|
167
|
-
*Carlos Souza*
|
168
|
-
|
169
|
-
* Remove deprecated `*_path` helpers in email views.
|
170
|
-
|
171
|
-
*Rafael Mendonça França*
|
172
|
-
|
173
|
-
* Remove deprecated `deliver` and `deliver!` methods.
|
174
|
-
|
175
|
-
*claudiob*
|
26
|
+
*Minh Quy*
|
176
27
|
|
177
|
-
*
|
178
|
-
|
179
|
-
Given the following templates:
|
180
|
-
|
181
|
-
mailer/demo.html.erb
|
182
|
-
mailer/demo.en.html.erb
|
183
|
-
mailer/demo.pt.html.erb
|
184
|
-
|
185
|
-
Before this change, for a locale that doesn't have its associated file, the
|
186
|
-
`mailer/demo.html.erb` would be rendered even if `en` was the default locale.
|
187
|
-
|
188
|
-
Now `mailer/demo.en.html.erb` has precedence over the file without locale.
|
189
|
-
|
190
|
-
Also, it is possible to give a fallback.
|
191
|
-
|
192
|
-
mailer/demo.pt.html.erb
|
193
|
-
mailer/demo.pt-BR.html.erb
|
194
|
-
|
195
|
-
So if the locale is `pt-PT`, `mailer/demo.pt.html.erb` will be rendered given
|
196
|
-
the right I18n fallback configuration.
|
28
|
+
* Exception handling: use `rescue_from` to handle exceptions raised by
|
29
|
+
mailer actions, by message delivery, and by deferred delivery jobs.
|
197
30
|
|
198
|
-
*
|
31
|
+
*Jeremy Daer*
|
199
32
|
|
200
|
-
Please check [
|
33
|
+
Please check [5-0-stable](https://github.com/rails/rails/blob/5-0-stable/actionmailer/CHANGELOG.md) for previous changes.
|
data/MIT-LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -150,7 +150,7 @@ The latest version of Action Mailer can be installed with RubyGems:
|
|
150
150
|
|
151
151
|
Source code can be downloaded as part of the Rails project on GitHub
|
152
152
|
|
153
|
-
* https://github.com/rails/rails/tree/
|
153
|
+
* https://github.com/rails/rails/tree/master/actionmailer
|
154
154
|
|
155
155
|
|
156
156
|
== License
|
data/lib/action_mailer.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2004-
|
2
|
+
# Copyright (c) 2004-2017 David Heinemeier Hansson
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
# a copy of this software and associated documentation files (the
|
@@ -21,16 +21,15 @@
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
#++
|
23
23
|
|
24
|
-
require
|
25
|
-
require
|
24
|
+
require "abstract_controller"
|
25
|
+
require "action_mailer/version"
|
26
26
|
|
27
27
|
# Common Active Support usage in Action Mailer
|
28
|
-
require
|
29
|
-
require
|
30
|
-
require
|
31
|
-
require
|
32
|
-
require
|
33
|
-
require 'active_support/lazy_load_hooks'
|
28
|
+
require "active_support/rails"
|
29
|
+
require "active_support/core_ext/class"
|
30
|
+
require "active_support/core_ext/module/attr_internal"
|
31
|
+
require "active_support/core_ext/string/inflections"
|
32
|
+
require "active_support/lazy_load_hooks"
|
34
33
|
|
35
34
|
module ActionMailer
|
36
35
|
extend ::ActiveSupport::Autoload
|
@@ -43,15 +42,16 @@ module ActionMailer
|
|
43
42
|
autoload :DeliveryMethods
|
44
43
|
autoload :InlinePreviewInterceptor
|
45
44
|
autoload :MailHelper
|
45
|
+
autoload :Parameterized
|
46
46
|
autoload :Preview
|
47
|
-
autoload :Previews,
|
47
|
+
autoload :Previews, "action_mailer/preview"
|
48
48
|
autoload :TestCase
|
49
49
|
autoload :TestHelper
|
50
50
|
autoload :MessageDelivery
|
51
51
|
autoload :DeliveryJob
|
52
52
|
end
|
53
53
|
|
54
|
-
autoload :Mime,
|
54
|
+
autoload :Mime, "action_dispatch/http/mime_type"
|
55
55
|
|
56
56
|
ActiveSupport.on_load(:action_view) do
|
57
57
|
ActionView::Base.default_formats ||= Mime::SET.symbols
|
data/lib/action_mailer/base.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require "mail"
|
2
|
+
require "action_mailer/collector"
|
3
|
+
require "active_support/core_ext/string/inflections"
|
4
|
+
require "active_support/core_ext/hash/except"
|
5
|
+
require "active_support/core_ext/module/anonymous"
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
7
|
+
require "action_mailer/log_subscriber"
|
8
|
+
require "action_mailer/rescuable"
|
9
9
|
|
10
10
|
module ActionMailer
|
11
11
|
# Action Mailer allows you to send email from your application using a mailer model and views.
|
@@ -208,6 +208,19 @@ module ActionMailer
|
|
208
208
|
# end
|
209
209
|
# end
|
210
210
|
#
|
211
|
+
# You can also send attachments with html template, in this case you need to add body, attachments,
|
212
|
+
# and custom content type like this:
|
213
|
+
#
|
214
|
+
# class NotifierMailer < ApplicationMailer
|
215
|
+
# def welcome(recipient)
|
216
|
+
# attachments["free_book.pdf"] = File.read("path/to/file.pdf")
|
217
|
+
# mail(to: recipient,
|
218
|
+
# subject: "New account information",
|
219
|
+
# content_type: "text/html",
|
220
|
+
# body: "<html><body>Hello there</body></html>")
|
221
|
+
# end
|
222
|
+
# end
|
223
|
+
#
|
211
224
|
# = Inline Attachments
|
212
225
|
#
|
213
226
|
# You can also specify that a file should be displayed inline with other HTML. This is useful
|
@@ -275,20 +288,19 @@ module ActionMailer
|
|
275
288
|
# content_description: 'This is a description'
|
276
289
|
# end
|
277
290
|
#
|
278
|
-
# Finally, Action Mailer also supports passing <tt>Proc</tt> objects into the default hash,
|
279
|
-
# can define methods that evaluate as the message is being generated:
|
291
|
+
# Finally, Action Mailer also supports passing <tt>Proc</tt> and <tt>Lambda</tt> objects into the default hash,
|
292
|
+
# so you can define methods that evaluate as the message is being generated:
|
280
293
|
#
|
281
294
|
# class NotifierMailer < ApplicationMailer
|
282
|
-
# default 'X-Special-Header' => Proc.new { my_method }
|
295
|
+
# default 'X-Special-Header' => Proc.new { my_method }, to: -> { @inviter.email_address }
|
283
296
|
#
|
284
297
|
# private
|
285
|
-
#
|
286
298
|
# def my_method
|
287
299
|
# 'some complex call'
|
288
300
|
# end
|
289
301
|
# end
|
290
302
|
#
|
291
|
-
# Note that the proc is evaluated right at the start of the mail message generation, so if you
|
303
|
+
# Note that the proc/lambda is evaluated right at the start of the mail message generation, so if you
|
292
304
|
# set something in the default hash using a proc, and then set the same thing inside of your
|
293
305
|
# mailer method, it will get overwritten by the mailer method.
|
294
306
|
#
|
@@ -311,7 +323,6 @@ module ActionMailer
|
|
311
323
|
# end
|
312
324
|
#
|
313
325
|
# private
|
314
|
-
#
|
315
326
|
# def add_inline_attachment!
|
316
327
|
# attachments.inline["footer.jpg"] = File.read('/path/to/filename.jpg')
|
317
328
|
# end
|
@@ -390,9 +401,9 @@ module ActionMailer
|
|
390
401
|
# to use it. Defaults to <tt>true</tt>.
|
391
402
|
# * <tt>:openssl_verify_mode</tt> - When using TLS, you can set how OpenSSL checks the certificate. This is
|
392
403
|
# really useful if you need to validate a self-signed and/or a wildcard certificate. You can use the name
|
393
|
-
# of an OpenSSL verify constant (<tt>'none'</tt
|
394
|
-
# <tt>
|
395
|
-
# <tt
|
404
|
+
# of an OpenSSL verify constant (<tt>'none'</tt> or <tt>'peer'</tt>) or directly the constant
|
405
|
+
# (<tt>OpenSSL::SSL::VERIFY_NONE</tt> or <tt>OpenSSL::SSL::VERIFY_PEER</tt>).
|
406
|
+
# <tt>:ssl/:tls</tt> Enables the SMTP connection to use SMTP/TLS (SMTPS: SMTP over direct TLS connection)
|
396
407
|
#
|
397
408
|
# * <tt>sendmail_settings</tt> - Allows you to override options for the <tt>:sendmail</tt> delivery method.
|
398
409
|
# * <tt>:location</tt> - The location of the sendmail executable. Defaults to <tt>/usr/sbin/sendmail</tt>.
|
@@ -417,10 +428,11 @@ module ActionMailer
|
|
417
428
|
# * <tt>deliveries</tt> - Keeps an array of all the emails sent out through the Action Mailer with
|
418
429
|
# <tt>delivery_method :test</tt>. Most useful for unit and functional testing.
|
419
430
|
#
|
420
|
-
# * <tt>deliver_later_queue_name</tt> - The name of the queue used with <tt>deliver_later</tt>.
|
431
|
+
# * <tt>deliver_later_queue_name</tt> - The name of the queue used with <tt>deliver_later</tt>. Defaults to +mailers+.
|
421
432
|
class Base < AbstractController::Base
|
422
433
|
include DeliveryMethods
|
423
434
|
include Rescuable
|
435
|
+
include Parameterized
|
424
436
|
include Previews
|
425
437
|
|
426
438
|
abstract!
|
@@ -487,7 +499,7 @@ module ActionMailer
|
|
487
499
|
end
|
488
500
|
private :observer_class_for
|
489
501
|
|
490
|
-
# Returns the name of current mailer. This method is also being used as a path for a view lookup.
|
502
|
+
# Returns the name of the current mailer. This method is also being used as a path for a view lookup.
|
491
503
|
# If this is an anonymous mailer, this method will return +anonymous+ instead.
|
492
504
|
def mailer_name
|
493
505
|
@mailer_name ||= anonymous? ? "anonymous" : name.underscore
|
@@ -544,9 +556,9 @@ module ActionMailer
|
|
544
556
|
end
|
545
557
|
end
|
546
558
|
|
547
|
-
|
559
|
+
private
|
548
560
|
|
549
|
-
def set_payload_for_mail(payload, mail)
|
561
|
+
def set_payload_for_mail(payload, mail)
|
550
562
|
payload[:mailer] = name
|
551
563
|
payload[:message_id] = mail.message_id
|
552
564
|
payload[:subject] = mail.subject
|
@@ -558,7 +570,7 @@ module ActionMailer
|
|
558
570
|
payload[:mail] = mail.encoded
|
559
571
|
end
|
560
572
|
|
561
|
-
def method_missing(method_name, *args)
|
573
|
+
def method_missing(method_name, *args)
|
562
574
|
if action_methods.include?(method_name.to_s)
|
563
575
|
MessageDelivery.new(self, method_name, *args)
|
564
576
|
else
|
@@ -566,10 +578,8 @@ module ActionMailer
|
|
566
578
|
end
|
567
579
|
end
|
568
580
|
|
569
|
-
|
570
|
-
|
571
|
-
def respond_to_missing?(method, include_all = false) #:nodoc:
|
572
|
-
action_methods.include?(method.to_s)
|
581
|
+
def respond_to_missing?(method, include_all = false)
|
582
|
+
action_methods.include?(method.to_s) || super
|
573
583
|
end
|
574
584
|
end
|
575
585
|
|
@@ -588,7 +598,8 @@ module ActionMailer
|
|
588
598
|
def process(method_name, *args) #:nodoc:
|
589
599
|
payload = {
|
590
600
|
mailer: self.class.name,
|
591
|
-
action: method_name
|
601
|
+
action: method_name,
|
602
|
+
args: args
|
592
603
|
}
|
593
604
|
|
594
605
|
ActiveSupport::Notifications.instrument("process.action_mailer", payload) do
|
@@ -598,10 +609,10 @@ module ActionMailer
|
|
598
609
|
end
|
599
610
|
|
600
611
|
class NullMail #:nodoc:
|
601
|
-
def body;
|
612
|
+
def body; "" end
|
602
613
|
def header; {} end
|
603
614
|
|
604
|
-
def respond_to?(string, include_all=false)
|
615
|
+
def respond_to?(string, include_all = false)
|
605
616
|
true
|
606
617
|
end
|
607
618
|
|
@@ -830,138 +841,140 @@ module ActionMailer
|
|
830
841
|
message
|
831
842
|
end
|
832
843
|
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
844
|
+
private
|
845
|
+
|
846
|
+
# Used by #mail to set the content type of the message.
|
847
|
+
#
|
848
|
+
# It will use the given +user_content_type+, or multipart if the mail
|
849
|
+
# message has any attachments. If the attachments are inline, the content
|
850
|
+
# type will be "multipart/related", otherwise "multipart/mixed".
|
851
|
+
#
|
852
|
+
# If there is no content type passed in via headers, and there are no
|
853
|
+
# attachments, or the message is multipart, then the default content type is
|
854
|
+
# used.
|
855
|
+
def set_content_type(m, user_content_type, class_default) # :doc:
|
856
|
+
params = m.content_type_parameters || {}
|
857
|
+
case
|
858
|
+
when user_content_type.present?
|
859
|
+
user_content_type
|
860
|
+
when m.has_attachments?
|
861
|
+
if m.attachments.detect(&:inline?)
|
862
|
+
["multipart", "related", params]
|
863
|
+
else
|
864
|
+
["multipart", "mixed", params]
|
865
|
+
end
|
866
|
+
when m.multipart?
|
867
|
+
["multipart", "alternative", params]
|
852
868
|
else
|
853
|
-
|
869
|
+
m.content_type || class_default
|
854
870
|
end
|
855
|
-
when m.multipart?
|
856
|
-
["multipart", "alternative", params]
|
857
|
-
else
|
858
|
-
m.content_type || class_default
|
859
871
|
end
|
860
|
-
end
|
861
872
|
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
873
|
+
# Translates the +subject+ using Rails I18n class under <tt>[mailer_scope, action_name]</tt> scope.
|
874
|
+
# If it does not find a translation for the +subject+ under the specified scope it will default to a
|
875
|
+
# humanized version of the <tt>action_name</tt>.
|
876
|
+
# If the subject has interpolations, you can pass them through the +interpolations+ parameter.
|
877
|
+
def default_i18n_subject(interpolations = {}) # :doc:
|
878
|
+
mailer_scope = self.class.mailer_name.tr("/", ".")
|
879
|
+
I18n.t(:subject, interpolations.merge(scope: [mailer_scope, action_name], default: action_name.humanize))
|
880
|
+
end
|
870
881
|
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
882
|
+
# Emails do not support relative path links.
|
883
|
+
def self.supports_path? # :doc:
|
884
|
+
false
|
885
|
+
end
|
875
886
|
|
876
|
-
|
887
|
+
def apply_defaults(headers)
|
888
|
+
default_values = self.class.default.map do |key, value|
|
889
|
+
[
|
890
|
+
key,
|
891
|
+
value.is_a?(Proc) ? instance_exec(&value) : value
|
892
|
+
]
|
893
|
+
end.to_h
|
894
|
+
|
895
|
+
headers_with_defaults = headers.reverse_merge(default_values)
|
896
|
+
headers_with_defaults[:subject] ||= default_i18n_subject
|
897
|
+
headers_with_defaults
|
898
|
+
end
|
877
899
|
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
]
|
884
|
-
end.to_h
|
885
|
-
|
886
|
-
headers_with_defaults = headers.reverse_merge(default_values)
|
887
|
-
headers_with_defaults[:subject] ||= default_i18n_subject
|
888
|
-
headers_with_defaults
|
889
|
-
end
|
900
|
+
def assign_headers_to_message(message, headers)
|
901
|
+
assignable = headers.except(:parts_order, :content_type, :body, :template_name,
|
902
|
+
:template_path, :delivery_method, :delivery_method_options)
|
903
|
+
assignable.each { |k, v| message[k] = v }
|
904
|
+
end
|
890
905
|
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
906
|
+
def collect_responses(headers)
|
907
|
+
if block_given?
|
908
|
+
collector = ActionMailer::Collector.new(lookup_context) { render(action_name) }
|
909
|
+
yield(collector)
|
910
|
+
collector.responses
|
911
|
+
elsif headers[:body]
|
912
|
+
collect_responses_from_text(headers)
|
913
|
+
else
|
914
|
+
collect_responses_from_templates(headers)
|
915
|
+
end
|
916
|
+
end
|
896
917
|
|
897
|
-
|
898
|
-
if block_given?
|
899
|
-
collector = ActionMailer::Collector.new(lookup_context) { render(action_name) }
|
900
|
-
yield(collector)
|
901
|
-
collector.responses
|
902
|
-
elsif headers[:body]
|
918
|
+
def collect_responses_from_text(headers)
|
903
919
|
[{
|
904
920
|
body: headers.delete(:body),
|
905
|
-
content_type:
|
921
|
+
content_type: headers[:content_type] || "text/plain"
|
906
922
|
}]
|
907
|
-
else
|
908
|
-
collect_responses_from_templates(headers)
|
909
923
|
end
|
910
|
-
end
|
911
924
|
|
912
|
-
|
913
|
-
|
914
|
-
|
925
|
+
def collect_responses_from_templates(headers)
|
926
|
+
templates_path = headers[:template_path] || self.class.mailer_name
|
927
|
+
templates_name = headers[:template_name] || action_name
|
915
928
|
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
929
|
+
each_template(Array(templates_path), templates_name).map do |template|
|
930
|
+
self.formats = template.formats
|
931
|
+
{
|
932
|
+
body: render(template: template),
|
933
|
+
content_type: template.type.to_s
|
934
|
+
}
|
935
|
+
end
|
922
936
|
end
|
923
|
-
end
|
924
937
|
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
938
|
+
def each_template(paths, name, &block)
|
939
|
+
templates = lookup_context.find_all(name, paths)
|
940
|
+
if templates.empty?
|
941
|
+
raise ActionView::MissingTemplate.new(paths, name, paths, false, "mailer")
|
942
|
+
else
|
943
|
+
templates.uniq(&:formats).each(&block)
|
944
|
+
end
|
931
945
|
end
|
932
|
-
end
|
933
946
|
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
|
943
|
-
|
947
|
+
def create_parts_from_responses(m, responses)
|
948
|
+
if responses.size == 1 && !m.has_attachments?
|
949
|
+
responses[0].each { |k, v| m[k] = v }
|
950
|
+
elsif responses.size > 1 && m.has_attachments?
|
951
|
+
container = Mail::Part.new
|
952
|
+
container.content_type = "multipart/alternative"
|
953
|
+
responses.each { |r| insert_part(container, r, m.charset) }
|
954
|
+
m.add_part(container)
|
955
|
+
else
|
956
|
+
responses.each { |r| insert_part(m, r, m.charset) }
|
957
|
+
end
|
944
958
|
end
|
945
|
-
end
|
946
959
|
|
947
|
-
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
|
960
|
+
def insert_part(container, response, charset)
|
961
|
+
response[:charset] ||= charset
|
962
|
+
part = Mail::Part.new(response)
|
963
|
+
container.add_part(part)
|
964
|
+
end
|
952
965
|
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
966
|
+
# This and #instrument_name is for caching instrument
|
967
|
+
def instrument_payload(key)
|
968
|
+
{
|
969
|
+
mailer: mailer_name,
|
970
|
+
key: key
|
971
|
+
}
|
972
|
+
end
|
960
973
|
|
961
|
-
|
962
|
-
|
963
|
-
|
974
|
+
def instrument_name
|
975
|
+
"action_mailer".freeze
|
976
|
+
end
|
964
977
|
|
965
|
-
|
978
|
+
ActiveSupport.run_load_hooks(:action_mailer, self)
|
966
979
|
end
|
967
980
|
end
|