Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow delivery method options to be set per mail instance #7397

Merged
merged 1 commit into from Sep 6, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 16 additions & 0 deletions actionmailer/CHANGELOG.md
@@ -1,5 +1,21 @@
## Rails 4.0.0 (unreleased) ##

* Allow delivery method options to be set per mail instance *Aditya Sanghi*

If your smtp delivery settings are dynamic,
you can now override settings per mail instance for e.g.

def my_mailer(user,company)
mail to: customer.email, subject: "Welcome!",
delivery_method_options: {user_name: company.smtp_user,
password: company.smtp_password}
end

This will ensure that your default SMTP settings will be overridden
by the company specific ones. You only have to override the settings
that are dynamic and leave the static setting in your environment
configuration file (e.g. config/environments/production.rb)

* Allow to set default Action Mailer options via `config.action_mailer.default_options=` *Robert Pankowecki*

* Raise an `ActionView::MissingTemplate` exception when no implicit template could be found. *Damien Mathieu*
Expand Down
2 changes: 1 addition & 1 deletion actionmailer/lib/action_mailer/base.rb
Expand Up @@ -683,7 +683,7 @@ def mail(headers={}, &block)
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)
Expand Down
4 changes: 2 additions & 2 deletions actionmailer/lib/action_mailer/delivery_methods.rb
Expand Up @@ -57,7 +57,7 @@ def add_delivery_method(symbol, klass, default_options={})
self.delivery_methods = delivery_methods.merge(symbol.to_sym => klass).freeze
end

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

Expand All @@ -66,7 +66,7 @@ def wrap_delivery_behavior(mail, method=nil) #:nodoc:
raise "Delivery method cannot be nil"
when Symbol
if klass = delivery_methods[method]
mail.delivery_method(klass, send(:"#{method}_settings"))
mail.delivery_method(klass,(send(:"#{method}_settings") || {}).merge!(options || {}))
else
raise "Invalid delivery method #{method.inspect}"
end
Expand Down
39 changes: 39 additions & 0 deletions actionmailer/test/delivery_methods_test.rb
Expand Up @@ -4,6 +4,13 @@
class MyCustomDelivery
end

class MyOptionedDelivery
attr_reader :options
def initialize(options)
@options = options
end
end

class BogusDelivery
def initialize(*)
end
Expand Down Expand Up @@ -115,6 +122,38 @@ def teardown
assert_instance_of Mail::TestMailer, email.delivery_method
end

test "delivery method options default to class level options" do
default_options = {a: "b"}
ActionMailer::Base.add_delivery_method :optioned, MyOptionedDelivery, default_options
mail_instance = DeliveryMailer.welcome(:delivery_method => :optioned)
assert_equal default_options, mail_instance.delivery_method.options
end

test "delivery method options can be overridden per mail instance" do
default_options = {a: "b"}
ActionMailer::Base.add_delivery_method :optioned, MyOptionedDelivery, default_options
overridden_options = {a: "a"}
mail_instance = DeliveryMailer.welcome(:delivery_method => :optioned, :delivery_method_options => overridden_options)
assert_equal overridden_options, mail_instance.delivery_method.options
end

test "default delivery options can be overridden per mail instance" do
settings = { :address => "localhost",
:port => 25,
:domain => 'localhost.localdomain',
:user_name => nil,
:password => nil,
:authentication => nil,
:enable_starttls_auto => true }
assert_equal settings, ActionMailer::Base.smtp_settings
overridden_options = {user_name: "overridden", :password => "somethingobtuse"}
mail_instance = DeliveryMailer.welcome(:delivery_method_options => overridden_options)
delivery_method_instance = mail_instance.delivery_method
assert_equal "overridden", delivery_method_instance.settings[:user_name]
assert_equal "somethingobtuse", delivery_method_instance.settings[:password]
assert_equal delivery_method_instance.settings.merge(overridden_options), delivery_method_instance.settings
end

test "non registered delivery methods raises errors" do
DeliveryMailer.delivery_method = :unknown
assert_raise RuntimeError do
Expand Down