public
Description: Support for multiple SMTP servers in ActionMailer
Clone URL: git://github.com/nakajima/many-mailers.git
Search Repo:
now requiring a default mail server, but got non-global settings to work
nakajima (author)
Wed Mar 05 12:35:08 -0800 2008
commit  fa98539ab11d26ab9397372f4b40b138bb088b97
tree    a877b2378226372d85449a6234dbb67ed46545c4
parent  9bd940d12d260be40e147f11c37ee0139ed1ed13
0
...
31
32
33
34
35
36
37
 
 
38
39
40
...
31
32
33
 
 
 
 
34
35
36
37
38
0
@@ -31,10 +31,8 @@
0
   | user_name: test_user
0
   | password: test_password
0
     
0
-The plugin will look for a server named "default" to use by default.
0
-To specify the default server, do this:
0
-
0
- ActionMailer.default_server = :internal
0
+The plugin will look for a server named "default" to use by default. Make sure
0
+it exists.
0
 
0
 ActionMailer::Base (and all of its subclasses, ie, your mailers) will use this
0
 server by default.
...
3
4
5
6
7
 
8
9
10
11
12
13
14
15
16
17
 
 
18
19
 
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
 
 
34
 
 
35
36
37
...
3
4
5
 
 
6
7
 
8
9
10
11
12
13
 
 
14
15
16
 
17
18
 
 
 
 
 
 
19
20
 
 
 
 
 
21
22
23
24
25
26
27
28
29
0
@@ -3,35 +3,27 @@
0
     def self.included(base)
0
       base.extend(ClassMethods)
0
       base.class_eval do
0
- @@mail_servers = { }
0
- @@default_server = :default
0
+ @@mail_servers = { }
0
         cattr_accessor :mail_servers
0
- cattr_reader :default_server
0
         load_settings!
0
       end
0
     end
0
     
0
     module ClassMethods
0
       def with_settings(name, &block)
0
- init_settings = self.smtp_settings
0
- use_server(name)
0
+ self.class_inheritable_accessor :smtp_settings
0
+ self.smtp_settings = ActionMailer::Base.mail_servers[name]
0
         yield self
0
- self.smtp_settings = init_settings
0
+ self.smtp_settings = ActionMailer::Base.mail_servers[:default]
0
       end
0
-
0
- def use_server(name)
0
- @@default_server = name
0
- self.smtp_settings = mail_servers[@@default_server]
0
- end
0
- alias_method :default_server=, :use_server
0
            
0
       def load_settings!(file_path = "#{RAILS_ROOT}/config/mail_servers.yml")
0
- begin
0
- YAML.load_file(file_path).each { |key, value| mail_servers[key.to_sym] = value.to_options! }
0
- self.smtp_settings = mail_servers[default_server]
0
- rescue
0
- logger.warn "=> \"#{file_path}\" not found! Using default SMTP settings (if any)."
0
+ YAML.load_file(file_path).each do |key, value|
0
+ mail_servers[key.to_sym] = value.to_options!
0
+ self.smtp_settings = mail_servers[:default]
0
         end
0
+ rescue
0
+ puts "=> \"#{file_path}\" not found! Using default SMTP settings (if any)."
0
       end
0
     end
0
   end
...
1
2
 
 
 
 
 
 
 
 
3
 
4
...
1
 
2
3
4
5
6
7
8
9
10
11
12
0
@@ -1,5 +1,13 @@
0
 ENV['RAILS_ENV'] ||= 'test'
0
-require File.dirname(__FILE__) + '/../../../../config/environment.rb'
0
+begin
0
+ require File.dirname(__FILE__) + '/../../../../config/environment.rb'
0
+rescue LoadError
0
+ RAILS_ROOT = File.dirname(__FILE__) + '/fixtures'
0
+ require 'rubygems'
0
+ require 'action_mailer'
0
+ require File.dirname(__FILE__) + '/../lib/many_mailers.rb'
0
+end
0
 require 'fixtures/user_mailer'
