aboutsummaryrefslogtreecommitdiffstats
path: root/actionmailer/lib
diff options
context:
space:
mode:
Diffstat (limited to 'actionmailer/lib')
-rw-r--r--actionmailer/lib/action_mailer.rb1
-rw-r--r--actionmailer/lib/action_mailer/base.rb1
-rw-r--r--actionmailer/lib/action_mailer/deprecated_api.rb252
-rw-r--r--actionmailer/lib/action_mailer/old_api.rb250
4 files changed, 261 insertions, 243 deletions
diff --git a/actionmailer/lib/action_mailer.rb b/actionmailer/lib/action_mailer.rb
index 67466e15e2..8339826197 100644
--- a/actionmailer/lib/action_mailer.rb
+++ b/actionmailer/lib/action_mailer.rb
@@ -36,6 +36,7 @@ module ActionMailer
autoload :DeliveryMethods
autoload :DeprecatedApi
autoload :MailHelper
+ autoload :OldApi
autoload :Quoting
autoload :TestCase
autoload :TestHelper
diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb
index 8e30c54c49..77b9ac4a97 100644
--- a/actionmailer/lib/action_mailer/base.rb
+++ b/actionmailer/lib/action_mailer/base.rb
@@ -267,6 +267,7 @@ module ActionMailer #:nodoc:
helper ActionMailer::MailHelper
extend ActionMailer::DeliveryMethods
+ include ActionMailer::OldApi
include ActionMailer::DeprecatedApi
add_delivery_method :smtp, Mail::SMTP,
diff --git a/actionmailer/lib/action_mailer/deprecated_api.rb b/actionmailer/lib/action_mailer/deprecated_api.rb
index f36b1befd6..530a9c1922 100644
--- a/actionmailer/lib/action_mailer/deprecated_api.rb
+++ b/actionmailer/lib/action_mailer/deprecated_api.rb
@@ -1,78 +1,10 @@
module ActionMailer
- # Part of this API is deprecated and is going to be removed in Rails 3.1 (just check
- # the methods which give you a warning).
- # All the rest will be deprecated after 3.1 release instead, this allows a smoother
- # migration path.
+ # This is the API which is deprecated and is going to be removed on Rails 3.1 release.
+ # Part of the old API will be deprecated after 3.1, for a smoother deprecation process.
+ # Chech those in OldApi instead.
module DeprecatedApi #:nodoc:
extend ActiveSupport::Concern
- included do
- extend ActionMailer::AdvAttrAccessor
-
- @@protected_instance_variables = %w(@parts)
- cattr_reader :protected_instance_variables
-
- # Specify the BCC addresses for the message
- adv_attr_accessor :bcc
-
- # Specify the CC addresses for the message.
- adv_attr_accessor :cc
-
- # Specify the charset to use for the message. This defaults to the
- # +default_charset+ specified for ActionMailer::Base.
- adv_attr_accessor :charset
-
- # Specify the content type for the message. This defaults to <tt>text/plain</tt>
- # in most cases, but can be automatically set in some situations.
- adv_attr_accessor :content_type
-
- # Specify the from address for the message.
- adv_attr_accessor :from
-
- # Specify the address (if different than the "from" address) to direct
- # replies to this message.
- adv_attr_accessor :reply_to
-
- # Specify additional headers to be added to the message.
- adv_attr_accessor :headers
-
- # Specify the order in which parts should be sorted, based on content-type.
- # This defaults to the value for the +default_implicit_parts_order+.
- adv_attr_accessor :implicit_parts_order
-
- # Defaults to "1.0", but may be explicitly given if needed.
- adv_attr_accessor :mime_version
-
- # The recipient addresses for the message, either as a string (for a single
- # address) or an array (for multiple addresses).
- adv_attr_accessor :recipients
-
- # The date on which the message was sent. If not set (the default), the
- # header will be set by the delivery agent.
- adv_attr_accessor :sent_on
-
- # Specify the subject of the message.
- adv_attr_accessor :subject
-
- # Specify the template name to use for current message. This is the "base"
- # template name, without the extension or directory, and may be used to
- # have multiple mailer methods share the same template.
- adv_attr_accessor :template
-
- # Override the mailer name, which defaults to an inflected version of the
- # mailer's class name. If you want to use a template in a non-standard
- # location, you can use this to specify that location.
- adv_attr_accessor :mailer_name
-
- # Define the body of the message. This is either a Hash (in which case it
- # specifies the variables to pass to the template when it is rendered),
- # or a string, in which case it specifies the actual text of the message.
- adv_attr_accessor :body
-
- # Alias controller_path to mailer_name so render :partial in views work.
- alias :controller_path :mailer_name
- end
-
module ClassMethods
# Deliver the given mail object directly. This can be used to deliver
@@ -107,7 +39,7 @@ module ActionMailer
when 'deliver'
ActiveSupport::Deprecation.warn "#{self}.deliver_#{match[2]} is deprecated, " <<
"use #{self}.#{match[2]}.deliver instead", caller[0,2]
- new(match[2], *parameters).deliver
+ new(match[2], *parameters).message.deliver
else super
end
else
@@ -127,6 +59,8 @@ module ActionMailer
# object (from the <tt>create!</tt> method). If no cached mail object exists, and
# no alternate has been given as the parameter, this will fail.
def deliver!(mail = @_message)
+ ActiveSupport::Deprecation.warn "Calling deliver in the AM::Base object is deprecated, " <<
+ "please call deliver in the Mail instance", caller[0,2]
self.class.deliver(mail, false)
end
alias :deliver :deliver!
@@ -143,48 +77,6 @@ module ActionMailer
super
end
- def process(method_name, *args)
- initialize_defaults(method_name)
- super
- unless @mail_was_called
- create_parts
- create_mail
- end
- @_message
- end
-
- # Add a part to a multipart message, with the given content-type. The
- # part itself is yielded to the block so that other properties (charset,
- # body, headers, etc.) can be set on it.
- def part(params)
- params = {:content_type => params} if String === params
-
- if custom_headers = params.delete(:headers)
- params.merge!(custom_headers)
- end
-
- part = Mail::Part.new(params)
-
- yield part if block_given?
- @parts << part
- end
-
- # Add an attachment to a multipart message. This is simply a part with the
- # content-disposition set to "attachment".
- def attachment(params, &block)
- params = { :content_type => params } if String === params
-
- params[:content] ||= params.delete(:data) || params.delete(:body)
-
- if params[:filename]
- params = normalize_file_hash(params)
- else
- params = normalize_nonfile_hash(params)
- end
-
- part(params, &block)
- end
-
# Render a message but does not set it as mail body. Useful for rendering
# data for part and attachments.
#
@@ -201,140 +93,14 @@ module ActionMailer
private
- def normalize_nonfile_hash(params)
- content_disposition = "attachment;"
-
- mime_type = params.delete(:mime_type)
-
- if content_type = params.delete(:content_type)
- content_type = "#{mime_type || content_type};"
- end
-
- params[:body] = params.delete(:data) if params[:data]
-
- { :content_type => content_type,
- :content_disposition => content_disposition }.merge(params)
- end
-
- def normalize_file_hash(params)
- filename = File.basename(params.delete(:filename))
- content_disposition = "attachment; filename=\"#{File.basename(filename)}\""
-
- mime_type = params.delete(:mime_type)
-
- if (content_type = params.delete(:content_type)) && (content_type !~ /filename=/)
- content_type = "#{mime_type || content_type}; filename=\"#{filename}\""
- end
-
- params[:body] = params.delete(:data) if params[:data]
-
- { :content_type => content_type,
- :content_disposition => content_disposition }.merge(params)
- end
-
- def create_mail #:nodoc:
- m = @_message
-
- quote_fields!({:subject => subject, :to => recipients, :from => from,
- :bcc => bcc, :cc => cc, :reply_to => reply_to}, charset)
-
- m.mime_version = mime_version unless mime_version.nil?
- m.date = sent_on.to_time rescue sent_on if sent_on
-
- @headers.each { |k, v| m[k] = v }
-
- real_content_type, ctype_attrs = parse_content_type
- main_type, sub_type = split_content_type(real_content_type)
-
- if @parts.size == 1 && @parts.first.parts.empty?
- m.content_type([main_type, sub_type, ctype_attrs])
- m.body = @parts.first.body.encoded
- else
- @parts.each do |p|
- m.add_part(p)
- end
-
- m.body.set_sort_order(@implicit_parts_order)
- m.body.sort_parts!
-
- if real_content_type =~ /multipart/
- ctype_attrs.delete "charset"
- m.content_type([main_type, sub_type, ctype_attrs])
- end
- end
-
- wrap_delivery_behavior!
- m.content_transfer_encoding = '8bit' unless m.body.only_us_ascii?
-
- @_message
- end
-
- # Set up the default values for the various instance variables of this
- # mailer. Subclasses may override this method to provide different
- # defaults.
- def initialize_defaults(method_name) #:nodoc:
- @charset ||= self.class.default_charset.dup
- @content_type ||= self.class.default_content_type.dup
- @implicit_parts_order ||= self.class.default_implicit_parts_order.dup
- @mime_version ||= self.class.default_mime_version.dup if self.class.default_mime_version
-
- @mailer_name ||= self.class.mailer_name.dup
- @template ||= method_name
- @mail_was_called = false
-
- @parts ||= []
- @headers ||= {}
- @sent_on ||= Time.now
- @body ||= {}
- end
def create_parts #:nodoc:
- if String === @body
- self.response_body = @body
- elsif @body.is_a?(Hash) && !@body.empty?
+ if @body.is_a?(Hash) && !@body.empty?
+ ActiveSupport::Deprecation.warn "Giving a hash to body is deprecated, please use instance variables instead", caller[0,2]
@body.each { |k, v| instance_variable_set(:"@#{k}", v) }
end
- if String === response_body
- @parts.unshift create_inline_part(response_body)
- else
- self.class.template_root.find_all(@template, {}, @mailer_name).each do |template|
- @parts << create_inline_part(render_to_body(:_template => template), template.mime_type)
- end
-
- if @parts.size > 1
- @content_type = "multipart/alternative" if @content_type !~ /^multipart/
- end
-
- # If this is a multipart e-mail add the mime_version if it is not
- # already set.
- @mime_version ||= "1.0" if !@parts.empty?
- end
- end
-
- def create_inline_part(body, mime_type=nil) #:nodoc:
- ct = mime_type || "text/plain"
- main_type, sub_type = split_content_type(ct.to_s)
-
- Mail::Part.new(
- :content_type => [main_type, sub_type, {:charset => charset}],
- :content_disposition => "inline",
- :body => body
- )
- end
-
- def split_content_type(ct) #:nodoc:
- ct.to_s.split("/")
- end
-
- def parse_content_type(defaults=nil) #:nodoc:
- if @content_type.blank?
- [ nil, {} ]
- else
- ctype, *attrs = @content_type.split(/;\s*/)
- attrs = attrs.inject({}) { |h,s| k,v = s.split(/\=/, 2); h[k] = v; h }
- [ctype, {"charset" => @charset}.merge(attrs)]
- end
+ super
end
end
diff --git a/actionmailer/lib/action_mailer/old_api.rb b/actionmailer/lib/action_mailer/old_api.rb
new file mode 100644
index 0000000000..204dc473e8
--- /dev/null
+++ b/actionmailer/lib/action_mailer/old_api.rb
@@ -0,0 +1,250 @@
+module ActionMailer
+ module OldApi
+ extend ActiveSupport::Concern
+
+ included do
+ extend ActionMailer::AdvAttrAccessor
+
+ @@protected_instance_variables = %w(@parts)
+ cattr_reader :protected_instance_variables
+
+ # Specify the BCC addresses for the message
+ adv_attr_accessor :bcc
+
+ # Specify the CC addresses for the message.
+ adv_attr_accessor :cc
+
+ # Specify the charset to use for the message. This defaults to the
+ # +default_charset+ specified for ActionMailer::Base.
+ adv_attr_accessor :charset
+
+ # Specify the content type for the message. This defaults to <tt>text/plain</tt>
+ # in most cases, but can be automatically set in some situations.
+ adv_attr_accessor :content_type
+
+ # Specify the from address for the message.
+ adv_attr_accessor :from
+
+ # Specify the address (if different than the "from" address) to direct
+ # replies to this message.
+ adv_attr_accessor :reply_to
+
+ # Specify additional headers to be added to the message.
+ adv_attr_accessor :headers
+
+ # Specify the order in which parts should be sorted, based on content-type.
+ # This defaults to the value for the +default_implicit_parts_order+.
+ adv_attr_accessor :implicit_parts_order
+
+ # Defaults to "1.0", but may be explicitly given if needed.
+ adv_attr_accessor :mime_version
+
+ # The recipient addresses for the message, either as a string (for a single
+ # address) or an array (for multiple addresses).
+ adv_attr_accessor :recipients
+
+ # The date on which the message was sent. If not set (the default), the
+ # header will be set by the delivery agent.
+ adv_attr_accessor :sent_on
+
+ # Specify the subject of the message.
+ adv_attr_accessor :subject
+
+ # Specify the template name to use for current message. This is the "base"
+ # template name, without the extension or directory, and may be used to
+ # have multiple mailer methods share the same template.
+ adv_attr_accessor :template
+
+ # Override the mailer name, which defaults to an inflected version of the
+ # mailer's class name. If you want to use a template in a non-standard
+ # location, you can use this to specify that location.
+ adv_attr_accessor :mailer_name
+
+ # Define the body of the message. This is either a Hash (in which case it
+ # specifies the variables to pass to the template when it is rendered),
+ # or a string, in which case it specifies the actual text of the message.
+ adv_attr_accessor :body
+
+ # Alias controller_path to mailer_name so render :partial in views work.
+ alias :controller_path :mailer_name
+ end
+
+ def process(method_name, *args)
+ initialize_defaults(method_name)
+ super
+ unless @mail_was_called
+ create_parts
+ create_mail
+ end
+ @_message
+ end
+
+ # Add a part to a multipart message, with the given content-type. The
+ # part itself is yielded to the block so that other properties (charset,
+ # body, headers, etc.) can be set on it.
+ def part(params)
+ params = {:content_type => params} if String === params
+
+ if custom_headers = params.delete(:headers)
+ params.merge!(custom_headers)
+ end
+
+ part = Mail::Part.new(params)
+
+ yield part if block_given?
+ @parts << part
+ end
+
+ # Add an attachment to a multipart message. This is simply a part with the
+ # content-disposition set to "attachment".
+ def attachment(params, &block)
+ params = { :content_type => params } if String === params
+
+ params[:content] ||= params.delete(:data) || params.delete(:body)
+
+ if params[:filename]
+ params = normalize_file_hash(params)
+ else
+ params = normalize_nonfile_hash(params)
+ end
+
+ part(params, &block)
+ end
+
+ protected
+
+ def normalize_nonfile_hash(params)
+ content_disposition = "attachment;"
+
+ mime_type = params.delete(:mime_type)
+
+ if content_type = params.delete(:content_type)
+ content_type = "#{mime_type || content_type};"
+ end
+
+ params[:body] = params.delete(:data) if params[:data]
+
+ { :content_type => content_type,
+ :content_disposition => content_disposition }.merge(params)
+ end
+
+ def normalize_file_hash(params)
+ filename = File.basename(params.delete(:filename))
+ content_disposition = "attachment; filename=\"#{File.basename(filename)}\""
+
+ mime_type = params.delete(:mime_type)
+
+ if (content_type = params.delete(:content_type)) && (content_type !~ /filename=/)
+ content_type = "#{mime_type || content_type}; filename=\"#{filename}\""
+ end
+
+ params[:body] = params.delete(:data) if params[:data]
+
+ { :content_type => content_type,
+ :content_disposition => content_disposition }.merge(params)
+ end
+
+ def create_mail #:nodoc:
+ m = @_message
+
+ quote_fields!({:subject => subject, :to => recipients, :from => from,
+ :bcc => bcc, :cc => cc, :reply_to => reply_to}, charset)
+
+ m.mime_version = mime_version unless mime_version.nil?
+ m.date = sent_on.to_time rescue sent_on if sent_on
+
+ @headers.each { |k, v| m[k] = v }
+
+ real_content_type, ctype_attrs = parse_content_type
+ main_type, sub_type = split_content_type(real_content_type)
+
+ if @parts.size == 1 && @parts.first.parts.empty?
+ m.content_type([main_type, sub_type, ctype_attrs])
+ m.body = @parts.first.body.encoded
+ else
+ @parts.each do |p|
+ m.add_part(p)
+ end
+
+ m.body.set_sort_order(@implicit_parts_order)
+ m.body.sort_parts!
+
+ if real_content_type =~ /multipart/
+ ctype_attrs.delete "charset"
+ m.content_type([main_type, sub_type, ctype_attrs])
+ end
+ end
+
+ wrap_delivery_behavior!
+ m.content_transfer_encoding = '8bit' unless m.body.only_us_ascii?
+
+ @_message
+ end
+
+ # Set up the default values for the various instance variables of this
+ # mailer. Subclasses may override this method to provide different
+ # defaults.
+ def initialize_defaults(method_name) #:nodoc:
+ @charset ||= self.class.default_charset.dup
+ @content_type ||= self.class.default_content_type.dup
+ @implicit_parts_order ||= self.class.default_implicit_parts_order.dup
+ @mime_version ||= self.class.default_mime_version.dup if self.class.default_mime_version
+
+ @mailer_name ||= self.class.mailer_name.dup
+ @template ||= method_name
+ @mail_was_called = false
+
+ @parts ||= []
+ @headers ||= {}
+ @sent_on ||= Time.now
+ @body ||= {}
+ end
+
+ def create_parts #:nodoc:
+ if String === @body
+ self.response_body = @body
+ end
+
+ if String === response_body
+ @parts.unshift create_inline_part(response_body)
+ else
+ self.class.template_root.find_all(@template, {}, @mailer_name).each do |template|
+ @parts << create_inline_part(render_to_body(:_template => template), template.mime_type)
+ end
+
+ if @parts.size > 1
+ @content_type = "multipart/alternative" if @content_type !~ /^multipart/
+ end
+
+ # If this is a multipart e-mail add the mime_version if it is not
+ # already set.
+ @mime_version ||= "1.0" if !@parts.empty?
+ end
+ end
+
+ def create_inline_part(body, mime_type=nil) #:nodoc:
+ ct = mime_type || "text/plain"
+ main_type, sub_type = split_content_type(ct.to_s)
+
+ Mail::Part.new(
+ :content_type => [main_type, sub_type, {:charset => charset}],
+ :content_disposition => "inline",
+ :body => body
+ )
+ end
+
+ def split_content_type(ct) #:nodoc:
+ ct.to_s.split("/")
+ end
+
+ def parse_content_type(defaults=nil) #:nodoc:
+ if @content_type.blank?
+ [ nil, {} ]
+ else
+ ctype, *attrs = @content_type.split(/;\s*/)
+ attrs = attrs.inject({}) { |h,s| k,v = s.split(/\=/, 2); h[k] = v; h }
+ [ctype, {"charset" => @charset}.merge(attrs)]
+ end
+ end
+ end
+end \ No newline at end of file