actionmailer 5.2.8.1 → 6.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb2612d830b5e47ea48fd3e0c5e6bc85f533c2de368ca92ef941d9f767557fcc
4
- data.tar.gz: 2a7780bde926becc75a2d21a3f78f9abe7215adceba89f6919347e8a3249ef90
3
+ metadata.gz: fe6f6cbc34bc7f86f69dfa5dfc71f59aa29683c80a50de2df742cc32ab56f874
4
+ data.tar.gz: 8ad68f46ec8fb91e8965228a592f99a1b95b2f6af13302ac6fa12534ce185cae
5
5
  SHA512:
6
- metadata.gz: a35f07cee1ddd4c3679675a409d5fc552bd3c5f599f07f345f20552efd3427b65b15caef4fc94782ec622b1f1869d43e7aa2014b3dd5729bddf7c1c89c7361a1
7
- data.tar.gz: 814ea048acb38b2acdedf30901e5b4701305265d6ba1f2f4a81d1b119739465151a3dea0ac3d39293eabd288bda3e8c7ceb1c748b3fda3aad7108ec93aefac43
6
+ metadata.gz: 7fa6e8431a41a9fcf48c6a176d854bf8ffa83a18e9d050098417382fcc35bde9d4f7f7098423b9b784f00c00b6beafc50588fa7d900710bb0ead0249ff2c9e17
7
+ data.tar.gz: 7c06b4dcaadaf47f69c245c0b897d32a3af564552ae7a65a1576bd709945f67f0a3434b3ed77cd057d3e0f8e5ee03ca538d3aff33acf5c063b4931a5d09bdb34
data/CHANGELOG.md CHANGED
@@ -1,134 +1,218 @@
1
- ## Rails 5.2.8.1 (July 12, 2022) ##
1
+ ## Rails 6.0.6 (September 09, 2022) ##
2
2
 
3
3
  * No changes.
4
4
 
5
5
 
6
- ## Rails 5.2.8 (May 09, 2022) ##
6
+ ## Rails 6.0.5.1 (July 12, 2022) ##
7
7
 
8
8
  * No changes.
9
9
 
10
10
 
11
- ## Rails 5.2.7.1 (April 26, 2022) ##
11
+ ## Rails 6.0.5 (May 09, 2022) ##
12
12
 
13
13
  * No changes.
14
14
 
15
15
 
16
- ## Rails 5.2.7 (March 10, 2022) ##
16
+ ## Rails 6.0.4.8 (April 26, 2022) ##
17
17
 
18
18
  * No changes.
19
19
 
20
20
 
21
- ## Rails 5.2.6.3 (March 08, 2022) ##
21
+ ## Rails 6.0.4.7 (March 08, 2022) ##
22
22
 
23
23
  * No changes.
24
24
 
25
25
 
26
- ## Rails 5.2.6.2 (February 11, 2022) ##
26
+ ## Rails 6.0.4.6 (February 11, 2022) ##
27
27
 
28
28
  * No changes.
29
29
 
30
30
 
31
- ## Rails 5.2.6.1 (February 11, 2022) ##
31
+ ## Rails 6.0.4.5 (February 11, 2022) ##
32
32
 
33
33
  * No changes.
34
34
 
35
35
 
36
- ## Rails 5.2.6 (May 05, 2021) ##
36
+ ## Rails 6.0.4.4 (December 15, 2021) ##
37
37
 
38
38
  * No changes.
39
39
 
40
40
 
41
- ## Rails 5.2.5 (March 26, 2021) ##
41
+ ## Rails 6.0.4.3 (December 14, 2021) ##
42
42
 
43
43
  * No changes.
44
44
 
45
45
 
46
- ## Rails 5.2.4.6 (May 05, 2021) ##
46
+ ## Rails 6.0.4.2 (December 14, 2021) ##
47
47
 
48
48
  * No changes.
49
49
 
50
50
 
51
- ## Rails 5.2.4.5 (February 10, 2021) ##
51
+ ## Rails 6.0.4.1 (August 19, 2021) ##
52
52
 
