actionmailer 5.2.4.3 → 6.0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +70 -26
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -38
- data/lib/action_mailer.rb +2 -1
- data/lib/action_mailer/base.rb +54 -19
- data/lib/action_mailer/delivery_job.rb +8 -0
- data/lib/action_mailer/gem_version.rb +4 -4
- data/lib/action_mailer/inline_preview_interceptor.rb +1 -3
- data/lib/action_mailer/log_subscriber.rb +6 -2
- data/lib/action_mailer/mail_delivery_job.rb +38 -0
- data/lib/action_mailer/message_delivery.rb +10 -2
- data/lib/action_mailer/parameterized.rb +24 -7
- data/lib/action_mailer/preview.rb +22 -5
- data/lib/action_mailer/railtie.rb +18 -7
- data/lib/action_mailer/test_helper.rb +33 -14
- data/lib/rails/generators/mailer/mailer_generator.rb +1 -1
- metadata +20 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de242d8851f7d5940a59de2dd52dd79058abfc1829ae657718c8315d99ba7fd0
|
4
|
+
data.tar.gz: ac37fe72fdc553ea4f70504bb2eeeccb0f9b8a3b2aea6e246293923f955aa3cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b98de51cb6fbcdf058e6607d984cadf777201d10225279aba45b103aa98dabf2f8b7fdba37bdcee7cb557d136a1d9c88f468714e67f27c11bac625ebf1254114
|
7
|
+
data.tar.gz: 4810debde39deadb3ff9db7fec384ac1970acaa5a5990aed9214e22a0418b5171c0995625738297cd39b741b7970587a61665dc36b3c4a7781f68c22f47ce589
|
data/CHANGELOG.md
CHANGED
@@ -1,69 +1,113 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 6.0.2.1 (December 18, 2019) ##
|
2
2
|
|
3
3
|
* No changes.
|
4
4
|
|
5
5
|
|
6
|
-
## Rails
|
6
|
+
## Rails 6.0.2 (December 13, 2019) ##
|
7
|
+
|
8
|
+
* Fix ActionMailer assertions don't work for parameterized mail with legacy delivery job.
|
9
|
+
|
10
|
+
*bogdanvlviv*
|
11
|
+
|
12
|
+
|
13
|
+
## Rails 6.0.1 (November 5, 2019) ##
|
7
14
|
|
8
15
|
* No changes.
|
9
16
|
|
10
17
|
|
11
|
-
## Rails
|
18
|
+
## Rails 6.0.0 (August 16, 2019) ##
|
12
19
|
|
13
20
|
* No changes.
|
14
21
|
|
15
22
|
|
16
|
-
## Rails
|
23
|
+
## Rails 6.0.0.rc2 (July 22, 2019) ##
|
17
24
|
|
18
25
|
* No changes.
|
19
26
|
|
20
27
|
|
21
|
-
## Rails
|
28
|
+
## Rails 6.0.0.rc1 (April 24, 2019) ##
|
22
29
|
|
23
30
|
* No changes.
|
24
31
|
|
25
32
|
|
26
|
-
## Rails
|
33
|
+
## Rails 6.0.0.beta3 (March 11, 2019) ##
|
27
34
|
|
28
35
|
* No changes.
|
29
36
|
|
30
37
|
|
31
|
-
## Rails
|
38
|
+
## Rails 6.0.0.beta2 (February 25, 2019) ##
|
32
39
|
|
33
40
|
* No changes.
|
34
41
|
|
35
42
|
|
36
|
-
## Rails
|
43
|
+
## Rails 6.0.0.beta1 (January 18, 2019) ##
|
37
44
|
|
38
|
-
*
|
45
|
+
* Deprecate `ActionMailer::Base.receive` in favor of [Action Mailbox](https://github.com/rails/rails/tree/master/actionmailbox).
|
39
46
|
|
40
|
-
*
|
47
|
+
*George Claghorn*
|
48
|
+
|
49
|
+
* Add `MailDeliveryJob` for delivering both regular and parameterized mail. Deprecate using `DeliveryJob` and `Parameterized::DeliveryJob`.
|
50
|
+
|
51
|
+
*Gannon McGibbon*
|
52
|
+
|
53
|
+
* Fix ActionMailer assertions not working when a Mail defines
|
54
|
+
a custom delivery job class
|
55
|
+
|
56
|
+
*Edouard Chin*
|
57
|
+
|
58
|
+
* Mails with multipart `format` blocks with implicit render now also check for
|
59
|
+
a template name in options hash instead of only using the action name.
|
41
60
|
|
61
|
+
*Marcus Ilgner*
|
42
62
|
|
43
|
-
|
63
|
+
* `ActionDispatch::IntegrationTest` includes `ActionMailer::TestHelper` module by default.
|
44
64
|
|
45
|
-
*
|
46
|
-
since it was supported in Rails 5.0 but not deprecated.
|
65
|
+
*Ricardo Díaz*
|
47
66
|
|
48
|
-
|
67
|
+
* Add `perform_deliveries` to a payload of `deliver.action_mailer` notification.
|
49
68
|
|
50
|
-
*
|
69
|
+
*Yoshiyuki Kinjo*
|
70
|
+
|
71
|
+
* Change delivery logging message when `perform_deliveries` is false.
|
72
|
+
|
73
|
+
*Yoshiyuki Kinjo*
|
74
|
+
|
75
|
+
* Allow call `assert_enqueued_email_with` with no block.
|
76
|
+
|
77
|
+
Example:
|
78
|
+
```
|
79
|
+
def test_email
|
80
|
+
ContactMailer.welcome.deliver_later
|
81
|
+
assert_enqueued_email_with ContactMailer, :welcome
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_email_with_arguments
|
85
|
+
ContactMailer.welcome("Hello", "Goodbye").deliver_later
|
86
|
+
assert_enqueued_email_with ContactMailer, :welcome, args: ["Hello", "Goodbye"]
|
87
|
+
end
|
88
|
+
```
|
89
|
+
|
90
|
+
*bogdanvlviv*
|
91
|
+
|
92
|
+
* Ensure mail gem is eager autoloaded when eager load is true to prevent thread deadlocks.
|
93
|
+
|
94
|
+
*Samuel Cochran*
|
51
95
|
|
52
|
-
|
53
|
-
ContactMailer.welcome.deliver_later
|
54
|
-
end
|
96
|
+
* Perform email jobs in `assert_emails`.
|
55
97
|
|
56
|
-
*
|
98
|
+
*Gannon McGibbon*
|
57
99
|
|
58
|
-
*
|
100
|
+
* Add `Base.unregister_observer`, `Base.unregister_observers`,
|
101
|
+
`Base.unregister_interceptor`, `Base.unregister_interceptors`,
|
102
|
+
`Base.unregister_preview_interceptor` and `Base.unregister_preview_interceptors`.
|
103
|
+
This makes it possible to dynamically add and remove email observers and
|
104
|
+
interceptors at runtime in the same way they're registered.
|
59
105
|
|
60
|
-
|
61
|
-
self.delivery_job = MyCustomDeliveryJob
|
106
|
+
*Claudio Ortolina*, *Kota Miyake*
|
62
107
|
|
63
|
-
|
64
|
-
end
|
108
|
+
* Rails 6 requires Ruby 2.5.0 or newer.
|
65
109
|
|
66
|
-
*
|
110
|
+
*Jeremy Daer*, *Kasper Timm Hansen*
|
67
111
|
|
68
112
|
|
69
|
-
Please check [5-
|
113
|
+
Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/actionmailer/CHANGELOG.md) for previous changes.
|
data/MIT-LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -13,6 +13,8 @@ Additionally, an Action Mailer class can be used to process incoming email,
|
|
13
13
|
such as allowing a blog to accept new posts from an email (which could even
|
14
14
|
have been sent from a phone).
|
15
15
|
|
16
|
+
You can read more about Action Mailer in the {Action Mailer Basics}[https://edgeguides.rubyonrails.org/action_mailer_basics.html] guide.
|
17
|
+
|
16
18
|
== Sending emails
|
17
19
|
|
18
20
|
The framework works by initializing any instance variables you want to be
|
@@ -93,42 +95,6 @@ Example:
|
|
93
95
|
.....
|
94
96
|
end
|
95
97
|
|
96
|
-
== Receiving emails
|
97
|
-
|
98
|
-
To receive emails, you need to implement a public instance method called
|
99
|
-
+receive+ that takes an email object as its single parameter. The Action Mailer
|
100
|
-
framework has a corresponding class method, which is also called +receive+, that
|
101
|
-
accepts a raw, unprocessed email as a string, which it then turns into the email
|
102
|
-
object and calls the receive instance method.
|
103
|
-
|
104
|
-
Example:
|
105
|
-
|
106
|
-
class Mailman < ActionMailer::Base
|
107
|
-
def receive(email)
|
108
|
-
page = Page.find_by(address: email.to.first)
|
109
|
-
page.emails.create(
|
110
|
-
subject: email.subject, body: email.body
|
111
|
-
)
|
112
|
-
|
113
|
-
if email.has_attachments?
|
114
|
-
email.attachments.each do |attachment|
|
115
|
-
page.attachments.create({
|
116
|
-
file: attachment, description: email.subject
|
117
|
-
})
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
This Mailman can be the target for Postfix or other MTAs. In Rails, you would use
|
124
|
-
the runner in the trivial case like this:
|
125
|
-
|
126
|
-
rails runner 'Mailman.receive(STDIN.read)'
|
127
|
-
|
128
|
-
However, invoking Rails in the runner for each mail to be received is very
|
129
|
-
resource intensive. A single instance of Rails should be run within a daemon, if
|
130
|
-
it is going to process more than just a limited amount of email.
|
131
|
-
|
132
98
|
== Configuration
|
133
99
|
|
134
100
|
The Base class has the full list of configuration options. Here's an example:
|
@@ -150,7 +116,7 @@ The latest version of Action Mailer can be installed with RubyGems:
|
|
150
116
|
|
151
117
|
Source code can be downloaded as part of the Rails project on GitHub:
|
152
118
|
|
153
|
-
* https://github.com/rails/rails/tree/
|
119
|
+
* https://github.com/rails/rails/tree/master/actionmailer
|
154
120
|
|
155
121
|
|
156
122
|
== License
|
@@ -164,7 +130,7 @@ Action Mailer is released under the MIT license:
|
|
164
130
|
|
165
131
|
API documentation is at
|
166
132
|
|
167
|
-
*
|
133
|
+
* https://api.rubyonrails.org
|
168
134
|
|
169
135
|
Bug reports for the Ruby on Rails project can be filed here:
|
170
136
|
|
data/lib/action_mailer.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright (c) 2004-
|
4
|
+
# Copyright (c) 2004-2019 David Heinemeier Hansson
|
5
5
|
#
|
6
6
|
# Permission is hereby granted, free of charge, to any person obtaining
|
7
7
|
# a copy of this software and associated documentation files (the
|
@@ -52,6 +52,7 @@ module ActionMailer
|
|
52
52
|
autoload :TestHelper
|
53
53
|
autoload :MessageDelivery
|
54
54
|
autoload :DeliveryJob
|
55
|
+
autoload :MailDeliveryJob
|
55
56
|
|
56
57
|
def self.eager_load!
|
57
58
|
super
|
data/lib/action_mailer/base.rb
CHANGED
@@ -408,7 +408,7 @@ module ActionMailer
|
|
408
408
|
# really useful if you need to validate a self-signed and/or a wildcard certificate. You can use the name
|
409
409
|
# of an OpenSSL verify constant (<tt>'none'</tt> or <tt>'peer'</tt>) or directly the constant
|
410
410
|
# (<tt>OpenSSL::SSL::VERIFY_NONE</tt> or <tt>OpenSSL::SSL::VERIFY_PEER</tt>).
|
411
|
-
#
|
411
|
+
# * <tt>:ssl/:tls</tt> Enables the SMTP connection to use SMTP/TLS (SMTPS: SMTP over direct TLS connection)
|
412
412
|
#
|
413
413
|
# * <tt>sendmail_settings</tt> - Allows you to override options for the <tt>:sendmail</tt> delivery method.
|
414
414
|
# * <tt>:location</tt> - The location of the sendmail executable. Defaults to <tt>/usr/sbin/sendmail</tt>.
|
@@ -475,11 +475,21 @@ module ActionMailer
|
|
475
475
|
observers.flatten.compact.each { |observer| register_observer(observer) }
|
476
476
|
end
|
477
477
|
|
478
|
+
# Unregister one or more previously registered Observers.
|
479
|
+
def unregister_observers(*observers)
|
480
|
+
observers.flatten.compact.each { |observer| unregister_observer(observer) }
|
481
|
+
end
|
482
|
+
|
478
483
|
# Register one or more Interceptors which will be called before mail is sent.
|
479
484
|
def register_interceptors(*interceptors)
|
480
485
|
interceptors.flatten.compact.each { |interceptor| register_interceptor(interceptor) }
|
481
486
|
end
|
482
487
|
|
488
|
+
# Unregister one or more previously registered Interceptors.
|
489
|
+
def unregister_interceptors(*interceptors)
|
490
|
+
interceptors.flatten.compact.each { |interceptor| unregister_interceptor(interceptor) }
|
491
|
+
end
|
492
|
+
|
483
493
|
# Register an Observer which will be notified when mail is delivered.
|
484
494
|
# Either a class, string or symbol can be passed in as the Observer.
|
485
495
|
# If a string or symbol is passed in it will be camelized and constantized.
|
@@ -487,6 +497,13 @@ module ActionMailer
|
|
487
497
|
Mail.register_observer(observer_class_for(observer))
|
488
498
|
end
|
489
499
|
|
500
|
+
# Unregister a previously registered Observer.
|
501
|
+
# Either a class, string or symbol can be passed in as the Observer.
|
502
|
+
# If a string or symbol is passed in it will be camelized and constantized.
|
503
|
+
def unregister_observer(observer)
|
504
|
+
Mail.unregister_observer(observer_class_for(observer))
|
505
|
+
end
|
506
|
+
|
490
507
|
# Register an Interceptor which will be called before mail is sent.
|
491
508
|
# Either a class, string or symbol can be passed in as the Interceptor.
|
492
509
|
# If a string or symbol is passed in it will be camelized and constantized.
|
@@ -494,6 +511,13 @@ module ActionMailer
|
|
494
511
|
Mail.register_interceptor(observer_class_for(interceptor))
|
495
512
|
end
|
496
513
|
|
514
|
+
# Unregister a previously registered Interceptor.
|
515
|
+
# Either a class, string or symbol can be passed in as the Interceptor.
|
516
|
+
# If a string or symbol is passed in it will be camelized and constantized.
|
517
|
+
def unregister_interceptor(interceptor)
|
518
|
+
Mail.unregister_interceptor(observer_class_for(interceptor))
|
519
|
+
end
|
520
|
+
|
497
521
|
def observer_class_for(value) # :nodoc:
|
498
522
|
case value
|
499
523
|
when String, Symbol
|
@@ -541,6 +565,11 @@ module ActionMailer
|
|
541
565
|
# end
|
542
566
|
# end
|
543
567
|
def receive(raw_mail)
|
568
|
+
ActiveSupport::Deprecation.warn(<<~MESSAGE.squish)
|
569
|
+
ActionMailer::Base.receive is deprecated and will be removed in Rails 6.1.
|
570
|
+
Use Action Mailbox to process inbound email.
|
571
|
+
MESSAGE
|
572
|
+
|
544
573
|
ActiveSupport::Notifications.instrument("receive.action_mailer") do |payload|
|
545
574
|
mail = Mail.new(raw_mail)
|
546
575
|
set_payload_for_mail(payload, mail)
|
@@ -564,15 +593,16 @@ module ActionMailer
|
|
564
593
|
private
|
565
594
|
|
566
595
|
def set_payload_for_mail(payload, mail)
|
567
|
-
payload[:
|
568
|
-
payload[:
|
569
|
-
payload[:
|
570
|
-
payload[:
|
571
|
-
payload[:
|
572
|
-
payload[:
|
573
|
-
payload[:
|
574
|
-
payload[:
|
575
|
-
payload[:
|
596
|
+
payload[:mail] = mail.encoded
|
597
|
+
payload[:mailer] = name
|
598
|
+
payload[:message_id] = mail.message_id
|
599
|
+
payload[:subject] = mail.subject
|
600
|
+
payload[:to] = mail.to
|
601
|
+
payload[:from] = mail.from
|
602
|
+
payload[:bcc] = mail.bcc if mail.bcc.present?
|
603
|
+
payload[:cc] = mail.cc if mail.cc.present?
|
604
|
+
payload[:date] = mail.date
|
605
|
+
payload[:perform_deliveries] = mail.perform_deliveries
|
576
606
|
end
|
577
607
|
|
578
608
|
def method_missing(method_name, *args)
|
@@ -914,11 +944,9 @@ module ActionMailer
|
|
914
944
|
assignable.each { |k, v| message[k] = v }
|
915
945
|
end
|
916
946
|
|
917
|
-
def collect_responses(headers)
|
947
|
+
def collect_responses(headers, &block)
|
918
948
|
if block_given?
|
919
|
-
|
920
|
-
yield(collector)
|
921
|
-
collector.responses
|
949
|
+
collect_responses_from_block(headers, &block)
|
922
950
|
elsif headers[:body]
|
923
951
|
collect_responses_from_text(headers)
|
924
952
|
else
|
@@ -926,6 +954,13 @@ module ActionMailer
|
|
926
954
|
end
|
927
955
|
end
|
928
956
|
|
957
|
+
def collect_responses_from_block(headers)
|
958
|
+
templates_name = headers[:template_name] || action_name
|
959
|
+
collector = ActionMailer::Collector.new(lookup_context) { render(templates_name) }
|
960
|
+
yield(collector)
|
961
|
+
collector.responses
|
962
|
+
end
|
963
|
+
|
929
964
|
def collect_responses_from_text(headers)
|
930
965
|
[{
|
931
966
|
body: headers.delete(:body),
|
@@ -938,10 +973,10 @@ module ActionMailer
|
|
938
973
|
templates_name = headers[:template_name] || action_name
|
939
974
|
|
940
975
|
each_template(Array(templates_path), templates_name).map do |template|
|
941
|
-
|
976
|
+
format = template.format || self.formats.first
|
942
977
|
{
|
943
|
-
body: render(template: template),
|
944
|
-
content_type:
|
978
|
+
body: render(template: template, formats: [format]),
|
979
|
+
content_type: Mime[format].to_s
|
945
980
|
}
|
946
981
|
end
|
947
982
|
end
|
@@ -951,7 +986,7 @@ module ActionMailer
|
|
951
986
|
if templates.empty?
|
952
987
|
raise ActionView::MissingTemplate.new(paths, name, paths, false, "mailer")
|
953
988
|
else
|
954
|
-
templates.uniq(&:
|
989
|
+
templates.uniq(&:format).each(&block)
|
955
990
|
end
|
956
991
|
end
|
957
992
|
|
@@ -983,7 +1018,7 @@ module ActionMailer
|
|
983
1018
|
end
|
984
1019
|
|
985
1020
|
def instrument_name
|
986
|
-
"action_mailer"
|
1021
|
+
"action_mailer"
|
987
1022
|
end
|
988
1023
|
|
989
1024
|
ActiveSupport.run_load_hooks(:action_mailer, self)
|
@@ -12,6 +12,14 @@ module ActionMailer
|
|
12
12
|
|
13
13
|
rescue_from StandardError, with: :handle_exception_with_mailer_class
|
14
14
|
|
15
|
+
before_perform do
|
16
|
+
ActiveSupport::Deprecation.warn <<~MSG.squish
|
17
|
+
Sending mail with DeliveryJob and Parameterized::DeliveryJob
|
18
|
+
is deprecated and will be removed in Rails 6.1.
|
19
|
+
Please use MailDeliveryJob instead.
|
20
|
+
MSG
|
21
|
+
end
|
22
|
+
|
15
23
|
def perform(mailer, mail_method, delivery_method, *args) #:nodoc:
|
16
24
|
mailer.constantize.public_send(mail_method, *args).send(delivery_method)
|
17
25
|
end
|
@@ -9,8 +9,12 @@ module ActionMailer
|
|
9
9
|
# An email was delivered.
|
10
10
|
def deliver(event)
|
11
11
|
info do
|
12
|
-
|
13
|
-
|
12
|
+
perform_deliveries = event.payload[:perform_deliveries]
|
13
|
+
if perform_deliveries
|
14
|
+
"Delivered mail #{event.payload[:message_id]} (#{event.duration.round(1)}ms)"
|
15
|
+
else
|
16
|
+
"Skipped delivery of mail #{event.payload[:message_id]} as `perform_deliveries` is false"
|
17
|
+
end
|
14
18
|
end
|
15
19
|
|
16
20
|
debug { event.payload[:mail] }
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_job"
|
4
|
+
|
5
|
+
module ActionMailer
|
6
|
+
# The <tt>ActionMailer::MailDeliveryJob</tt> class is used when you
|
7
|
+
# want to send emails outside of the request-response cycle. It supports
|
8
|
+
# sending either parameterized or normal mail.
|
9
|
+
#
|
10
|
+
# Exceptions are rescued and handled by the mailer class.
|
11
|
+
class MailDeliveryJob < ActiveJob::Base # :nodoc:
|
12
|
+
queue_as { ActionMailer::Base.deliver_later_queue_name }
|
13
|
+
|
14
|
+
rescue_from StandardError, with: :handle_exception_with_mailer_class
|
15
|
+
|
16
|
+
def perform(mailer, mail_method, delivery_method, args:, params: nil) #:nodoc:
|
17
|
+
mailer_class = params ? mailer.constantize.with(params) : mailer.constantize
|
18
|
+
mailer_class.public_send(mail_method, *args).send(delivery_method)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
# "Deserialize" the mailer class name by hand in case another argument
|
23
|
+
# (like a Global ID reference) raised DeserializationError.
|
24
|
+
def mailer_class
|
25
|
+
if mailer = Array(@serialized_arguments).first || Array(arguments).first
|
26
|
+
mailer.constantize
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def handle_exception_with_mailer_class(exception)
|
31
|
+
if klass = mailer_class
|
32
|
+
klass.handle_exception exception
|
33
|
+
else
|
34
|
+
raise exception
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -29,7 +29,7 @@ module ActionMailer
|
|
29
29
|
@mail_message ||= processed_mailer.message
|
30
30
|
end
|
31
31
|
|
32
|
-
# Unused except for delegator internals (dup,
|
32
|
+
# Unused except for delegator internals (dup, marshalling).
|
33
33
|
def __setobj__(mail_message) #:nodoc:
|
34
34
|
@mail_message = mail_message
|
35
35
|
end
|
@@ -135,10 +135,18 @@ module ActionMailer
|
|
135
135
|
"#deliver_later, 2. only touch the message *within your mailer " \
|
136
136
|
"method*, or 3. use a custom Active Job instead of #deliver_later."
|
137
137
|
else
|
138
|
-
args = @mailer_class.name, @action.to_s, delivery_method.to_s, *@args
|
139
138
|
job = @mailer_class.delivery_job
|
139
|
+
args = arguments_for(job, delivery_method)
|
140
140
|
job.set(options).perform_later(*args)
|
141
141
|
end
|
142
142
|
end
|
143
|
+
|
144
|
+
def arguments_for(delivery_job, delivery_method)
|
145
|
+
if delivery_job <= MailDeliveryJob
|
146
|
+
[@mailer_class.name, @action.to_s, delivery_method.to_s, args: @args]
|
147
|
+
else
|
148
|
+
[@mailer_class.name, @action.to_s, delivery_method.to_s, *@args]
|
149
|
+
end
|
150
|
+
end
|
143
151
|
end
|
144
152
|
end
|
@@ -121,6 +121,12 @@ module ActionMailer
|
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
|
+
class DeliveryJob < ActionMailer::DeliveryJob # :nodoc:
|
125
|
+
def perform(mailer, mail_method, delivery_method, params, *args)
|
126
|
+
mailer.constantize.with(params).public_send(mail_method, *args).send(delivery_method)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
124
130
|
class MessageDelivery < ActionMailer::MessageDelivery # :nodoc:
|
125
131
|
def initialize(mailer_class, action, params, *args)
|
126
132
|
super(mailer_class, action, *args)
|
@@ -139,16 +145,27 @@ module ActionMailer
|
|
139
145
|
if processed?
|
140
146
|
super
|
141
147
|
else
|
142
|
-
|
143
|
-
|
148
|
+
job = delivery_job_class
|
149
|
+
args = arguments_for(job, delivery_method)
|
150
|
+
job.set(options).perform_later(*args)
|
144
151
|
end
|
145
152
|
end
|
146
|
-
end
|
147
153
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
154
|
+
def delivery_job_class
|
155
|
+
if @mailer_class.delivery_job <= MailDeliveryJob
|
156
|
+
@mailer_class.delivery_job
|
157
|
+
else
|
158
|
+
Parameterized::DeliveryJob
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def arguments_for(delivery_job, delivery_method)
|
163
|
+
if delivery_job <= MailDeliveryJob
|
164
|
+
[@mailer_class.name, @action.to_s, delivery_method.to_s, params: @params, args: @args]
|
165
|
+
else
|
166
|
+
[@mailer_class.name, @action.to_s, delivery_method.to_s, @params, *@args]
|
167
|
+
end
|
168
|
+
end
|
152
169
|
end
|
153
170
|
end
|
154
171
|
end
|
@@ -31,22 +31,39 @@ module ActionMailer
|
|
31
31
|
interceptors.flatten.compact.each { |interceptor| register_preview_interceptor(interceptor) }
|
32
32
|
end
|
33
33
|
|
34
|
+
# Unregister one or more previously registered Interceptors.
|
35
|
+
def unregister_preview_interceptors(*interceptors)
|
36
|
+
interceptors.flatten.compact.each { |interceptor| unregister_preview_interceptor(interceptor) }
|
37
|
+
end
|
38
|
+
|
34
39
|
# Register an Interceptor which will be called before mail is previewed.
|
35
40
|
# Either a class or a string can be passed in as the Interceptor. If a
|
36
41
|
# string is passed in it will be constantized.
|
37
42
|
def register_preview_interceptor(interceptor)
|
38
|
-
preview_interceptor =
|
43
|
+
preview_interceptor = interceptor_class_for(interceptor)
|
44
|
+
|
45
|
+
unless preview_interceptors.include?(preview_interceptor)
|
46
|
+
preview_interceptors << preview_interceptor
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Unregister a previously registered Interceptor.
|
51
|
+
# Either a class or a string can be passed in as the Interceptor. If a
|
52
|
+
# string is passed in it will be constantized.
|
53
|
+
def unregister_preview_interceptor(interceptor)
|
54
|
+
preview_interceptors.delete(interceptor_class_for(interceptor))
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def interceptor_class_for(interceptor)
|
39
60
|
case interceptor
|
40
61
|
when String, Symbol
|
41
62
|
interceptor.to_s.camelize.constantize
|
42
63
|
else
|
43
64
|
interceptor
|
44
65
|
end
|
45
|
-
|
46
|
-
unless preview_interceptors.include?(preview_interceptor)
|
47
|
-
preview_interceptors << preview_interceptor
|
48
66
|
end
|
49
|
-
end
|
50
67
|
end
|
51
68
|
end
|
52
69
|
|
@@ -46,10 +46,25 @@ module ActionMailer
|
|
46
46
|
register_preview_interceptors(options.delete(:preview_interceptors))
|
47
47
|
register_observers(options.delete(:observers))
|
48
48
|
|
49
|
+
if delivery_job = options.delete(:delivery_job)
|
50
|
+
self.delivery_job = delivery_job.constantize
|
51
|
+
end
|
52
|
+
|
49
53
|
options.each { |k, v| send("#{k}=", v) }
|
50
54
|
end
|
51
55
|
|
52
|
-
ActiveSupport.on_load(:action_dispatch_integration_test)
|
56
|
+
ActiveSupport.on_load(:action_dispatch_integration_test) do
|
57
|
+
include ActionMailer::TestHelper
|
58
|
+
include ActionMailer::TestCase::ClearTestDeliveries
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
initializer "action_mailer.set_autoload_paths" do |app|
|
63
|
+
options = app.config.action_mailer
|
64
|
+
|
65
|
+
if options.show_previews && options.preview_path
|
66
|
+
ActiveSupport::Dependencies.autoload_paths << options.preview_path
|
67
|
+
end
|
53
68
|
end
|
54
69
|
|
55
70
|
initializer "action_mailer.compile_config_methods" do
|
@@ -69,12 +84,8 @@ module ActionMailer
|
|
69
84
|
|
70
85
|
if options.show_previews
|
71
86
|
app.routes.prepend do
|
72
|
-
get "/rails/mailers"
|
73
|
-
get "/rails/mailers/*path"
|
74
|
-
end
|
75
|
-
|
76
|
-
if options.preview_path
|
77
|
-
ActiveSupport::Dependencies.autoload_paths << options.preview_path
|
87
|
+
get "/rails/mailers" => "rails/mailers#index", internal: true
|
88
|
+
get "/rails/mailers/*path" => "rails/mailers#preview", internal: true
|
78
89
|
end
|
79
90
|
end
|
80
91
|
end
|
@@ -28,13 +28,13 @@ module ActionMailer
|
|
28
28
|
#
|
29
29
|
# assert_emails 2 do
|
30
30
|
# ContactMailer.welcome.deliver_now
|
31
|
-
# ContactMailer.welcome.
|
31
|
+
# ContactMailer.welcome.deliver_later
|
32
32
|
# end
|
33
33
|
# end
|
34
|
-
def assert_emails(number)
|
34
|
+
def assert_emails(number, &block)
|
35
35
|
if block_given?
|
36
36
|
original_count = ActionMailer::Base.deliveries.size
|
37
|
-
|
37
|
+
perform_enqueued_jobs(only: ->(job) { delivery_job_filter(job) }, &block)
|
38
38
|
new_count = ActionMailer::Base.deliveries.size
|
39
39
|
assert_equal number, new_count - original_count, "#{number} emails expected, but #{new_count - original_count} were sent"
|
40
40
|
else
|
@@ -90,10 +90,23 @@ module ActionMailer
|
|
90
90
|
# end
|
91
91
|
# end
|
92
92
|
def assert_enqueued_emails(number, &block)
|
93
|
-
assert_enqueued_jobs
|
93
|
+
assert_enqueued_jobs(number, only: ->(job) { delivery_job_filter(job) }, &block)
|
94
94
|
end
|
95
95
|
|
96
|
-
# Asserts that
|
96
|
+
# Asserts that a specific email has been enqueued, optionally
|
97
|
+
# matching arguments.
|
98
|
+
#
|
99
|
+
# def test_email
|
100
|
+
# ContactMailer.welcome.deliver_later
|
101
|
+
# assert_enqueued_email_with ContactMailer, :welcome
|
102
|
+
# end
|
103
|
+
#
|
104
|
+
# def test_email_with_arguments
|
105
|
+
# ContactMailer.welcome("Hello", "Goodbye").deliver_later
|
106
|
+
# assert_enqueued_email_with ContactMailer, :welcome, args: ["Hello", "Goodbye"]
|
107
|
+
# end
|
108
|
+
#
|
109
|
+
# If a block is passed, that block should cause the specified email
|
97
110
|
# to be enqueued.
|
98
111
|
#
|
99
112
|
# def test_email_in_block
|
@@ -106,20 +119,17 @@ module ActionMailer
|
|
106
119
|
#
|
107
120
|
# def test_parameterized_email
|
108
121
|
# assert_enqueued_email_with ContactMailer, :welcome,
|
109
|
-
# args: {email: 'user@example.com} do
|
122
|
+
# args: {email: 'user@example.com'} do
|
110
123
|
# ContactMailer.with(email: 'user@example.com').welcome.deliver_later
|
111
124
|
# end
|
112
125
|
# end
|
113
126
|
def assert_enqueued_email_with(mailer, method, args: nil, queue: "mailers", &block)
|
114
|
-
if args.is_a?
|
115
|
-
|
116
|
-
args = [mailer.to_s, method.to_s, "deliver_now", args]
|
127
|
+
args = if args.is_a?(Hash)
|
128
|
+
[mailer.to_s, method.to_s, "deliver_now", params: args, args: []]
|
117
129
|
else
|
118
|
-
|
119
|
-
args = [mailer.to_s, method.to_s, "deliver_now", *args]
|
130
|
+
[mailer.to_s, method.to_s, "deliver_now", args: Array(args)]
|
120
131
|
end
|
121
|
-
|
122
|
-
assert_enqueued_with(job: job, args: args, queue: queue, &block)
|
132
|
+
assert_enqueued_with(job: mailer.delivery_job, args: args, queue: queue, &block)
|
123
133
|
end
|
124
134
|
|
125
135
|
# Asserts that no emails are enqueued for later delivery.
|
@@ -138,7 +148,16 @@ module ActionMailer
|
|
138
148
|
# end
|
139
149
|
# end
|
140
150
|
def assert_no_enqueued_emails(&block)
|
141
|
-
|
151
|
+
assert_enqueued_emails 0, &block
|
142
152
|
end
|
153
|
+
|
154
|
+
private
|
155
|
+
|
156
|
+
def delivery_job_filter(job)
|
157
|
+
job_class = job.is_a?(Hash) ? job.fetch(:job) : job.class
|
158
|
+
|
159
|
+
Base.descendants.map(&:delivery_job).include?(job_class) ||
|
160
|
+
ActionMailer::Parameterized::DeliveryJob == job_class
|
161
|
+
end
|
143
162
|
end
|
144
163
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: actionmailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -16,42 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 6.0.2.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 6.0.2.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: actionview
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 6.0.2.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 6.0.2.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activejob
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 6.0.2.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 6.0.2.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: mail
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,8 +86,8 @@ dependencies:
|
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: '2.0'
|
89
|
-
description: Email on Rails. Compose, deliver,
|
90
|
-
|
89
|
+
description: Email on Rails. Compose, deliver, and test emails using the familiar
|
90
|
+
controller/view pattern. First-class support for multipart email and attachments.
|
91
91
|
email: david@loudthinking.com
|
92
92
|
executables: []
|
93
93
|
extensions: []
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- lib/action_mailer/gem_version.rb
|
105
105
|
- lib/action_mailer/inline_preview_interceptor.rb
|
106
106
|
- lib/action_mailer/log_subscriber.rb
|
107
|
+
- lib/action_mailer/mail_delivery_job.rb
|
107
108
|
- lib/action_mailer/mail_helper.rb
|
108
109
|
- lib/action_mailer/message_delivery.rb
|
109
110
|
- lib/action_mailer/parameterized.rb
|
@@ -117,12 +118,15 @@ files:
|
|
117
118
|
- lib/rails/generators/mailer/mailer_generator.rb
|
118
119
|
- lib/rails/generators/mailer/templates/application_mailer.rb.tt
|
119
120
|
- lib/rails/generators/mailer/templates/mailer.rb.tt
|
120
|
-
homepage:
|
121
|
+
homepage: https://rubyonrails.org
|
121
122
|
licenses:
|
122
123
|
- MIT
|
123
124
|
metadata:
|
124
|
-
|
125
|
-
changelog_uri: https://github.com/rails/rails/blob/
|
125
|
+
bug_tracker_uri: https://github.com/rails/rails/issues
|
126
|
+
changelog_uri: https://github.com/rails/rails/blob/v6.0.2.2/actionmailer/CHANGELOG.md
|
127
|
+
documentation_uri: https://api.rubyonrails.org/v6.0.2.2/
|
128
|
+
mailing_list_uri: https://groups.google.com/forum/#!forum/rubyonrails-talk
|
129
|
+
source_code_uri: https://github.com/rails/rails/tree/v6.0.2.2/actionmailer
|
126
130
|
post_install_message:
|
127
131
|
rdoc_options: []
|
128
132
|
require_paths:
|
@@ -131,7 +135,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
131
135
|
requirements:
|
132
136
|
- - ">="
|
133
137
|
- !ruby/object:Gem::Version
|
134
|
-
version: 2.
|
138
|
+
version: 2.5.0
|
135
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
140
|
requirements:
|
137
141
|
- - ">="
|
@@ -139,8 +143,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
143
|
version: '0'
|
140
144
|
requirements:
|
141
145
|
- none
|
142
|
-
rubygems_version: 3.
|
146
|
+
rubygems_version: 3.0.3
|
143
147
|
signing_key:
|
144
148
|
specification_version: 4
|
145
|
-
summary: Email composition
|
149
|
+
summary: Email composition and delivery framework (part of Rails).
|
146
150
|
test_files: []
|