aboutsummaryrefslogblamecommitdiffstats
path: root/actionmailer/lib/action_mailer/delivery_methods.rb
blob: 21909d5d57d3a08b51be0a17de6ba83d0c2abfbb (plain) (tree)
1
2
3
4
5
6
7
8

                
                   

                                                                                 
                        
                                 
 


                                                                      
 






                                                                            

                                   
 







                                                         
 

                                                                                             
 


                                                    
 
                                                 
       
 
                       


                                                                  












                                                                                       
 


                                                     
 

                                                           
                                                     
 





                                                                    
            
                                      
           


                                                          
         
       
 

                                                       


       
require 'tmpdir'

module ActionMailer
  # This modules handles everything related to the delivery, from registering new
  # delivery methods to configuring the mail object to be send.
  module DeliveryMethods
    extend ActiveSupport::Concern

    included do
      extlib_inheritable_accessor :delivery_methods, :delivery_method,
                                  :instance_writer => false

      # Do not make this inheritable, because we always want it to propagate
      cattr_accessor :raise_delivery_errors
      self.raise_delivery_errors = true

      cattr_accessor :perform_deliveries
      self.perform_deliveries = true

      self.delivery_methods = {}
      self.delivery_method  = :smtp

      add_delivery_method :smtp, Mail::SMTP,
        :address              => "localhost",
        :port                 => 25,
        :domain               => 'localhost.localdomain',
        :user_name            => nil,
        :password             => nil,
        :authentication       => nil,
        :enable_starttls_auto => true

      add_delivery_method :file, Mail::FileDelivery,
        :location => defined?(Rails.root) ? "#{Rails.root}/tmp/mails" : "#{Dir.tmpdir}/mails"

      add_delivery_method :sendmail, Mail::Sendmail,
        :location   => '/usr/sbin/sendmail',
        :arguments  => '-i -t'

      add_delivery_method :test, Mail::TestMailer
    end

    module ClassMethods
      # Provides a list of emails that have been delivered by Mail
      delegate :deliveries, :deliveries=, :to => Mail

      # Adds a new delivery method through the given class using the given symbol
      # as alias and the default options supplied:
      #
      # Example:
      # 
      #   add_delivery_method :sendmail, Mail::Sendmail,
      #     :location   => '/usr/sbin/sendmail',
      #     :arguments  => '-i -t'
      # 
      def add_delivery_method(symbol, klass, default_options={})
        unless respond_to?(:"#{symbol}_settings")
          extlib_inheritable_accessor(:"#{symbol}_settings", :instance_writer => false)
        end

        send(:"#{symbol}_settings=", default_options)
        self.delivery_methods[symbol.to_sym] = klass
      end

      def wrap_delivery_behavior(mail, method=nil) #:nodoc:
        method ||= self.delivery_method
        mail.register_for_delivery_notification(self)

        if method.is_a?(Symbol)
          if klass = delivery_methods[method.to_sym]
            mail.delivery_method(klass, send(:"#{method}_settings"))
          else
            raise "Invalid delivery method #{method.inspect}"
          end
        else
          mail.delivery_method(method)
        end

        mail.perform_deliveries    = perform_deliveries
        mail.raise_delivery_errors = raise_delivery_errors
      end
    end

    def wrap_delivery_behavior!(*args) #:nodoc:
      self.class.wrap_delivery_behavior(message, *args)
    end
  end
end