53
53
  * No changes.
54
54
 
55
55
 
56
- ## Rails 5.2.4.4 (September 09, 2020) ##
56
+ ## Rails 6.0.4 (June 15, 2021) ##
57
57
 
58
58
  * No changes.
59
59
 
60
60
 
61
- ## Rails 5.2.4.3 (May 18, 2020) ##
61
+ ## Rails 6.0.3.7 (May 05, 2021) ##
62
62
 
63
63
  * No changes.
64
64
 
65
65
 
66
- ## Rails 5.2.4.2 (March 19, 2020) ##
66
+ ## Rails 6.0.3.6 (March 26, 2021) ##
67
67
 
68
68
  * No changes.
69
69
 
70
70
 
71
- ## Rails 5.2.4.1 (December 18, 2019) ##
71
+ ## Rails 6.0.3.5 (February 10, 2021) ##
72
72
 
73
73
  * No changes.
74
74
 
75
75
 
76
- ## Rails 5.2.4 (November 27, 2019) ##
76
+ ## Rails 6.0.3.4 (October 07, 2020) ##
77
77
 
78
78
  * No changes.
79
79
 
80
80
 
81
- ## Rails 5.2.3 (March 27, 2019) ##
81
+ ## Rails 6.0.3.3 (September 09, 2020) ##
82
82
 
83
83
  * No changes.
84
84
 
85
85
 
86
- ## Rails 5.2.2.1 (March 11, 2019) ##
86
+ ## Rails 6.0.3.2 (June 17, 2020) ##
87
87
 
88
88
  * No changes.
89
89
 
90
90
 
91
- ## Rails 5.2.2 (December 04, 2018) ##
91
+ ## Rails 6.0.3.1 (May 18, 2020) ##
92
92
 
93
93
  * No changes.
94
94
 
95
95
 
96
- ## Rails 5.2.1.1 (November 27, 2018) ##
96
+ ## Rails 6.0.3 (May 06, 2020) ##
97
97
 
98
98
  * No changes.
99
99
 
100
100
 
101
- ## Rails 5.2.1 (August 07, 2018) ##
101
+ ## Rails 6.0.2.2 (March 19, 2020) ##
102
102
 
103
- * Ensure mail gem is eager autoloaded when eager load is true to prevent thread deadlocks.
103
+ * No changes.
104
104
 
105
- *Samuel Cochran*
105
+
106
+ ## Rails 6.0.2.1 (December 18, 2019) ##
107
+
108
+ * No changes.
109
+
110
+
111
+ ## Rails 6.0.2 (December 13, 2019) ##
112
+
113
+ * Fix ActionMailer assertions don't work for parameterized mail with legacy delivery job.
114
+
115
+ *bogdanvlviv*
116
+
117
+
118
+ ## Rails 6.0.1 (November 5, 2019) ##
119
+
120
+ * No changes.
106
121
 
107
122
 
108
- ## Rails 5.2.0 (April 09, 2018) ##
123
+ ## Rails 6.0.0 (August 16, 2019) ##
109
124
 
110
- * Bring back proc with arity of 1 in `ActionMailer::Base.default` proc
111
- since it was supported in Rails 5.0 but not deprecated.
125
+ * No changes.
126
+
127
+
128
+ ## Rails 6.0.0.rc2 (July 22, 2019) ##
129
+
130
+ * No changes.
131
+
132
+
133
+ ## Rails 6.0.0.rc1 (April 24, 2019) ##
134
+
135
+ * No changes.
136
+
137
+
138
+ ## Rails 6.0.0.beta3 (March 11, 2019) ##
139
+
140
+ * No changes.
112
141
 
113
- *Jimmy Bourassa*
114
142
 
