Finish cleaning up delivery methods implementation.

上级 5dead5bb
...@@ -253,10 +253,9 @@ module ActionMailer #:nodoc: ...@@ -253,10 +253,9 @@ module ActionMailer #:nodoc:
# and appear last in the mime encoded message. You can also pick a different order from inside a method with # and appear last in the mime encoded message. You can also pick a different order from inside a method with
# +implicit_parts_order+. # +implicit_parts_order+.
class Base < AbstractController::Base class Base < AbstractController::Base
include DeliveryMethods, Quoting
abstract! abstract!
include Quoting
include AbstractController::Logger include AbstractController::Logger
include AbstractController::Rendering include AbstractController::Rendering
include AbstractController::LocalizedCache include AbstractController::LocalizedCache
...@@ -266,31 +265,9 @@ class Base < AbstractController::Base ...@@ -266,31 +265,9 @@ class Base < AbstractController::Base
helper ActionMailer::MailHelper helper ActionMailer::MailHelper
extend ActionMailer::DeliveryMethods
include ActionMailer::OldApi include ActionMailer::OldApi
include ActionMailer::DeprecatedApi include ActionMailer::DeprecatedApi
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
superclass_delegating_reader :delivery_method
self.delivery_method = :smtp
private_class_method :new #:nodoc: private_class_method :new #:nodoc:
cattr_accessor :raise_delivery_errors cattr_accessor :raise_delivery_errors
...@@ -493,10 +470,6 @@ def collect_responses_and_sort_order(headers) #:nodoc: ...@@ -493,10 +470,6 @@ def collect_responses_and_sort_order(headers) #:nodoc:
[responses, sort_order] [responses, sort_order]
end end
def wrap_delivery_behavior!(method=nil) #:nodoc:
self.class.wrap_delivery_behavior(@_message, method)
end
def create_parts_from_responses(m, responses, charset) #:nodoc: def create_parts_from_responses(m, responses, charset) #:nodoc:
if responses.size == 1 && !m.has_attachments? if responses.size == 1 && !m.has_attachments?
m.body = responses[0][:body] m.body = responses[0][:body]
......
require 'tmpdir'
module ActionMailer module ActionMailer
# This modules makes a DSL for adding delivery methods to ActionMailer # Provides a DSL for adding delivery methods to ActionMailer.
module DeliveryMethods module DeliveryMethods
# TODO Make me class inheritable extend ActiveSupport::Concern
def delivery_settings
@@delivery_settings ||= Hash.new { |h,k| h[k] = {} }
end
def delivery_methods included do
@@delivery_methods ||= {} extlib_inheritable_accessor :delivery_methods, :delivery_method,
end :instance_writer => false
def delivery_method=(method) self.delivery_methods = {}
raise ArgumentError, "Unknown delivery method #{method.inspect}" unless delivery_methods[method] self.delivery_method = :smtp
@delivery_method = method
end
def add_delivery_method(symbol, klass, default_options={}) add_delivery_method :smtp, Mail::SMTP,
self.delivery_methods[symbol] = klass :address => "localhost",
self.delivery_settings[symbol] = default_options :port => 25,
end :domain => 'localhost.localdomain',
:user_name => nil,
:password => nil,
:authentication => nil,
:enable_starttls_auto => true
def wrap_delivery_behavior(mail, method=nil) add_delivery_method :file, Mail::FileDelivery,
method ||= delivery_method :location => defined?(Rails.root) ? "#{Rails.root}/tmp/mails" : "#{Dir.tmpdir}/mails"
mail.register_for_delivery_notification(self) add_delivery_method :sendmail, Mail::Sendmail,
:location => '/usr/sbin/sendmail',
:arguments => '-i -t'
if method.is_a?(Symbol) add_delivery_method :test, Mail::TestMailer
mail.delivery_method(delivery_methods[method],
delivery_settings[method])
else
mail.delivery_method(method)
end
mail.perform_deliveries = perform_deliveries
mail.raise_delivery_errors = raise_delivery_errors
end end
module ClassMethods
# 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
def respond_to?(method_symbol, include_private = false) #:nodoc: send(:"#{symbol}_settings=", default_options)
matches_settings_method?(method_symbol) || super self.delivery_methods[symbol.to_sym] = klass
end end
protected def wrap_delivery_behavior(mail, method=delivery_method) #:nodoc:
mail.register_for_delivery_notification(self)
# TODO Get rid of this method missing magic if method.is_a?(Symbol)
def method_missing(method_symbol, *parameters) #:nodoc: if klass = delivery_methods[method.to_sym]
if match = matches_settings_method?(method_symbol) mail.delivery_method(klass, send(:"#{method}_settings"))
if match[2] else
delivery_settings[match[1].to_sym] = parameters[0] raise "Invalid delivery method #{method.inspect}"
end
else else
delivery_settings[match[1].to_sym] mail.delivery_method(method)
end end
else
super mail.perform_deliveries = perform_deliveries
mail.raise_delivery_errors = raise_delivery_errors
end end
end end
def matches_settings_method?(method_name) #:nodoc: def wrap_delivery_behavior!(*args) #:nodoc:
/(#{delivery_methods.keys.join('|')})_settings(=)?$/.match(method_name.to_s) self.class.wrap_delivery_behavior(message, *args)
end end
end end
end end
\ No newline at end of file
...@@ -47,7 +47,6 @@ def setup ...@@ -47,7 +47,6 @@ def setup
def teardown def teardown
ActionMailer::Base.delivery_methods.delete(:custom) ActionMailer::Base.delivery_methods.delete(:custom)
ActionMailer::Base.delivery_settings.delete(:custom)
end end
def test_allow_to_add_a_custom_delivery_method def test_allow_to_add_a_custom_delivery_method
......
...@@ -511,7 +511,7 @@ def test_cc_bcc ...@@ -511,7 +511,7 @@ def test_cc_bcc
end end
def test_from_without_name_for_smtp def test_from_without_name_for_smtp
ActionMailer::Base.delivery_method = :smtp TestMailer.delivery_method = :smtp
TestMailer.from_without_name.deliver TestMailer.from_without_name.deliver
mail = MockSMTP.deliveries.first mail = MockSMTP.deliveries.first
...@@ -522,7 +522,7 @@ def test_from_without_name_for_smtp ...@@ -522,7 +522,7 @@ def test_from_without_name_for_smtp
end end
def test_from_with_name_for_smtp def test_from_with_name_for_smtp
ActionMailer::Base.delivery_method = :smtp TestMailer.delivery_method = :smtp
TestMailer.from_with_name.deliver TestMailer.from_with_name.deliver
mail = MockSMTP.deliveries.first mail = MockSMTP.deliveries.first
...@@ -659,7 +659,7 @@ def test_doesnt_raise_errors_when_raise_delivery_errors_is_false ...@@ -659,7 +659,7 @@ def test_doesnt_raise_errors_when_raise_delivery_errors_is_false
def test_performs_delivery_via_sendmail def test_performs_delivery_via_sendmail
IO.expects(:popen).once.with('/usr/sbin/sendmail -i -t -f "system@loudthinking.com" test@localhost', 'w+') IO.expects(:popen).once.with('/usr/sbin/sendmail -i -t -f "system@loudthinking.com" test@localhost', 'w+')
ActionMailer::Base.delivery_method = :sendmail TestMailer.delivery_method = :sendmail
TestMailer.signed_up(@recipient).deliver TestMailer.signed_up(@recipient).deliver
end end
...@@ -956,7 +956,7 @@ def test_various_newlines_multipart ...@@ -956,7 +956,7 @@ def test_various_newlines_multipart
end end
def test_headers_removed_on_smtp_delivery def test_headers_removed_on_smtp_delivery
ActionMailer::Base.delivery_method = :smtp TestMailer.delivery_method = :smtp
TestMailer.cc_bcc(@recipient).deliver TestMailer.cc_bcc(@recipient).deliver
assert MockSMTP.deliveries[0][2].include?("root@loudthinking.com") assert MockSMTP.deliveries[0][2].include?("root@loudthinking.com")
assert MockSMTP.deliveries[0][2].include?("nobody@loudthinking.com") assert MockSMTP.deliveries[0][2].include?("nobody@loudthinking.com")
...@@ -1053,35 +1053,35 @@ def test_return_path_with_create ...@@ -1053,35 +1053,35 @@ def test_return_path_with_create
end end
def test_return_path_with_deliver def test_return_path_with_deliver
ActionMailer::Base.delivery_method = :smtp TestMailer.delivery_method = :smtp
TestMailer.return_path.deliver TestMailer.return_path.deliver
assert_match %r{^Return-Path: <another@somewhere.test>}, MockSMTP.deliveries[0][0] assert_match %r{^Return-Path: <another@somewhere.test>}, MockSMTP.deliveries[0][0]
assert_equal "another@somewhere.test", MockSMTP.deliveries[0][1].to_s assert_equal "another@somewhere.test", MockSMTP.deliveries[0][1].to_s
end end
def test_starttls_is_enabled_if_supported def test_starttls_is_enabled_if_supported
ActionMailer::Base.delivery_settings[:smtp].merge!(:enable_starttls_auto => true) TestMailer.smtp_settings.merge!(:enable_starttls_auto => true)
MockSMTP.any_instance.expects(:respond_to?).with(:enable_starttls_auto).returns(true) MockSMTP.any_instance.expects(:respond_to?).with(:enable_starttls_auto).returns(true)
MockSMTP.any_instance.expects(:enable_starttls_auto) MockSMTP.any_instance.expects(:enable_starttls_auto)
ActionMailer::Base.delivery_method = :smtp TestMailer.delivery_method = :smtp
TestMailer.signed_up(@recipient).deliver TestMailer.signed_up(@recipient).deliver
end end
def test_starttls_is_disabled_if_not_supported def test_starttls_is_disabled_if_not_supported
ActionMailer::Base.delivery_settings[:smtp].merge!(:enable_starttls_auto => true) TestMailer.smtp_settings.merge!(:enable_starttls_auto => true)
MockSMTP.any_instance.expects(:respond_to?).with(:enable_starttls_auto).returns(false) MockSMTP.any_instance.expects(:respond_to?).with(:enable_starttls_auto).returns(false)
MockSMTP.any_instance.expects(:enable_starttls_auto).never MockSMTP.any_instance.expects(:enable_starttls_auto).never
ActionMailer::Base.delivery_method = :smtp TestMailer.delivery_method = :smtp
TestMailer.signed_up(@recipient).deliver TestMailer.signed_up(@recipient).deliver
end end
def test_starttls_is_not_enabled def test_starttls_is_not_enabled
TestMailer.delivery_settings[:smtp].merge!(:enable_starttls_auto => false) TestMailer.smtp_settings.merge!(:enable_starttls_auto => false)
MockSMTP.any_instance.expects(:respond_to?).never MockSMTP.any_instance.expects(:respond_to?).never
TestMailer.delivery_method = :smtp TestMailer.delivery_method = :smtp
TestMailer.signed_up(@recipient).deliver TestMailer.signed_up(@recipient).deliver
ensure ensure
TestMailer.delivery_settings[:smtp].merge!(:enable_starttls_auto => true) TestMailer.smtp_settings.merge!(:enable_starttls_auto => true)
end end
end end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册