<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>actionmailer/lib/action_mailer/delivery_method.rb</filename>
    </added>
    <added>
      <filename>actionmailer/lib/action_mailer/delivery_method/file.rb</filename>
    </added>
    <added>
      <filename>actionmailer/lib/action_mailer/delivery_method/sendmail.rb</filename>
    </added>
    <added>
      <filename>actionmailer/lib/action_mailer/delivery_method/smtp.rb</filename>
    </added>
    <added>
      <filename>actionmailer/lib/action_mailer/delivery_method/test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -44,6 +44,7 @@ Rake::RDocTask.new { |rdoc|
   rdoc.rdoc_files.include('README', 'CHANGELOG')
   rdoc.rdoc_files.include('lib/action_mailer.rb')
   rdoc.rdoc_files.include('lib/action_mailer/*.rb')
+  rdoc.rdoc_files.include('lib/action_mailer/delivery_method/*.rb')
 }
 
 spec = eval(File.read('actionmailer.gemspec'))</diff>
      <filename>actionmailer/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -33,6 +33,7 @@ module ActionMailer
 
   autoload :AdvAttrAccessor, 'action_mailer/adv_attr_accessor'
   autoload :Base, 'action_mailer/base'
+  autoload :DeliveryMethod, 'action_mailer/delivery_method'
   autoload :Helpers, 'action_mailer/helpers'
   autoload :Part, 'action_mailer/part'
   autoload :PartContainer, 'action_mailer/part_container'</diff>
      <filename>actionmailer/lib/action_mailer.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,3 @@
-require 'tmpdir'
-
 require &quot;active_support/core_ext/class&quot;
 # Use the old layouts until actionmailer gets refactored
 require &quot;action_controller/legacy/layout&quot;
@@ -232,7 +230,7 @@ module ActionMailer #:nodoc:
   # * &lt;tt&gt;raise_delivery_errors&lt;/tt&gt; - Whether or not errors should be raised if the email fails to be delivered.
   #
   # * &lt;tt&gt;delivery_method&lt;/tt&gt; - Defines a delivery method. Possible values are &lt;tt&gt;:smtp&lt;/tt&gt; (default), &lt;tt&gt;:sendmail&lt;/tt&gt;, &lt;tt&gt;:test&lt;/tt&gt;,
-  #   and &lt;tt&gt;:file&lt;/tt&gt;.
+  #   and &lt;tt&gt;:file&lt;/tt&gt;. Or you may provide a custom delivery method object eg. MyOwnDeliveryMethodClass.new
   #
   # * &lt;tt&gt;perform_deliveries&lt;/tt&gt; - Determines whether &lt;tt&gt;deliver_*&lt;/tt&gt; methods are actually carried out. By default they are,
   #   but this can be turned off to help functional testing.
@@ -270,35 +268,21 @@ module ActionMailer #:nodoc:
 
     cattr_accessor :logger
 
-    @@smtp_settings = {
-      :address              =&gt; &quot;localhost&quot;,
-      :port                 =&gt; 25,
-      :domain               =&gt; 'localhost.localdomain',
-      :user_name            =&gt; nil,
-      :password             =&gt; nil,
-      :authentication       =&gt; nil,
-      :enable_starttls_auto =&gt; true,
-    }
-    cattr_accessor :smtp_settings
-
-    @@sendmail_settings = {
-      :location       =&gt; '/usr/sbin/sendmail',
-      :arguments      =&gt; '-i -t'
-    }
-    cattr_accessor :sendmail_settings
-
-    @@file_settings = {
-      :location       =&gt; defined?(Rails) ? &quot;#{Rails.root}/tmp/mails&quot; : &quot;#{Dir.tmpdir}/mails&quot;
-    }
-
-    cattr_accessor :file_settings
+    class &lt;&lt; self
+      delegate :settings, :settings=, :to =&gt; ActionMailer::DeliveryMethod::File, :prefix =&gt; :file
+      delegate :settings, :settings=, :to =&gt; ActionMailer::DeliveryMethod::Sendmail, :prefix =&gt; :sendmail
+      delegate :settings, :settings=, :to =&gt; ActionMailer::DeliveryMethod::Smtp, :prefix =&gt; :smtp
+
+      def delivery_method=(method_name)
+        @delivery_method = ActionMailer::DeliveryMethod.lookup_method(method_name)
+      end
+    end
+    self.delivery_method = :smtp
+    superclass_delegating_reader :delivery_method
 
     @@raise_delivery_errors = true
     cattr_accessor :raise_delivery_errors
 