115
- * Add `assert_enqueued_email_with` test helper.
143
+ ## Rails 6.0.0.beta2 (February 25, 2019) ##
144
+
145
+ * No changes.
146
+
147
+
148
+ ## Rails 6.0.0.beta1 (January 18, 2019) ##
149
+
150
+ * Deprecate `ActionMailer::Base.receive` in favor of [Action Mailbox](https://github.com/rails/rails/tree/master/actionmailbox).
151
+
152
+ *George Claghorn*
153
+
154
+ * Add `MailDeliveryJob` for delivering both regular and parameterized mail. Deprecate using `DeliveryJob` and `Parameterized::DeliveryJob`.
155
+
156
+ *Gannon McGibbon*
157
+
158
+ * Fix ActionMailer assertions not working when a Mail defines
159
+ a custom delivery job class
160
+
161
+ *Edouard Chin*
162
+
163
+ * Mails with multipart `format` blocks with implicit render now also check for
164
+ a template name in options hash instead of only using the action name.
165
+
166
+ *Marcus Ilgner*
167
+
168
+ * `ActionDispatch::IntegrationTest` includes `ActionMailer::TestHelper` module by default.
169
+
170
+ *Ricardo Díaz*
171
+
172
+ * Add `perform_deliveries` to a payload of `deliver.action_mailer` notification.
173
+
174
+ *Yoshiyuki Kinjo*
175
+
176
+ * Change delivery logging message when `perform_deliveries` is false.
177
+
178
+ *Yoshiyuki Kinjo*
179
+
180
+ * Allow call `assert_enqueued_email_with` with no block.
181
+
182
+ Example:
183
+ ```
184
+ def test_email
185
+ ContactMailer.welcome.deliver_later
186
+ assert_enqueued_email_with ContactMailer, :welcome
187
+ end
188
+
189
+ def test_email_with_arguments
190
+ ContactMailer.welcome("Hello", "Goodbye").deliver_later
191
+ assert_enqueued_email_with ContactMailer, :welcome, args: ["Hello", "Goodbye"]
192
+ end
193
+ ```
194
+
195
+ *bogdanvlviv*
196
+
197
+ * Ensure mail gem is eager autoloaded when eager load is true to prevent thread deadlocks.
198
+
199
+ *Samuel Cochran*
116
200
 
117
- assert_enqueued_email_with ContactMailer, :welcome do
118
- ContactMailer.welcome.deliver_later
119
- end
201
+ * Perform email jobs in `assert_emails`.
120
202
 
121
- *Mikkel Malmberg*
203
+ *Gannon McGibbon*
122
204
 
123
- * Allow Action Mailer classes to configure their delivery job.
205
+ * Add `Base.unregister_observer`, `Base.unregister_observers`,
206
+ `Base.unregister_interceptor`, `Base.unregister_interceptors`,
207
+ `Base.unregister_preview_interceptor` and `Base.unregister_preview_interceptors`.
208
+ This makes it possible to dynamically add and remove email observers and
209
+ interceptors at runtime in the same way they're registered.
124
210
 
125
- class MyMailer < ApplicationMailer
126
- self.delivery_job = MyCustomDeliveryJob
211
+ *Claudio Ortolina*, *Kota Miyake*
127
212
 
128
- ...
129
- end
213
+ * Rails 6 requires Ruby 2.5.0 or newer.
130
214
 
131
- *Matthew Mongeau*
215
+ *Jeremy Daer*, *Kasper Timm Hansen*
132
216
 
133
217
 
134
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/actionmailer/CHANGELOG.md) for previous changes.
218
+ Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/actionmailer/CHANGELOG.md) for previous changes.
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2004-2018 David Heinemeier Hansson
1
+ Copyright (c) 2004-2019 David Heinemeier Hansson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
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/5-2-stable/actionmailer
119
+ * https://github.com/rails/rails/tree/main/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
- * http://api.rubyonrails.org
133
+ * https://api.rubyonrails.org
168
134
 
169
135
  Bug reports for the Ruby on Rails project can be filed here:
170
136
 
@@ -172,4 +138,4 @@ Bug reports for the Ruby on Rails project can be filed here:
172
138
 
173
139
  Feature requests should be discussed on the rails-core mailing list here:
174
140
 