0
+require 'fixtures/party_mailer'
0
 require 'test/unit'
...
 
 
 
 
 
 
 
 
 
 
 
 
 
...
1
2
3
4
5
6
7
8
9
10
11
12
13
0
@@ -1 +1,14 @@
0
+default:
0
+ address: mail.example.com
0
+ port: 25
0
+ domain: example.com
0
+ user_name: test_user
0
+ password: test_password
0
+
0
+internal:
0
+ address: internal.example.com
0
+ port: 25
0
+ domain: example.com
0
+ user_name: internal_test_user
0
+ password: internal_test_password
...
1
2
3
4
5
6
7
8
9
10
11
12
13
...
 
 
 
 
 
 
 
 
 
 
 
 
 
0
@@ -1,14 +1 @@
0
-default:
0
- address: mail.example.com
0
- port: 25
0
- domain: example.com
0
- user_name: test_user
0
- password: test_password
0
-
0
-internal:
0
- address: internal.example.com
0
- port: 25
0
- domain: example.com
0
- user_name: internal_test_user
0
- password: internal_test_password
...
 
 
 
 
 
 
 
 
...
1
2
3
4
5
6
7
8
0
@@ -1 +1,9 @@
0
+class PartyMailer < ActionMailer::Base
0
+ def invitation(message)
0
+ from 'Invitations <invitations@example.com>'
0
+ recipients 'Recipient <recipient@example.com>'
0
+ subject "You're invited!"
0
+ body :message => message
0
+ end
0
+end
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
22
23
24
25
 
26
27
28
29
30
31
32
33
34
35
36
37
38
 
 
 
 
 
 
 
39
40
41
...
2
3
4
 
 
 
 
 
5
6
7
8
9
10
...
17
18
19
 
20
21
22
 
 
 
 
 
23
 
24
25
26
27
28
29
30
31
32
33
34
35
36
37
0
@@ -2,11 +2,6 @@
0
 
0
 class ManyMailersTest < Test::Unit::TestCase
0
   
0
- def setup
0
- ActionMailer::Base.default_server = :default
0
- ActionMailer::Base.load_settings!(File.dirname(__FILE__) + '/fixtures/mail_servers.yml')
0
- end
0
-
0
   def test_should_load_settings_properly
0
     settings = ActionMailer::Base.mail_servers[:default]
0
     assert_equal 'mail.example.com', settings[:address]
0
0
0
0
@@ -22,20 +17,21 @@
0
   end
0
   
0
   def test_should_default_to_default
0
- assert_equal ActionMailer::Base.mail_servers[:default], ActionMailer::Base.smtp_settings
0
+ assert_equal ActionMailer::Base.mail_servers[:default], UserMailer.smtp_settings
0
   end
0
   
0
- def test_should_allow_custom_default_server
0
- UserMailer.default_server = :internal
0
- assert_equal ActionMailer::Base.mail_servers[:internal], UserMailer.smtp_settings
0
- end
0
-
0
   def test_should_allow_temporary_custom_server
0
- assert_equal ActionMailer::Base.mail_servers[:default], UserMailer.smtp_settings
0
     UserMailer.with_settings(:internal) do |mailer|
0
       assert_equal ActionMailer::Base.mail_servers[:internal], UserMailer.smtp_settings
0
     end
0
     assert_equal ActionMailer::Base.mail_servers[:default], UserMailer.smtp_settings
0
+ end
0
+
0
+ def test_should_only_change_settings_for_one_class
0
+ UserMailer.with_settings(:internal) do |mailer|
0
+ assert_equal ActionMailer::Base.mail_servers[:internal], UserMailer.smtp_settings
0
+ assert_equal ActionMailer::Base.mail_servers[:default], PartyMailer.smtp_settings, "Changed settings globally!"
0
+ end
0
   end
0
 
0
 end

Comments

    No one has commented yet.