-    superclass_delegating_accessor :delivery_method
-    self.delivery_method = :smtp
-
     @@perform_deliveries = true
     cattr_accessor :perform_deliveries
 
@@ -552,7 +536,7 @@ module ActionMailer #:nodoc:
 
       ActiveSupport::Notifications.instrument(:deliver_mail, :mail =&gt; @mail) do
         begin
-          __send__(&quot;perform_delivery_#{delivery_method}&quot;, mail) if perform_deliveries
+          self.delivery_method.perform_delivery(mail) if perform_deliveries
         rescue Exception =&gt; e # Net::SMTP errors or sendmail pipe errors
           raise e if raise_delivery_errors
         end
@@ -720,39 +704,6 @@ module ActionMailer #:nodoc:
         @mail = m
       end
 
-      def perform_delivery_smtp(mail)
-        destinations = mail.destinations
-        mail.ready_to_send
-        sender = (mail['return-path'] &amp;&amp; mail['return-path'].spec) || mail['from']
-
-        smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
-        smtp.enable_starttls_auto if smtp_settings[:enable_starttls_auto] &amp;&amp; smtp.respond_to?(:enable_starttls_auto)
-        smtp.start(smtp_settings[:domain], smtp_settings[:user_name], smtp_settings[:password],
-                   smtp_settings[:authentication]) do |smtp|
-          smtp.sendmail(mail.encoded, sender, destinations)
-        end
-      end
-
-      def perform_delivery_sendmail(mail)
-        sendmail_args = sendmail_settings[:arguments]
-        sendmail_args += &quot; -f \&quot;#{mail['return-path']}\&quot;&quot; if mail['return-path']
-        IO.popen(&quot;#{sendmail_settings[:location]} #{sendmail_args}&quot;,&quot;w+&quot;) do |sm|
-          sm.print(mail.encoded.gsub(/\r/, ''))
-          sm.flush
-        end
-      end
-
-      def perform_delivery_test(mail)
-        deliveries &lt;&lt; mail
-      end
-
-      def perform_delivery_file(mail)
-        FileUtils.mkdir_p file_settings[:location]
-
-        (mail.to + mail.cc + mail.bcc).uniq.each do |to|
-          File.open(File.join(file_settings[:location], to), 'a') { |f| f.write(mail) }
-        end
-      end
   end
 
   Base.class_eval do</diff>
      <filename>actionmailer/lib/action_mailer/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -11,6 +11,21 @@ class FileDeliveryMethodMailer &lt; ActionMailer::Base
   self.delivery_method = :file
 end
 
+class CustomDeliveryMethod
+  attr_accessor :custom_deliveries
+  def initialize()
+    @customer_deliveries = []
+  end
+
+  def self.perform_delivery(mail)
+    self.custom_deliveries &lt;&lt; mail
+  end
+end
+
+class CustomerDeliveryMailer &lt; ActionMailer::Base
+  self.delivery_method = CustomDeliveryMethod.new
+end
+
 class ActionMailerBase_delivery_method_Test &lt; Test::Unit::TestCase
   def setup
     set_delivery_method :smtp
@@ -21,7 +36,7 @@ class ActionMailerBase_delivery_method_Test &lt; Test::Unit::TestCase
   end
 
   def test_should_be_the_default_smtp
-    assert_equal :smtp, ActionMailer::Base.delivery_method
+    assert_instance_of ActionMailer::DeliveryMethod::Smtp, ActionMailer::Base.delivery_method
   end
 end
 
@@ -35,7 +50,7 @@ class DefaultDeliveryMethodMailer_delivery_method_Test &lt; Test::Unit::TestCase
   end
   
   def test_should_be_the_default_smtp
-    assert_equal :smtp, DefaultDeliveryMethodMailer.delivery_method
+    assert_instance_of ActionMailer::DeliveryMethod::Smtp, DefaultDeliveryMethodMailer.delivery_method
   end
 end
 
@@ -49,7 +64,7 @@ class NonDefaultDeliveryMethodMailer_delivery_method_Test &lt; Test::Unit::TestCase
   end
 
   def test_should_be_the_set_delivery_method
-    assert_equal :sendmail, NonDefaultDeliveryMethodMailer.delivery_method
+    assert_instance_of ActionMailer::DeliveryMethod::Sendmail, NonDefaultDeliveryMethodMailer.delivery_method
   end
 end
 
@@ -63,7 +78,7 @@ class FileDeliveryMethodMailer_delivery_method_Test &lt; Test::Unit::TestCase
   end
 
   def test_should_be_the_set_delivery_method
-    assert_equal :file, FileDeliveryMethodMailer.delivery_method
+    assert_instance_of ActionMailer::DeliveryMethod::File, FileDeliveryMethodMailer.delivery_method
   end
 
   def test_should_default_location_to_the_tmpdir
@@ -71,3 +86,16 @@ class FileDeliveryMethodMailer_delivery_method_Test &lt; Test::Unit::TestCase
   end
 end
 
+class CustomDeliveryMethodMailer_delivery_method_Test &lt; Test::Unit::TestCase
+  def setup
+    set_delivery_method :smtp
+  end
+
+  def teardown
+    restore_delivery_method
+  end
+
+  def test_should_be_the_set_delivery_method
+    assert_instance_of CustomDeliveryMethod, CustomerDeliveryMailer.delivery_method
+  end
+end</diff>
      <filename>actionmailer/test/delivery_method_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -554,7 +554,7 @@ class ActionMailerTest &lt; Test::Unit::TestCase
 
   def test_doesnt_raise_errors_when_raise_delivery_errors_is_false
     ActionMailer::Base.raise_delivery_errors = false
-    TestMailer.any_instance.expects(:perform_delivery_test).raises(Exception)
+    TestMailer.delivery_method.expects(:perform_delivery).raises(Exception)
     assert_nothing_raised { TestMailer.deliver_signed_up(@recipient) }
   end
 </diff>
      <filename>actionmailer/test/mail_service_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,7 @@ end
 
 class TestHelperMailerTest &lt; ActionMailer::TestCase
   def test_setup_sets_right_action_mailer_options
-    assert_equal :test, ActionMailer::Base.delivery_method
+    assert_instance_of ActionMailer::DeliveryMethod::Test, ActionMailer::Base.delivery_method
     assert ActionMailer::Base.perform_deliveries
     assert_equal [], ActionMailer::Base.deliveries
   end</diff>
      <filename>actionmailer/test/test_helper_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>3f560386125adabe441facf2514ad53425e4af4e</id>
    </parent>
  </parents>
  <author>
    <name>Matthew Rudy Jacobs</name>
    <email>MatthewRudyJacobs@gmail.com</email>
  </author>
  <url>http://github.com/feldpost/rails/commit/f4f76772fb5c25357a54baaa9cd20f7e9a1cd653</url>
  <id>f4f76772fb5c25357a54baaa9cd20f7e9a1cd653</id>
  <committed-date>2009-10-31T18:23:47-07:00</committed-date>
  <authored-date>2009-10-28T02:17:59-07:00</authored-date>
  <message>abstract all of the ActionMailer delivery methods into their own classes. thereby the following are equivalent

  ActionMailer::Base.delivery_method = :smtp
  ActionMailer::Base.delivery_method = ActionMailer::DeliveryMethod::Smtp

we could equally set our own custom object
as long as it provides the instance method :perform_delivery(mail)

eg.

  class MySmsDeliveryMethod
    def perform_delivery(mail)
      Sms.send(mail['to'], mail['body'])
    end
  end

  MySmsMailer.delivery_method = MySmsDeliveryMethod.new

Signed-off-by: Jos&#233; Valim &lt;jose.valim@gmail.com&gt;</message>
  <tree>c3095ca798d006fa5750538d862cf5fcc35da6ba</tree>
  <committer>
    <name>Yehuda Katz</name>
    <email>wycats@gmail.com</email>
  </committer>
</commit>