175
- * https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core
141
+ * https://discuss.rubyonrails.org/c/rubyonrails-core
@@ -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
- # <tt>:ssl/:tls</tt> Enables the SMTP connection to use SMTP/TLS (SMTPS: SMTP over direct TLS connection)
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)
@@ -562,17 +591,17 @@ module ActionMailer
562
591
  end
563
592
 
564
593
  private
565
-
566
594
  def set_payload_for_mail(payload, mail)
567
- payload[:mailer] = name
568
- payload[:message_id] = mail.message_id
569
- payload[:subject] = mail.subject
570
- payload[:to] = mail.to
571
- payload[:from] = mail.from
572
- payload[:bcc] = mail.bcc if mail.bcc.present?
573
- payload[:cc] = mail.cc if mail.cc.present?
574
- payload[:date] = mail.date
575
- payload[:mail] = mail.encoded
595
+ payload[:mail] = mail.encoded
596
+ payload[:mailer] = name
597
+ payload[:message_id] = mail.message_id
598
+ payload[:subject] = mail.subject
599
+ payload[:to] = mail.to
600
+ payload[:from] = mail.from
601
+ payload[:bcc] = mail.bcc if mail.bcc.present?
602
+ payload[:cc] = mail.cc if mail.cc.present?
603
+ payload[:date] = mail.date
604
+ payload[:perform_deliveries] = mail.perform_deliveries
576
605
  end
577
606
 
578
607
  def method_missing(method_name, *args)
@@ -582,6 +611,7 @@ module ActionMailer
582
611
  super
583
612
  end
584
613
  end
614
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
585
615
 
586
616
  def respond_to_missing?(method, include_all = false)
587
617
  action_methods.include?(method.to_s) || super
@@ -843,7 +873,6 @@ module ActionMailer
843
873
  end
844
874
 
845
875
  private
846
-
847
876
  # Used by #mail to set the content type of the message.
848
877
  #
849
878
  # It will use the given +user_content_type+, or multipart if the mail
@@ -877,7 +906,7 @@ module ActionMailer
877
906
  # If the subject has interpolations, you can pass them through the +interpolations+ parameter.
878
907
  def default_i18n_subject(interpolations = {}) # :doc:
879
908
  mailer_scope = self.class.mailer_name.tr("/", ".")
880
- I18n.t(:subject, interpolations.merge(scope: [mailer_scope, action_name], default: action_name.humanize))
909
+ I18n.t(:subject, **interpolations.merge(scope: [mailer_scope, action_name], default: action_name.humanize))
881
910
  end
882
911
 
883
912
  # Emails do not support relative path links.
@@ -914,11 +943,9 @@ module ActionMailer
914
943
  assignable.each { |k, v| message[k] = v }
915
944
  end
916
945
 
917
- def collect_responses(headers)
946
+ def collect_responses(headers, &block)
918
947
  if block_given?
919
- collector = ActionMailer::Collector.new(lookup_context) { render(action_name) }
920
- yield(collector)
921
- collector.responses
948
+ collect_responses_from_block(headers, &block)
922
949
  elsif headers[:body]
923
950
  collect_responses_from_text(headers)
924
951
  else
@@ -926,6 +953,13 @@ module ActionMailer
926
953
  end
927
954
  end
928
955
 
956
+ def collect_responses_from_block(headers)
957
+ templates_name = headers[:template_name] || action_name
958
+ collector = ActionMailer::Collector.new(lookup_context) { render(templates_name) }
959
+ yield(collector)
960
+ collector.responses
961
+ end
962
+
929
963
  def collect_responses_from_text(headers)
