diff options
Diffstat (limited to 'actionmailer/lib/action_mailer/base.rb')
-rw-r--r-- | actionmailer/lib/action_mailer/base.rb | 39 |
1 files changed, 19 insertions, 20 deletions
diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 900da9697e..bd33f81f1e 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -1,11 +1,13 @@ require 'mail' +require 'action_mailer/queued_message' 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: +module ActionMailer # Action Mailer allows you to send email from your application using a mailer model and views. # # = Mailer Models @@ -140,6 +142,7 @@ module ActionMailer #:nodoc: # for delivery later: # # Notifier.welcome(david).deliver # sends the email + # Notifier.deliver_welcome(david) # synonym for the former # mail = Notifier.welcome(david) # => a Mail::Message object # mail.deliver # sends the email # @@ -362,6 +365,7 @@ module ActionMailer #:nodoc: # * <tt>deliveries</tt> - Keeps an array of all the emails sent out through the Action Mailer with # <tt>delivery_method :test</tt>. Most useful for unit and functional testing. # + # * <tt>queue</> - The queue that will be used to deliver the mail. The queue should expect a job that responds to <tt>run</tt>. class Base < AbstractController::Base include DeliveryMethods abstract! @@ -376,7 +380,7 @@ module ActionMailer #:nodoc: self.protected_instance_variables = [:@_action_has_layout] - helper ActionMailer::MailHelper + helper ActionMailer::MailHelper private_class_method :new #:nodoc: @@ -388,6 +392,9 @@ module ActionMailer #:nodoc: :parts_order => [ "text/plain", "text/enriched", "text/html" ] }.freeze + class_attribute :queue + self.queue = ActiveSupport::SynchronousQueue.new + class << self # Register one or more Observers which will be notified when mail is delivered. def register_observers(*observers) @@ -464,19 +471,6 @@ module ActionMailer #:nodoc: super || action_methods.include?(method.to_s) end - # Will force ActionMailer to push new messages to the queue defined - # in the ActionMailer class when set to true. - # - # class WelcomeMailer < ActionMailer::Base - # self.async = true - # end - def async=(truth) - if truth - require 'action_mailer/async' - extend ActionMailer::Async - end - end - protected def set_payload_for_mail(payload, mail) #:nodoc: @@ -491,9 +485,14 @@ module ActionMailer #:nodoc: payload[:mail] = mail.encoded end - def method_missing(method, *args) #:nodoc: - return super unless respond_to?(method) - new(method, *args).message + def method_missing(method_name, *args) + if action_methods.include?(method_name.to_s) + QueuedMessage.new(queue, self, method_name, *args) + elsif method_name.to_s =~ /^deliver_(.+)$/ && action_methods.include?($1) + public_send($1, *args).deliver + else + super + end end end @@ -683,7 +682,7 @@ module ActionMailer #:nodoc: m.charset = charset = headers[:charset] # Set configure delivery behavior - wrap_delivery_behavior!(headers.delete(:delivery_method)) + wrap_delivery_behavior!(headers.delete(:delivery_method),headers.delete(:delivery_method_options)) # Assign all headers except parts_order, content_type and body assignable = headers.except(:parts_order, :content_type, :body, :template_name, :template_path) @@ -756,7 +755,7 @@ module ActionMailer #:nodoc: responses << { :body => render(:template => template), - :content_type => template.mime_type.to_s + :content_type => template.type.to_s } end end |