aboutsummaryrefslogtreecommitdiffstats
path: root/actionmailer/lib/action_mailer/delivery_methods.rb
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2010-01-28 19:46:17 +0000
committerPratik Naik <pratiknaik@gmail.com>2010-01-28 19:46:17 +0000
commit285361d1589002fcdd1584c07e6eb295f13c9f37 (patch)
tree2d50a69b3b59b6fb3cb7577b990fe3b1aaf58f4f /actionmailer/lib/action_mailer/delivery_methods.rb
parentdfa19408651ecc82e2aeba95d93db871ba8a6e41 (diff)
parentd58398c2b5e98aad18dc72790230f338c10d145c (diff)
downloadrails-285361d1589002fcdd1584c07e6eb295f13c9f37.tar.gz
rails-285361d1589002fcdd1584c07e6eb295f13c9f37.tar.bz2
rails-285361d1589002fcdd1584c07e6eb295f13c9f37.zip
Merge remote branch 'mainstream/master'
Conflicts: railties/lib/rails/railtie.rb
Diffstat (limited to 'actionmailer/lib/action_mailer/delivery_methods.rb')
-rw-r--r--actionmailer/lib/action_mailer/delivery_methods.rb90
1 files changed, 90 insertions, 0 deletions
diff --git a/actionmailer/lib/action_mailer/delivery_methods.rb b/actionmailer/lib/action_mailer/delivery_methods.rb
new file mode 100644
index 0000000000..f6321a240c
--- /dev/null
+++ b/actionmailer/lib/action_mailer/delivery_methods.rb
@@ -0,0 +1,90 @@
+require 'tmpdir'
+
+module ActionMailer
+ # This modules handles everything related to the delivery, from registering new
+ # delivery methods to configuring the mail object to be send.
+ module DeliveryMethods
+ extend ActiveSupport::Concern
+
+ included do
+ extlib_inheritable_accessor :delivery_methods, :delivery_method,
+ :instance_writer => false
+
+ # Do not make this inheritable, because we always want it to propagate
+ cattr_accessor :raise_delivery_errors
+ self.raise_delivery_errors = true
+
+ cattr_accessor :perform_deliveries
+ self.perform_deliveries = true
+
+ self.delivery_methods = {}
+ self.delivery_method = :smtp
+
+ 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
+ end
+
+ module ClassMethods
+ # Provides a list of emails that have been delivered by Mail::TestMailer
+ delegate :deliveries, :deliveries=, :to => Mail::TestMailer
+
+ # 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
+
+ send(:"#{symbol}_settings=", default_options)
+ self.delivery_methods[symbol.to_sym] = klass
+ end
+
+ def wrap_delivery_behavior(mail, method=nil) #:nodoc:
+ method ||= self.delivery_method
+ mail.delivery_handler = self
+
+ case method
+ when NilClass
+ raise "Delivery method cannot be nil"
+ when Symbol
+ if klass = delivery_methods[method.to_sym]
+ mail.delivery_method(klass, send(:"#{method}_settings"))
+ else
+ raise "Invalid delivery method #{method.inspect}"
+ end
+ else
+ mail.delivery_method(method)
+ end
+
+ mail.perform_deliveries = perform_deliveries
+ mail.raise_delivery_errors = raise_delivery_errors
+ end
+ end
+
+ def wrap_delivery_behavior!(*args) #:nodoc:
+ self.class.wrap_delivery_behavior(message, *args)
+ end
+ end
+end \ No newline at end of file