930
964
  [{
931
965
  body: headers.delete(:body),
@@ -938,10 +972,10 @@ module ActionMailer
938
972
  templates_name = headers[:template_name] || action_name
939
973
 
940
974
  each_template(Array(templates_path), templates_name).map do |template|
941
- self.formats = template.formats
975
+ format = template.format || self.formats.first
942
976
  {
943
- body: render(template: template),
944
- content_type: template.type.to_s
977
+ body: render(template: template, formats: [format]),
978
+ content_type: Mime[format].to_s
945
979
  }
946
980
  end
947
981
  end
@@ -951,7 +985,7 @@ module ActionMailer
951
985
  if templates.empty?
952
986
  raise ActionView::MissingTemplate.new(paths, name, paths, false, "mailer")
953
987
  else
954
- templates.uniq(&:formats).each(&block)
988
+ templates.uniq(&:format).each(&block)
955
989
  end
956
990
  end
957
991
 
@@ -983,7 +1017,7 @@ module ActionMailer
983
1017
  end
984
1018
 
985
1019
  def instrument_name
986
- "action_mailer".freeze
1020
+ "action_mailer"
987
1021
  end
988
1022
 
989
1023
  ActiveSupport.run_load_hooks(:action_mailer, self)
@@ -12,9 +12,18 @@ 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
26
+ ruby2_keywords(:perform) if respond_to?(:ruby2_keywords, true)
18
27
 
19
28
  private
20
29
  # "Deserialize" the mailer class name by hand in case another argument
@@ -7,10 +7,10 @@ module ActionMailer
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 5
11
- MINOR = 2
12
- TINY = 8
13
- PRE = "1"
10
+ MAJOR = 6
11
+ MINOR = 0
12
+ TINY = 6
13
+ PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -40,9 +40,7 @@ module ActionMailer
40
40
  end
41
41
 
42
42
  private
43
- def message
44
- @message
45
- end
43
+ attr_reader :message
46
44
 
47
45
  def html_part
48
46
  @html_part ||= message.html_part
@@ -9,8 +9,12 @@ module ActionMailer
9
9
  # An email was delivered.
10
10
  def deliver(event)
11
11
  info do
12
- recipients = Array(event.payload[:to]).join(", ")
13
- "Sent mail to #{recipients} (#{event.duration.round(1)}ms)"
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,43 @@
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:, kwargs: nil, params: nil)
17
+ mailer_class = params ? mailer.constantize.with(params) : mailer.constantize
18
+ message = if kwargs
19
+ mailer_class.public_send(mail_method, *args, **kwargs)
20
+ else
21
+ mailer_class.public_send(mail_method, *args)
22
+ end
23
+ message.send(delivery_method)
24
+ end
25
+
26
+ private
27
+ # "Deserialize" the mailer class name by hand in case another argument
28
+ # (like a Global ID reference) raised DeserializationError.
29
+ def mailer_class
30
+ if mailer = Array(@serialized_arguments).first || Array(arguments).first
31
+ mailer.constantize
32
+ end
33
+ end
34
+
35
+ def handle_exception_with_mailer_class(exception)
36
+ if klass = mailer_class
37
+ klass.handle_exception exception
38
+ else
39
+ raise exception
40
+ end
41
+ end
42
+ end
43
+ end
@@ -23,13 +23,14 @@ module ActionMailer
23
23
  @processed_mailer = nil
24
24
  @mail_message = nil
25
25
  end
26
+ ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
26
27
 
27
28
  # Method calls are delegated to the Mail::Message that's ready to deliver.
28
29
  def __getobj__ #:nodoc:
29
30
  @mail_message ||= processed_mailer.message
30
31
  end
31
32
 
32
- # Unused except for delegator internals (dup, marshaling).
33
+ # Unused except for delegator internals (dup, marshalling).
33
34
  def __setobj__(mail_message) #:nodoc:
34
35
  @mail_message = mail_message
35
36
  end
@@ -135,9 +136,15 @@ module ActionMailer
135
136
  "#deliver_later, 2. only touch the message *within your mailer " \
136
137
  "method*, or 3. use a custom Active Job instead of #deliver_later."
137
138
  else
138
- args = @mailer_class.name, @action.to_s, delivery_method.to_s, *@args
139
139
  job = @mailer_class.delivery_job
140
- job.set(options).perform_later(*args)
140
+
141
+ if job <= MailDeliveryJob
142
+ job.set(options).perform_later(
143
+ @mailer_class.name, @action.to_s, delivery_method.to_s, args: @args)
144
+ else
145
+ job.set(options).perform_later(
146
+ @mailer_class.name, @action.to_s, delivery_method.to_s, *@args)
147
+ end
141
148
  end
142
149
  end
143
150
  end
@@ -115,17 +115,26 @@ module ActionMailer
115
115
  super
116
116
  end
117
117
  end
118
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
118
119
 
119
120
  def respond_to_missing?(method, include_all = false)
120
121
  @mailer.respond_to?(method, include_all)
121
122
  end
122
123
  end
123
124
 
125
+ class DeliveryJob < ActionMailer::DeliveryJob # :nodoc:
126
+ def perform(mailer, mail_method, delivery_method, params, *args)
127
+ mailer.constantize.with(params).public_send(mail_method, *args).send(delivery_method)
128
+ end
129
+ ruby2_keywords(:perform) if respond_to?(:ruby2_keywords, true)
130
+ end
131
+
124
132
  class MessageDelivery < ActionMailer::MessageDelivery # :nodoc:
125
133
  def initialize(mailer_class, action, params, *args)
126
134
  super(mailer_class, action, *args)
127
135
  @params = params
128
136
  end
137
+ ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
129
138
 
130
139
  private
131
140
  def processed_mailer
@@ -139,16 +148,25 @@ module ActionMailer
139
148
  if processed?
140
149
  super
141
150
  else
142
- args = @mailer_class.name, @action.to_s, delivery_method.to_s, @params, *@args
143
- ActionMailer::Parameterized::DeliveryJob.set(options).perform_later(*args)
151
+ job = delivery_job_class
152
+
153
+ if job <= MailDeliveryJob
154
+ job.set(options).perform_later(
155
+ @mailer_class.name, @action.to_s, delivery_method.to_s, params: @params, args: @args)
156
+ else
157
+ job.set(options).perform_later(
158
+ @mailer_class.name, @action.to_s, delivery_method.to_s, @params, *@args)
159
+ end
144
160
  end
145
161
  end
146
- end
147
162
 
148
- class DeliveryJob < ActionMailer::DeliveryJob # :nodoc:
149
- def perform(mailer, mail_method, delivery_method, params, *args)
150
- mailer.constantize.with(params).public_send(mail_method, *args).send(delivery_method)
151
- end
163
+ def delivery_job_class
164
+ if @mailer_class.delivery_job <= MailDeliveryJob
165
+ @mailer_class.delivery_job
166
+ else
167
+ Parameterized::DeliveryJob
168
+ end
169
+ end
152
170
  end
153
171
  end
154
172
  end
@@ -31,22 +31,38 @@ 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
+ def interceptor_class_for(interceptor)
39
59
  case interceptor
40
60
  when String, Symbol
41
61
  interceptor.to_s.camelize.constantize
42
62
  else
43
63
  interceptor
44
64
  end
45
-
46
- unless preview_interceptors.include?(preview_interceptor)
47
- preview_interceptors << preview_interceptor
48
65
  end
49
- end
50
66
  end
51
67
  end
52
68
 
@@ -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) { include ActionMailer::TestCase::ClearTestDeliveries }
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" => "rails/mailers#index", internal: true
73
- get "/rails/mailers/*path" => "rails/mailers#preview", internal: true
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
@@ -22,7 +22,6 @@ module ActionMailer
22
22
  end
