public
Description: Support for multiple SMTP servers in ActionMailer
Clone URL: git://github.com/nakajima/many-mailers.git
added :retry option for with_settings to specify servers to use when the 
initially specified server fails
nakajima (author)
Wed Jul 23 11:00:12 -0700 2008
commit  b7643a3acdf08e093e59e82a897e676925ea631e
tree    689aa15843d66ede11cdf2005f704addd285ffe0
parent  1fda85d57cb6a98ffce5f2495d66162e5d93c2d3
...
10
11
12
13
 
14
15
16
 
 
 
 
 
 
 
 
17
18
19
...
10
11
12
 
13
14
15
 
16
17
18
19
20
21
22
23
24
25
26
0
@@ -10,10 +10,17 @@ module Animoto
0
     end
0
     
0
     module ClassMethods
0
- def with_settings(name, &block)
0
+ def with_settings(name, options={}, &block)
0
         self.class_inheritable_accessor :smtp_settings
0
         self.smtp_settings = mail_servers[name]
0
- yield self
0
+ rescue_servers = [options[:retry]].flatten.reverse
0
+ begin
0
+ yield self
0
+ rescue => e
0
+ raise e if rescue_servers.empty?
0
+ retry_server = rescue_servers.pop
0
+ with_settings(retry_server, :retry => rescue_servers, &block)
0
+ end
0
         self.smtp_settings = mail_servers[:default]
0
       end
0
            
...
9
10
11
12
13
 
 
14
...
9
10
11
 
12
13
14
15
0
@@ -9,4 +9,5 @@ rescue LoadError
0
 end
0
 require 'fixtures/user_mailer'
0
 require 'fixtures/party_mailer'
0
-require 'test/unit'
0
\ No newline at end of file
0
+require 'test/unit'
0
+require 'mocha'
0
\ No newline at end of file
...
1
 
 
2
3
4
...
1
2
3
4
5
6
0
@@ -1,4 +1,6 @@
0
 class UserMailer < ActionMailer::Base
0
+ self.template_root = "#{RAILS_ROOT}/views"
0
+
0
   def feedback(message)
0
     from 'Service <service@example.com>'
0
     recipients 'Feedback <feedback@example.com>'
...
33
34
35
 
 
 
 
 
 
 
36
37
38
...
33
34
35
36
37
38
39
40
41
42
43
44
45
0
@@ -33,5 +33,12 @@ class ManyMailersTest < Test::Unit::TestCase
0
       assert_equal ActionMailer::Base.mail_servers[:default], PartyMailer.smtp_settings, "Changed settings globally!"
0
     end
0
   end
0
+
0
+ def test_should_retry_with_failovers
0
+ UserMailer.with_settings(:internal, :retry => :default) do |mailer|
0
+ begin; mailer.deliver_feedback('Oh, thanks.')
0
+ rescue; assert_equal ActionMailer::Base.mail_servers[:default], UserMailer.smtp_settings end
0
+ end
0
+ end
0
 
0
 end
0
\ No newline at end of file

Comments

    No one has commented yet.