delivery_methods.rb 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. require 'tmpdir'
  2. module ActionMailer
  3. # This module handles everything related to mail delivery, from registering new
  4. # delivery methods to configuring the mail object to be sent.
  5. module DeliveryMethods
  6. extend ActiveSupport::Concern
  7. included do
  8. class_attribute :delivery_methods, :delivery_method
  9. # Do not make this inheritable, because we always want it to propagate
  10. cattr_accessor :raise_delivery_errors
  11. self.raise_delivery_errors = true
  12. cattr_accessor :perform_deliveries
  13. self.perform_deliveries = true
  14. self.delivery_methods = {}.freeze
  15. self.delivery_method = :smtp
  16. add_delivery_method :smtp, Mail::SMTP,
  17. :address => "localhost",
  18. :port => 25,
  19. :domain => 'localhost.localdomain',
  20. :user_name => nil,
  21. :password => nil,
  22. :authentication => nil,
  23. :enable_starttls_auto => true
  24. add_delivery_method :file, Mail::FileDelivery,
  25. :location => defined?(Rails.root) ? "#{Rails.root}/tmp/mails" : "#{Dir.tmpdir}/mails"
  26. add_delivery_method :sendmail, Mail::Sendmail,
  27. :location => '/usr/sbin/sendmail',
  28. :arguments => '-i -t'
  29. add_delivery_method :test, Mail::TestMailer
  30. end
  31. module ClassMethods
  32. # Provides a list of emails that have been delivered by Mail::TestMailer
  33. delegate :deliveries, :deliveries=, :to => Mail::TestMailer
  34. # Adds a new delivery method through the given class using the given symbol
  35. # as alias and the default options supplied:
  36. #
  37. # Example:
  38. #
  39. # add_delivery_method :sendmail, Mail::Sendmail,
  40. # :location => '/usr/sbin/sendmail',
  41. # :arguments => '-i -t'
  42. #
  43. def add_delivery_method(symbol, klass, default_options={})
  44. class_attribute(:"#{symbol}_settings") unless respond_to?(:"#{symbol}_settings")
  45. send(:"#{symbol}_settings=", default_options)
  46. self.delivery_methods = delivery_methods.merge(symbol.to_sym => klass).freeze
  47. end
  48. def wrap_delivery_behavior(mail, method=nil) #:nodoc:
  49. method ||= self.delivery_method
  50. mail.delivery_handler = self
  51. case method
  52. when NilClass
  53. raise "Delivery method cannot be nil"
  54. when Symbol
  55. if klass = delivery_methods[method.to_sym]
  56. mail.delivery_method(klass, send(:"#{method}_settings"))
  57. else
  58. raise "Invalid delivery method #{method.inspect}"
  59. end
  60. else
  61. mail.delivery_method(method)
  62. end
  63. mail.perform_deliveries = perform_deliveries
  64. mail.raise_delivery_errors = raise_delivery_errors
  65. end
  66. end
  67. def wrap_delivery_behavior!(*args) #:nodoc:
  68. self.class.wrap_delivery_behavior(message, *args)
  69. end
  70. end
  71. end