23
23
 
24
24
  private
25
-
26
25
  def clear_test_deliveries
27
26
  if ActionMailer::Base.delivery_method == :test
28
27
  ActionMailer::Base.deliveries.clear
@@ -76,7 +75,6 @@ module ActionMailer
76
75
  end
77
76
 
78
77
  private
79
-
80
78
  def initialize_test_deliveries
81
79
  set_delivery_method :test
82
80
  @old_perform_deliveries = ActionMailer::Base.perform_deliveries
@@ -28,13 +28,13 @@ module ActionMailer
28
28
  #
29
29
  # assert_emails 2 do
30
30
  # ContactMailer.welcome.deliver_now
31
- # ContactMailer.welcome.deliver_now
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
- yield
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 number, only: [ ActionMailer::DeliveryJob, ActionMailer::Parameterized::DeliveryJob ], &block
93
+ assert_enqueued_jobs(number, only: ->(job) { delivery_job_filter(job) }, &block)
94
94
  end
95
95
 
96
- # Asserts that block should cause the specified email
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? Hash
115
- job = ActionMailer::Parameterized::DeliveryJob
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
- job = ActionMailer::DeliveryJob
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,15 @@ module ActionMailer
138
148
  # end
139
149
  # end
140
150
  def assert_no_enqueued_emails(&block)
