aboutsummaryrefslogtreecommitdiffstats
path: root/actionmailer/lib/action_mailer
diff options
context:
space:
mode:
Diffstat (limited to 'actionmailer/lib/action_mailer')
-rw-r--r--actionmailer/lib/action_mailer/base.rb4
-rw-r--r--actionmailer/lib/action_mailer/queued_message.rb30
2 files changed, 23 insertions, 11 deletions
diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb
index 26787c9b5e..a96cbd7871 100644
--- a/actionmailer/lib/action_mailer/base.rb
+++ b/actionmailer/lib/action_mailer/base.rb
@@ -4,6 +4,7 @@ require 'action_mailer/collector'
require 'active_support/core_ext/string/inflections'
require 'active_support/core_ext/hash/except'
require 'active_support/core_ext/module/anonymous'
+require 'active_support/queueing'
require 'action_mailer/log_subscriber'
module ActionMailer #:nodoc:
@@ -380,7 +381,7 @@ module ActionMailer #:nodoc:
self.protected_instance_variables = [:@_action_has_layout]
- helper ActionMailer::MailHelper
+ helper ActionMailer::MailHelper
private_class_method :new #:nodoc:
@@ -393,6 +394,7 @@ module ActionMailer #:nodoc:
}.freeze
class_attribute :queue
+ self.queue = ActiveSupport::SynchronousQueue.new
class << self
# Register one or more Observers which will be notified when mail is delivered.
diff --git a/actionmailer/lib/action_mailer/queued_message.rb b/actionmailer/lib/action_mailer/queued_message.rb
index e5868ab43b..8d200617c4 100644
--- a/actionmailer/lib/action_mailer/queued_message.rb
+++ b/actionmailer/lib/action_mailer/queued_message.rb
@@ -5,23 +5,33 @@ module ActionMailer
attr_reader :queue
def initialize(queue, mailer_class, method_name, *args)
- @queue = queue
- @mailer_class = mailer_class
- @method_name = method_name
- @args = args
+ @queue = queue
+ @job = DeliveryJob.new(mailer_class, method_name, args)
end
def __getobj__
- @actual_message ||= @mailer_class.send(:new, @method_name, *@args).message
+ @job.message
end
- def run
- __getobj__.deliver
+ # Queues the message for delivery.
+ def deliver
+ tap { @queue.push @job }
end
- # Will push the message onto the Queue to be processed
- def deliver
- @queue << self
+ class DeliveryJob
+ def initialize(mailer_class, method_name, args)
+ @mailer_class = mailer_class
+ @method_name = method_name
+ @args = args
+ end
+
+ def message
+ @message ||= @mailer_class.send(:new, @method_name, *@args).message
+ end
+
+ def run
+ message.deliver
+ end
end
end
end