actionmailer 5.2.2.1 → 6.0.2
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 +4 -4
- data/CHANGELOG.md +81 -22
- 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 +3 -3
- 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: 3a7510ac409434e1e34960be71a6fc54b764fe3d7acff0d12a93632f59256836
|
4
|
+
data.tar.gz: 3c047715d017c6d63bf448009ec3ed7e4771aaf642811ecfc7392b33ac838e70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b46e3d8c9f81f37f7c07a023d3868b87e3e009f056aa4a425e01659532b07d81095d02be86ea9f0d0506691a4df396311ac6f6b0356f061415155aa217dffe21
|
7
|
+
data.tar.gz: 44180012ac5d206b84b5b10ade8224809f236c735983ccabea886e463ba46626b46fe834f94a0e31c95f2967ab16ec1fd43dce0224ab1373c1fee2e5923f3306
|
data/CHANGELOG.md
CHANGED
@@ -1,49 +1,108 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 6.0.2 (December 13, 2019) ##
|
2
|
+
|
3
|
+
* Fix ActionMailer assertions don't work for parameterized mail with legacy delivery job.
|
4
|
+
|
5
|
+
*bogdanvlviv*
|
6
|
+
|
7
|
+
|
8
|
+
## Rails 6.0.1 (November 5, 2019) ##
|
2
9
|
|
3
10
|
* No changes.
|
4
11
|
|
5
12
|
|
6
|
-
## Rails
|
13
|
+
## Rails 6.0.0 (August 16, 2019) ##
|
7
14
|
|
8
15
|
* No changes.
|
9
16
|
|
10
17
|
|
11
|
-
## Rails
|
18
|
+
## Rails 6.0.0.rc2 (July 22, 2019) ##
|
12
19
|
|
13
20
|
* No changes.
|
14
21
|
|
15
22
|
|
16
|
-
## Rails
|
23
|
+
## Rails 6.0.0.rc1 (April 24, 2019) ##
|
17
24
|
|
18
|
-
*
|
25
|
+
* No changes.
|
19
26
|
|
20
|
-
*Samuel Cochran*
|
21
27
|
|
28
|
+
## Rails 6.0.0.beta3 (March 11, 2019) ##
|
29
|
+
|
30
|
+
* No changes.
|
31
|
+
|
32
|
+
|
33
|
+
## Rails 6.0.0.beta2 (February 25, 2019) ##
|
34
|
+
|
35
|
+
* No changes.
|
36
|
+
|
37
|
+
|
38
|
+
## Rails 6.0.0.beta1 (January 18, 2019) ##
|
39
|
+
|
40
|
+
* Deprecate `ActionMailer::Base.receive` in favor of [Action Mailbox](https://github.com/rails/rails/tree/master/actionmailbox).
|
41
|
+
|
42
|
+
*George Claghorn*
|
22
43
|
|
23
|
-
|
44
|
+
* Add `MailDeliveryJob` for delivering both regular and parameterized mail. Deprecate using `DeliveryJob` and `Parameterized::DeliveryJob`.
|
24
45
|
|
25
|
-
*
|
26
|
-
since it was supported in Rails 5.0 but not deprecated.
|
46
|
+
*Gannon McGibbon*
|
27
47
|
|
28
|
-
|
48
|
+
* Fix ActionMailer assertions not working when a Mail defines
|
49
|
+
a custom delivery job class
|
29
50
|
|
30
|
-
*
|
51
|
+
*Edouard Chin*
|
52
|
+
|
53
|
+
* Mails with multipart `format` blocks with implicit render now also check for
|
54
|
+
a template name in options hash instead of only using the action name.
|
55
|
+
|
56
|
+
*Marcus Ilgner*
|
57
|
+
|
58
|
+
* `ActionDispatch::IntegrationTest` includes `ActionMailer::TestHelper` module by default.
|
59
|
+
|
60
|
+
*Ricardo Díaz*
|
61
|
+
|
62
|
+
* Add `perform_deliveries` to a payload of `deliver.action_mailer` notification.
|
63
|
+
|
64
|
+
*Yoshiyuki Kinjo*
|
65
|
+
|
66
|
+
* Change delivery logging message when `perform_deliveries` is false.
|
67
|
+
|
68
|
+
*Yoshiyuki Kinjo*
|
69
|
+
|
70
|
+
* Allow call `assert_enqueued_email_with` with no block.
|
71
|
+
|
72
|
+
Example:
|
73
|
+
```
|
74
|
+
def test_email
|
75
|
+
ContactMailer.welcome.deliver_later
|
76
|
+
assert_enqueued_email_with ContactMailer, :welcome
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_email_with_arguments
|
80
|
+
ContactMailer.welcome("Hello", "Goodbye").deliver_later
|
81
|
+
assert_enqueued_email_with ContactMailer, :welcome, args: ["Hello", "Goodbye"]
|
82
|
+
end
|
83
|
+
```
|
84
|
+
|
85
|
+
*bogdanvlviv*
|
86
|
+
|
87
|
+
* Ensure mail gem is eager autoloaded when eager load is true to prevent thread deadlocks.
|
88
|
+
|
89
|
+
*Samuel Cochran*
|
31
90
|
|
32
|
-
|
33
|
-
ContactMailer.welcome.deliver_later
|
34
|
-
end
|
91
|
+
* Perform email jobs in `assert_emails`.
|
35
92
|
|
36
|
-
*
|
93
|
+
*Gannon McGibbon*
|
37
94
|
|
38
|
-
*
|
95
|
+
* Add `Base.unregister_observer`, `Base.unregister_observers`,
|
96
|
+
`Base.unregister_interceptor`, `Base.unregister_interceptors`,
|
97
|
+
`Base.unregister_preview_interceptor` and `Base.unregister_preview_interceptors`.
|
98
|
+
This makes it possible to dynamically add and remove email observers and
|
99
|
+
interceptors at runtime in the same way they're registered.
|
39
100
|
|
40
|
-
|
41
|
-
self.delivery_job = MyCustomDeliveryJob
|
101
|
+
*Claudio Ortolina*, *Kota Miyake*
|
42
102
|
|
43
|
-
|
44
|
-
end
|
103
|
+
* Rails 6 requires Ruby 2.5.0 or newer.
|
45
104
|
|
46
|
-
*
|
105
|
+
*Jeremy Daer*, *Kasper Timm Hansen*
|
47
106
|
|
48
107
|
|
49
|
-
Please check [5-
|
108
|
+
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
|
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: 2019-
|
11
|
+
date: 2019-12-13 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
|
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
|
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
|
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
|
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
|
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
|
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/actionmailer/CHANGELOG.md
|
127
|
+
documentation_uri: https://api.rubyonrails.org/v6.0.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/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.0.
|
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: []
|