141
- assert_no_enqueued_jobs only: [ ActionMailer::DeliveryJob, ActionMailer::Parameterized::DeliveryJob ], &block
151
+ assert_enqueued_emails 0, &block
142
152
  end
153
+
154
+ private
155
+ def delivery_job_filter(job)
156
+ job_class = job.is_a?(Hash) ? job.fetch(:job) : job.class
157
+
158
+ Base.descendants.map(&:delivery_job).include?(job_class) ||
159
+ ActionMailer::Parameterized::DeliveryJob == job_class
160
+ end
143
161
  end
144
162
  end
data/lib/action_mailer.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2004-2018 David Heinemeier Hansson
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
@@ -23,7 +23,7 @@ module Rails
23
23
 
24
24
  private
25
25
  def file_name # :doc:
26
- @_file_name ||= super.gsub(/_mailer/i, "")
26
+ @_file_name ||= super.sub(/_mailer\z/i, "")
27
27
  end
28
28
 
29
29
  def application_mailer_file_name
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: 5.2.8.1
4
+ version: 6.0.6
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: 2022-07-12 00:00:00.000000000 Z
11
+ date: 2022-09-09 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: 5.2.8.1
19
+ version: 6.0.6
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: 5.2.8.1
26
+ version: 6.0.6
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: 5.2.8.1
33
+ version: 6.0.6
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: 5.2.8.1
40
+ version: 6.0.6
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: 5.2.8.1
47
+ version: 6.0.6
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: 5.2.8.1
54
+ version: 6.0.6
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, receive, and test emails using the
90
- familiar controller/view pattern. First-class support for multipart email and attachments.
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,16 @@ 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: http://rubyonrails.org
121
+ homepage: https://rubyonrails.org
121
122
  licenses:
122
123
  - MIT
123
124
  metadata:
124
- source_code_uri: https://github.com/rails/rails/tree/v5.2.8.1/actionmailer
125
- changelog_uri: https://github.com/rails/rails/blob/v5.2.8.1/actionmailer/CHANGELOG.md
125
+ bug_tracker_uri: https://github.com/rails/rails/issues
126
+ changelog_uri: https://github.com/rails/rails/blob/v6.0.6/actionmailer/CHANGELOG.md
127
+ documentation_uri: https://api.rubyonrails.org/v6.0.6/
128
+ mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
129
+ source_code_uri: https://github.com/rails/rails/tree/v6.0.6/actionmailer
130
+ rubygems_mfa_required: 'true'
126
131
  post_install_message:
127
132
  rdoc_options: []
128
133
  require_paths:
@@ -131,7 +136,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
131
136
  requirements:
132
137
  - - ">="
133
138
  - !ruby/object:Gem::Version
134
- version: 2.2.2
139
+ version: 2.5.0
135
140
  required_rubygems_version: !ruby/object:Gem::Requirement
136
141
  requirements:
137
142
  - - ">="
@@ -142,5 +147,5 @@ requirements:
142
147
  rubygems_version: 3.3.3
143
148
  signing_key:
144
149
  specification_version: 4
145
- summary: Email composition, delivery, and receiving framework (part of Rails).
150
+ summary: Email composition and delivery framework (part of Rails).
146
151
  test_files: []