aboutsummaryrefslogtreecommitdiffstats
path: root/actionmailer
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2009-11-17 22:47:23 +0000
committerPratik Naik <pratiknaik@gmail.com>2009-11-17 22:47:23 +0000
commit5446d5cb05b50a9a3f317ded774be438e0eff909 (patch)
tree6b0b87efe3e95783763208215a3159fb63217a6d /actionmailer
parent9754debb9a72f9385950e5282f3642b995ab76d8 (diff)
parentf8877d4b2a2a6f68770b376f0b1391a6295f62f2 (diff)
downloadrails-5446d5cb05b50a9a3f317ded774be438e0eff909.tar.gz
rails-5446d5cb05b50a9a3f317ded774be438e0eff909.tar.bz2
rails-5446d5cb05b50a9a3f317ded774be438e0eff909.zip
Merge remote branch 'mainstream/master'
Conflicts: activesupport/lib/active_support/core_ext/hash/conversions.rb
Diffstat (limited to 'actionmailer')
-rw-r--r--actionmailer/Rakefile21
-rw-r--r--actionmailer/lib/action_mailer.rb3
-rw-r--r--actionmailer/lib/action_mailer/base.rb315
-rw-r--r--actionmailer/lib/action_mailer/delivery_method.rb57
-rw-r--r--actionmailer/lib/action_mailer/delivery_method/file.rb21
-rw-r--r--actionmailer/lib/action_mailer/delivery_method/sendmail.rb22
-rw-r--r--actionmailer/lib/action_mailer/delivery_method/smtp.rb31
-rw-r--r--actionmailer/lib/action_mailer/delivery_method/test.rb12
-rw-r--r--actionmailer/lib/action_mailer/deprecated_body.rb44
-rw-r--r--actionmailer/lib/action_mailer/helpers.rb114
-rw-r--r--actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb2
-rw-r--r--actionmailer/test/abstract_unit.rb16
-rw-r--r--actionmailer/test/delivery_method_test.rb36
-rw-r--r--actionmailer/test/mail_helper_test.rb21
-rw-r--r--actionmailer/test/mail_layout_test.rb8
-rw-r--r--actionmailer/test/mail_render_test.rb26
-rw-r--r--actionmailer/test/mail_service_test.rb156
-rw-r--r--actionmailer/test/test_helper_test.rb6
-rw-r--r--actionmailer/test/url_test.rb44
19 files changed, 494 insertions, 461 deletions
diff --git a/actionmailer/Rakefile b/actionmailer/Rakefile
index a756f35ee8..1a7ece5068 100644
--- a/actionmailer/Rakefile
+++ b/actionmailer/Rakefile
@@ -24,14 +24,16 @@ Rake::TestTask.new { |t|
t.libs << "test"
t.pattern = 'test/*_test.rb'
t.verbose = true
- t.warning = false
+ t.warning = true
}
-task :isolated_test do
- ruby = File.join(*RbConfig::CONFIG.values_at('bindir', 'RUBY_INSTALL_NAME'))
- Dir.glob("test/*_test.rb").all? do |file|
- system(ruby, '-Ilib:test', file)
- end or raise "Failures"
+namespace :test do
+ task :isolated do
+ ruby = File.join(*RbConfig::CONFIG.values_at('bindir', 'RUBY_INSTALL_NAME'))
+ Dir.glob("test/*_test.rb").all? do |file|
+ system(ruby, '-Ilib:test', file)
+ end or raise "Failures"
+ end
end
# Generate the RDoc documentation
@@ -44,25 +46,24 @@ Rake::RDocTask.new { |rdoc|
rdoc.rdoc_files.include('README', 'CHANGELOG')
rdoc.rdoc_files.include('lib/action_mailer.rb')
rdoc.rdoc_files.include('lib/action_mailer/*.rb')
+ rdoc.rdoc_files.include('lib/action_mailer/delivery_method/*.rb')
}
spec = eval(File.read('actionmailer.gemspec'))
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
- p.need_tar = true
- p.need_zip = true
end
desc "Publish the API documentation"
-task :pgem => [:package] do
+task :pgem => [:package] do
require 'rake/contrib/sshpublisher'
Rake::SshFilePublisher.new("gems.rubyonrails.org", "/u/sites/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
`ssh gems.rubyonrails.org '/u/sites/gems/gemupdate.sh'`
end
desc "Publish the API documentation"
-task :pdoc => [:rdoc] do
+task :pdoc => [:rdoc] do
require 'rake/contrib/sshpublisher'
Rake::SshDirPublisher.new("wrath.rubyonrails.org", "public_html/am", "doc").upload
end
diff --git a/actionmailer/lib/action_mailer.rb b/actionmailer/lib/action_mailer.rb
index a427376579..23f04a11ba 100644
--- a/actionmailer/lib/action_mailer.rb
+++ b/actionmailer/lib/action_mailer.rb
@@ -32,8 +32,9 @@ module ActionMailer
end
autoload :AdvAttrAccessor, 'action_mailer/adv_attr_accessor'
+ autoload :DeprecatedBody, 'action_mailer/deprecated_body'
autoload :Base, 'action_mailer/base'
- autoload :Helpers, 'action_mailer/helpers'
+ autoload :DeliveryMethod, 'action_mailer/delivery_method'
autoload :Part, 'action_mailer/part'
autoload :PartContainer, 'action_mailer/part_container'
autoload :Quoting, 'action_mailer/quoting'
diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb
index eb648d249a..dfa1b6444b 100644
--- a/actionmailer/lib/action_mailer/base.rb
+++ b/actionmailer/lib/action_mailer/base.rb
@@ -1,8 +1,4 @@
-require 'tmpdir'
-
-require "active_support/core_ext/class"
-# Use the old layouts until actionmailer gets refactored
-require "action_controller/legacy/layout"
+require 'active_support/core_ext/class'
module ActionMailer #:nodoc:
# Action Mailer allows you to send email from your application using a mailer model and views.
@@ -232,7 +228,7 @@ module ActionMailer #:nodoc:
# * <tt>raise_delivery_errors</tt> - Whether or not errors should be raised if the email fails to be delivered.
#
# * <tt>delivery_method</tt> - Defines a delivery method. Possible values are <tt>:smtp</tt> (default), <tt>:sendmail</tt>, <tt>:test</tt>,
- # and <tt>:file</tt>.
+ # and <tt>:file</tt>. Or you may provide a custom delivery method object eg. MyOwnDeliveryMethodClass.new
#
# * <tt>perform_deliveries</tt> - Determines whether <tt>deliver_*</tt> methods are actually carried out. By default they are,
# but this can be turned off to help functional testing.
@@ -256,13 +252,20 @@ module ActionMailer #:nodoc:
# +implicit_parts_order+.
class Base
include AdvAttrAccessor, PartContainer, Quoting, Utils
- extend AbstractController::RenderingController
+
+ include AbstractController::RenderingController
+ include AbstractController::LocalizedCache
+ include AbstractController::Layouts
+
+ include AbstractController::Helpers
+ helper MailHelper
if Object.const_defined?(:ActionController)
include ActionController::UrlWriter
- include ActionController::Layout
end
+ include ActionMailer::DeprecatedBody
+
private_class_method :new #:nodoc:
class_inheritable_accessor :view_paths
@@ -270,35 +273,9 @@ module ActionMailer #:nodoc:
cattr_accessor :logger
- @@smtp_settings = {
- :address => "localhost",
- :port => 25,
- :domain => 'localhost.localdomain',
- :user_name => nil,
- :password => nil,
- :authentication => nil,
- :enable_starttls_auto => true,
- }
- cattr_accessor :smtp_settings
-
- @@sendmail_settings = {
- :location => '/usr/sbin/sendmail',
- :arguments => '-i -t'
- }
- cattr_accessor :sendmail_settings
-
- @@file_settings = {
- :location => defined?(Rails) ? "#{Rails.root}/tmp/mails" : "#{Dir.tmpdir}/mails"
- }
-
- cattr_accessor :file_settings
-
@@raise_delivery_errors = true
cattr_accessor :raise_delivery_errors
- superclass_delegating_accessor :delivery_method
- self.delivery_method = :smtp
-
@@perform_deliveries = true
cattr_accessor :perform_deliveries
@@ -317,17 +294,12 @@ module ActionMailer #:nodoc:
@@default_implicit_parts_order = [ "text/html", "text/enriched", "text/plain" ]
cattr_accessor :default_implicit_parts_order
+ @@protected_instance_variables = []
cattr_reader :protected_instance_variables
- @@protected_instance_variables = %w(@body)
# Specify the BCC addresses for the message
adv_attr_accessor :bcc
- # 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
-
# Specify the CC addresses for the message.
adv_attr_accessor :cc
@@ -372,43 +344,42 @@ module ActionMailer #:nodoc:
# have multiple mailer methods share the same template.
adv_attr_accessor :template
+ # The mail and action_name instances referenced by this mailer.
+ attr_reader :mail, :action_name
+
+ # Where the response body is stored.
+ attr_internal :response_body
+
# 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.
+ attr_writer :mailer_name
+
def mailer_name(value = nil)
if value
- self.mailer_name = value
+ @mailer_name = value
else
- self.class.mailer_name
+ @mailer_name || self.class.mailer_name
end
end
- def mailer_name=(value)
- self.class.mailer_name = value
- end
-
- # The mail object instance referenced by this mailer.
- attr_reader :mail
- attr_reader :template_name, :default_template_name, :action_name
-
- def controller_path
- self.class.controller_path
- end
-
- def formats
- @template.formats
- end
+ # Alias controller_path to mailer_name so render :partial in views work.
+ alias :controller_path :mailer_name
class << self
attr_writer :mailer_name
+ delegate :settings, :settings=, :to => ActionMailer::DeliveryMethod::File, :prefix => :file
+ delegate :settings, :settings=, :to => ActionMailer::DeliveryMethod::Sendmail, :prefix => :sendmail
+ delegate :settings, :settings=, :to => ActionMailer::DeliveryMethod::Smtp, :prefix => :smtp
+
def mailer_name
@mailer_name ||= name.underscore
end
- # for ActionView compatibility
- alias_method :controller_name, :mailer_name
- alias_method :controller_path, :mailer_name
+ def delivery_method=(method_name)
+ @delivery_method = ActionMailer::DeliveryMethod.lookup_method(method_name)
+ end
def respond_to?(method_symbol, include_private = false) #:nodoc:
matches_dynamic_method?(method_symbol) || super
@@ -459,6 +430,7 @@ module ActionMailer #:nodoc:
self.view_paths && self.view_paths.first
end
+ # Should template root overwrite the whole view_paths?
def template_root=(root)
self.view_paths = ActionView::Base.process_view_paths(root)
end
@@ -470,73 +442,36 @@ module ActionMailer #:nodoc:
end
end
+ # Configure delivery method. Check ActionMailer::DeliveryMethod for more
+ # instructions.
+ superclass_delegating_reader :delivery_method
+ self.delivery_method = :smtp
+
# Instantiate a new mailer object. If +method_name+ is not +nil+, the mailer
# will be initialized according to the named method. If not, the mailer will
# remain uninitialized (useful when you only need to invoke the "receive"
# method, for instance).
def initialize(method_name=nil, *parameters) #:nodoc:
+ @_response_body = nil
+ super()
create!(method_name, *parameters) if method_name
end
# Initialize the mailer via the given +method_name+. The body will be
# rendered and a new TMail::Mail object created.
def create!(method_name, *parameters) #:nodoc:
- ActiveSupport::Orchestra.instrument(:create_mail, :name => method_name) do
- initialize_defaults(method_name)
- __send__(method_name, *parameters)
-
- # If an explicit, textual body has not been set, we check assumptions.
- unless String === @body
- # First, we look to see if there are any likely templates that match,
- # which include the content-type in their file name (i.e.,
- # "the_template_file.text.html.erb", etc.). Only do this if parts
- # have not already been specified manually.
- # if @parts.empty?
- template_root.find_all(@template, {}, template_path).each do |template|
- @parts << Part.new(
- :content_type => template.mime_type ? template.mime_type.to_s : "text/plain",
- :disposition => "inline",
- :charset => charset,
- :body => render_template(template, @body)
- )
- end
-
- if @parts.size > 1
- @content_type = "multipart/alternative" if @content_type !~ /^multipart/
- @parts = sort_parts(@parts, @implicit_parts_order)
- end
- # end
-
- # Then, if there were such templates, we check to see if we ought to
- # also render a "normal" template (without the content type). If a
- # normal template exists (or if there were no implicit parts) we render
- # it.
- # ====
- # TODO: Revisit this
- # template_exists = @parts.empty?
- # template_exists ||= template_root.find("#{mailer_name}/#{@template}")
- # @body = render_message(@template, @body) if template_exists
-
- # Finally, if there are other message parts and a textual body exists,
- # we shift it onto the front of the parts and set the body to nil (so
- # that create_mail doesn't try to render it in addition to the parts).
- # ====
- # TODO: Revisit this
- # if !@parts.empty? && String === @body
- # @parts.unshift Part.new(:charset => charset, :body => @body)
- # @body = nil
- # end
- end
+ initialize_defaults(method_name)
+ __send__(method_name, *parameters)
- # If this is a multipart e-mail add the mime_version if it is not
- # already set.
- @mime_version ||= "1.0" if !@parts.empty?
+ # Create e-mail parts
+ create_parts
- # build the mail object itself
- @mail = create_mail
- end
+ # Set the subject if not set yet
+ @subject ||= I18n.t(:subject, :scope => [:actionmailer, mailer_name, method_name],
+ :default => method_name.humanize)
- @mail
+ # build the mail object itself
+ @mail = create_mail
end
# Delivers a TMail::Mail object. By default, it delivers the cached mail
@@ -545,14 +480,14 @@ module ActionMailer #:nodoc:
def deliver!(mail = @mail)
raise "no mail object available for delivery!" unless mail
- unless logger.nil?
+ if logger
logger.info "Sent mail to #{Array(recipients).join(', ')}"
logger.debug "\n#{mail.encoded}"
end
- ActiveSupport::Orchestra.instrument(:deliver_mail, :mail => @mail) do
+ ActiveSupport::Notifications.instrument(:deliver_mail, :mail => @mail) do
begin
- __send__("perform_delivery_#{delivery_method}", mail) if perform_deliveries
+ self.delivery_method.perform_delivery(mail) if perform_deliveries
rescue Exception => e # Net::SMTP errors or sendmail pipe errors
raise e if raise_delivery_errors
end
@@ -562,93 +497,61 @@ module ActionMailer #:nodoc:
end
private
+
# 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)
- @charset ||= @@default_charset.dup
- @content_type ||= @@default_content_type.dup
+ @charset ||= @@default_charset.dup
+ @content_type ||= @@default_content_type.dup
@implicit_parts_order ||= @@default_implicit_parts_order.dup
- @template ||= method_name
- @default_template_name = @action_name = @template
- @mailer_name ||= self.class.name.underscore
- @parts ||= []
+ @mime_version ||= @@default_mime_version.dup if @@default_mime_version
+
+ @mailer_name ||= self.class.mailer_name
+ @template ||= method_name
+ @action_name = @template
+
+ @parts ||= []
@headers ||= {}
- @body ||= {}
- @mime_version = @@default_mime_version.dup if @@default_mime_version
@sent_on ||= Time.now
- end
- def render_template(template, body)
- if template.respond_to?(:mime_type)
- @current_template_content_type = template.mime_type && template.mime_type.to_sym.to_s
- end
-
- @template = initialize_template_class(body)
- layout = _pick_layout(layout, true) unless
- ActionController::Base.exempt_from_layout.include?(template.handler)
- @template._render_template(template, layout, {})
- ensure
- @current_template_content_type = nil
+ super # Run deprecation hooks
end
- def render_message(method_name, body)
- render :file => method_name, :body => body
- ensure
- @current_template_content_type = nil
- end
+ def create_parts
+ super # Run deprecation hooks
- def render(opts)
- layout, file = opts.delete(:layout), opts[:file]
-
- begin
- @template = initialize_template_class(opts.delete(:body))
-
- if file
- prefix = mailer_name unless file =~ /\//
- template = view_paths.find(file, {:formats => formats}, prefix)
+ if String === response_body
+ @parts.unshift Part.new(
+ :content_type => "text/plain",
+ :disposition => "inline",
+ :charset => charset,
+ :body => response_body
+ )
+ else
+ self.class.template_root.find_all(@template, {}, mailer_name).each do |template|
+ @parts << Part.new(
+ :content_type => template.mime_type ? template.mime_type.to_s : "text/plain",
+ :disposition => "inline",
+ :charset => charset,
+ :body => render_to_body(:_template => template)
+ )
end
- layout = _pick_layout(layout,
- !template || ActionController::Base.exempt_from_layout.include?(template.handler))
-
- if template
- @template._render_template(template, layout, opts)
- elsif inline = opts[:inline]
- @template._render_inline(inline, layout, opts)
+ if @parts.size > 1
+ @content_type = "multipart/alternative" if @content_type !~ /^multipart/
+ @parts = sort_parts(@parts, @implicit_parts_order)
end
- end
- end
- def default_template_format
- if @current_template_content_type
- Mime::Type.lookup(@current_template_content_type).to_sym
- else
- :html
+ # 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 template_root
- self.class.template_root
- end
-
- def template_root=(root)
- self.class.template_root = root
- end
-
- def template_path
- "#{mailer_name}"
- end
-
- def initialize_template_class(assigns)
- template = ActionView::Base.new(self.class.view_paths, assigns, self)
- template.formats = [default_template_format]
- template
- end
-
def sort_parts(parts, order = [])
order = order.collect { |s| s.downcase }
-
+
parts = parts.sort do |a, b|
a_ct = a.content_type.downcase
b_ct = b.content_type.downcase
@@ -697,14 +600,6 @@ module ActionMailer #:nodoc:
m.set_content_type(real_content_type, nil, ctype_attrs)
m.body = normalize_new_lines(@parts.first.body)
else
- if String === body
- part = TMail::Mail.new
- part.body = normalize_new_lines(body)
- part.set_content_type(real_content_type, nil, ctype_attrs)
- part.set_content_disposition "inline"
- m.parts << part
- end
-
@parts.each do |p|
part = (TMail::Mail === p ? p : p.to_mail(self))
m.parts << part
@@ -719,43 +614,5 @@ module ActionMailer #:nodoc:
@mail = m
end
- def perform_delivery_smtp(mail)
- destinations = mail.destinations
- mail.ready_to_send
- sender = (mail['return-path'] && mail['return-path'].spec) || mail['from']
-
- smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
- smtp.enable_starttls_auto if smtp_settings[:enable_starttls_auto] && smtp.respond_to?(:enable_starttls_auto)
- smtp.start(smtp_settings[:domain], smtp_settings[:user_name], smtp_settings[:password],
- smtp_settings[:authentication]) do |smtp|
- smtp.sendmail(mail.encoded, sender, destinations)
- end
- end
-
- def perform_delivery_sendmail(mail)
- sendmail_args = sendmail_settings[:arguments]
- sendmail_args += " -f \"#{mail['return-path']}\"" if mail['return-path']
- IO.popen("#{sendmail_settings[:location]} #{sendmail_args}","w+") do |sm|
- sm.print(mail.encoded.gsub(/\r/, ''))
- sm.flush
- end
- end
-
- def perform_delivery_test(mail)
- deliveries << mail
- end
-
- def perform_delivery_file(mail)
- FileUtils.mkdir_p file_settings[:location]
-
- (mail.to + mail.cc + mail.bcc).uniq.each do |to|
- File.open(File.join(file_settings[:location], to), 'a') { |f| f.write(mail) }
- end
- end
- end
-
- Base.class_eval do
- include Helpers
- helper MailHelper
end
end
diff --git a/actionmailer/lib/action_mailer/delivery_method.rb b/actionmailer/lib/action_mailer/delivery_method.rb
new file mode 100644
index 0000000000..29a51afdc3
--- /dev/null
+++ b/actionmailer/lib/action_mailer/delivery_method.rb
@@ -0,0 +1,57 @@
+require "active_support/core_ext/class"
+module ActionMailer
+ module DeliveryMethod
+
+ autoload :File, 'action_mailer/delivery_method/file'
+ autoload :Sendmail, 'action_mailer/delivery_method/sendmail'
+ autoload :Smtp, 'action_mailer/delivery_method/smtp'
+ autoload :Test, 'action_mailer/delivery_method/test'
+
+ # Creates a new DeliveryMethod object according to the given options.
+ #
+ # If no arguments are passed to this method, then a new
+ # ActionMailer::DeliveryMethod::Stmp object will be returned.
+ #
+ # If you pass a Symbol as the first argument, then a corresponding
+ # delivery method class under the ActionMailer::DeliveryMethod namespace
+ # will be created.
+ # For example:
+ #
+ # ActionMailer::DeliveryMethod.lookup_method(:sendmail)
+ # # => returns a new ActionMailer::DeliveryMethod::Sendmail object
+ #
+ # If the first argument is not a Symbol, then it will simply be returned:
+ #
+ # ActionMailer::DeliveryMethod.lookup_method(MyOwnDeliveryMethod.new)
+ # # => returns MyOwnDeliveryMethod.new
+ def self.lookup_method(delivery_method)
+ case delivery_method
+ when Symbol
+ method_name = delivery_method.to_s.camelize
+ method_class = ActionMailer::DeliveryMethod.const_get(method_name)
+ method_class.new
+ when nil # default
+ Smtp.new
+ else
+ delivery_method
+ end
+ end
+
+ # An abstract delivery method class. There are multiple delivery method classes.
+ # See the classes under the ActionMailer::DeliveryMethod, e.g.
+ # ActionMailer::DeliveryMethod::Smtp.
+ # Smtp is the default delivery method for production
+ # while Test is used in testing.
+ #
+ # each delivery method exposes just one method
+ #
+ # delivery_method = ActionMailer::DeliveryMethod::Smtp.new
+ # delivery_method.perform_delivery(mail) # send the mail via smtp
+ #
+ class Method
+ superclass_delegating_accessor :settings
+ self.settings = {}
+ end
+
+ end
+end
diff --git a/actionmailer/lib/action_mailer/delivery_method/file.rb b/actionmailer/lib/action_mailer/delivery_method/file.rb
new file mode 100644
index 0000000000..587ae37ffa
--- /dev/null
+++ b/actionmailer/lib/action_mailer/delivery_method/file.rb
@@ -0,0 +1,21 @@
+require 'tmpdir'
+
+module ActionMailer
+ module DeliveryMethod
+
+ # A delivery method implementation which writes all mails to a file.
+ class File < Method
+ self.settings = {
+ :location => defined?(Rails) ? "#{Rails.root}/tmp/mails" : "#{Dir.tmpdir}/mails"
+ }
+
+ def perform_delivery(mail)
+ FileUtils.mkdir_p settings[:location]
+
+ (mail.to + mail.cc + mail.bcc).uniq.each do |to|
+ ::File.open(::File.join(settings[:location], to), 'a') { |f| f.write(mail) }
+ end
+ end
+ end
+ end
+end
diff --git a/actionmailer/lib/action_mailer/delivery_method/sendmail.rb b/actionmailer/lib/action_mailer/delivery_method/sendmail.rb
new file mode 100644
index 0000000000..db55af79f1
--- /dev/null
+++ b/actionmailer/lib/action_mailer/delivery_method/sendmail.rb
@@ -0,0 +1,22 @@
+module ActionMailer
+ module DeliveryMethod
+
+ # A delivery method implementation which sends via sendmail.
+ class Sendmail < Method
+ self.settings = {
+ :location => '/usr/sbin/sendmail',
+ :arguments => '-i -t'
+ }
+
+ def perform_delivery(mail)
+ sendmail_args = settings[:arguments]
+ sendmail_args += " -f \"#{mail['return-path']}\"" if mail['return-path']
+ IO.popen("#{settings[:location]} #{sendmail_args}","w+") do |sm|
+ sm.print(mail.encoded.gsub(/\r/, ''))
+ sm.flush
+ end
+ end
+ end
+
+ end
+end
diff --git a/actionmailer/lib/action_mailer/delivery_method/smtp.rb b/actionmailer/lib/action_mailer/delivery_method/smtp.rb
new file mode 100644
index 0000000000..86b0ae8329
--- /dev/null
+++ b/actionmailer/lib/action_mailer/delivery_method/smtp.rb
@@ -0,0 +1,31 @@
+module ActionMailer
+ module DeliveryMethod
+ # A delivery method implementation which sends via smtp.
+ class Smtp < Method
+
+ self.settings = {
+ :address => "localhost",
+ :port => 25,
+ :domain => 'localhost.localdomain',
+ :user_name => nil,
+ :password => nil,
+ :authentication => nil,
+ :enable_starttls_auto => true,
+ }
+
+ def perform_delivery(mail)
+ destinations = mail.destinations
+ mail.ready_to_send
+ sender = (mail['return-path'] && mail['return-path'].spec) || mail['from']
+
+ smtp = Net::SMTP.new(settings[:address], settings[:port])
+ smtp.enable_starttls_auto if settings[:enable_starttls_auto] && smtp.respond_to?(:enable_starttls_auto)
+ smtp.start(settings[:domain], settings[:user_name], settings[:password],
+ settings[:authentication]) do |smtp|
+ smtp.sendmail(mail.encoded, sender, destinations)
+ end
+ end
+ end
+
+ end
+end
diff --git a/actionmailer/lib/action_mailer/delivery_method/test.rb b/actionmailer/lib/action_mailer/delivery_method/test.rb
new file mode 100644
index 0000000000..6e3239d52a
--- /dev/null
+++ b/actionmailer/lib/action_mailer/delivery_method/test.rb
@@ -0,0 +1,12 @@
+module ActionMailer
+ module DeliveryMethod
+
+ # A delivery method implementation designed for testing, which just appends each record to the :deliveries array
+ class Test < Method
+ def perform_delivery(mail)
+ ActionMailer::Base.deliveries << mail
+ end
+ end
+
+ end
+end
diff --git a/actionmailer/lib/action_mailer/deprecated_body.rb b/actionmailer/lib/action_mailer/deprecated_body.rb
new file mode 100644
index 0000000000..50ff262432
--- /dev/null
+++ b/actionmailer/lib/action_mailer/deprecated_body.rb
@@ -0,0 +1,44 @@
+module ActionMailer
+ # TODO Remove this module all together in a next release. Ensure that super
+ # hooks in ActionMailer::Base are removed as well.
+ module DeprecatedBody
+ def self.included(base)
+ base.class_eval do
+ # 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
+ end
+ end
+
+ def initialize_defaults(method_name)
+ @body ||= {}
+ end
+
+ def create_parts
+ if String === @body
+ ActiveSupport::Deprecation.warn('body is deprecated. To set the body with a text ' <<
+ 'call render(:text => "body").', caller[0,10])
+ self.response_body = @body
+ elsif @body.is_a?(Hash) && !@body.empty?
+ ActiveSupport::Deprecation.warn('body is deprecated. To set assigns simply ' <<
+ 'use instance variables', caller[0,10])
+ @body.each { |k, v| instance_variable_set(:"@#{k}", v) }
+ end
+ end
+
+ def render(*args)
+ options = args.last.is_a?(Hash) ? args.last : {}
+ if options[:body]
+ ActiveSupport::Deprecation.warn(':body is deprecated. To set assigns simply ' <<
+ 'use instance variables', caller[0,1])
+
+ options.delete(:body).each do |k, v|
+ instance_variable_set(:"@#{k}", v)
+ end
+ end
+
+ super
+ end
+ end
+end
diff --git a/actionmailer/lib/action_mailer/helpers.rb b/actionmailer/lib/action_mailer/helpers.rb
deleted file mode 100644
index ecd8f0f5b6..0000000000
--- a/actionmailer/lib/action_mailer/helpers.rb
+++ /dev/null
@@ -1,114 +0,0 @@
-require 'active_support/dependencies'
-
-module ActionMailer
- module Helpers #:nodoc:
- def self.included(base) #:nodoc:
- # Initialize the base module to aggregate its helpers.
- base.class_inheritable_accessor :master_helper_module
- base.master_helper_module = Module.new
-
- # Extend base with class methods to declare helpers.
- base.extend(ClassMethods)
-
- base.class_eval do
- # Wrap inherited to create a new master helper module for subclasses.
- class << self
- alias_method_chain :inherited, :helper
- end
-
- # Wrap initialize_template_class to extend new template class
- # instances with the master helper module.
- alias_method_chain :initialize_template_class, :helper
- end
- end
-
- module ClassMethods
- # Makes all the (instance) methods in the helper module available to templates rendered through this controller.
- # See ActionView::Helpers (link:classes/ActionView/Helpers.html) for more about making your own helper modules
- # available to the templates.
- def add_template_helper(helper_module) #:nodoc:
- master_helper_module.module_eval "include #{helper_module}"
- end
-
- # Declare a helper:
- # helper :foo
- # requires 'foo_helper' and includes FooHelper in the template class.
- # helper FooHelper
- # includes FooHelper in the template class.
- # helper { def foo() "#{bar} is the very best" end }
- # evaluates the block in the template class, adding method +foo+.
- # helper(:three, BlindHelper) { def mice() 'mice' end }
- # does all three.
- def helper(*args, &block)
- args.flatten.each do |arg|
- case arg
- when Module
- add_template_helper(arg)
- when String, Symbol
- file_name = arg.to_s.underscore + '_helper'
- class_name = file_name.camelize
-
- require_dependency(file_name, "Missing helper file helpers/%s.rb")
- # begin
- # require_dependency(file_name)
- # rescue LoadError => load_error
- # requiree = / -- (.*?)(\.rb)?$/.match(load_error.message).to_a[1]
- # msg = (requiree == file_name) ? "Missing helper file helpers/#{file_name}.rb" : "Can't load file: #{requiree}"
- # raise LoadError.new(msg).copy_blame!(load_error)
- # end
-
- add_template_helper(class_name.constantize)
- else
- raise ArgumentError, 'helper expects String, Symbol, or Module argument'
- end
- end
-
- # Evaluate block in template class if given.
- master_helper_module.module_eval(&block) if block_given?
- end
-
- # Declare a controller method as a helper. For example,
- # helper_method :link_to
- # def link_to(name, options) ... end
- # makes the link_to controller method available in the view.
- def helper_method(*methods)
- methods.flatten.each do |method|
- master_helper_module.module_eval <<-end_eval
- def #{method}(*args, &block)
- controller.__send__(%(#{method}), *args, &block)
- end
- end_eval
- end
- end
-
- # Declare a controller attribute as a helper. For example,
- # helper_attr :name
- # attr_accessor :name
- # makes the name and name= controller methods available in the view.
- # The is a convenience wrapper for helper_method.
- def helper_attr(*attrs)
- attrs.flatten.each { |attr| helper_method(attr, "#{attr}=") }
- end
-
- private
- def inherited_with_helper(child)
- inherited_without_helper(child)
- begin
- child.master_helper_module = Module.new
- child.master_helper_module.__send__(:include, master_helper_module)
- child.helper child.name.to_s.underscore
- rescue MissingSourceFile => e
- raise unless e.is_missing?("#{child.name.to_s.underscore}_helper")
- end
- end
- end
-
- private
- # Extend the template class instance with our controller's helper module.
- def initialize_template_class_with_helper(assigns)
- initialize_template_class_without_helper(assigns).tap do |template|
- template.extend self.class.master_helper_module
- end
- end
- end
-end
diff --git a/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb b/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb
index ab1a828471..0ddc525213 100644
--- a/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb
+++ b/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb
@@ -43,6 +43,7 @@ module Racc
class Parser
+ old_verbose, $VERBOSE = $VERBOSE, nil
Racc_Runtime_Version = '1.4.5'
Racc_Runtime_Revision = '$Revision: 1.7 $'.split[1]
@@ -71,6 +72,7 @@ module Racc
Racc_Runtime_Core_Revision = Racc_Runtime_Core_Revision_R
Racc_Runtime_Type = 'ruby'
end
+ $VERBOSE = old_verbose
def Parser.racc_runtime_type
Racc_Runtime_Type
diff --git a/actionmailer/test/abstract_unit.rb b/actionmailer/test/abstract_unit.rb
index 3d4d0fb995..e84b3b0d23 100644
--- a/actionmailer/test/abstract_unit.rb
+++ b/actionmailer/test/abstract_unit.rb
@@ -1,9 +1,17 @@
+root = File.expand_path('../../..', __FILE__)
+begin
+ require "#{root}/vendor/gems/environment"
+rescue LoadError
+ $:.unshift("#{root}/activesupport/lib")
+ $:.unshift("#{root}/actionpack/lib")
+end
+
+lib = File.expand_path("#{File.dirname(__FILE__)}/../lib")
+$:.unshift(lib) unless $:.include?('lib') || $:.include?(lib)
+
require 'rubygems'
require 'test/unit'
-$:.unshift "#{File.dirname(__FILE__)}/../lib"
-$:.unshift "#{File.dirname(__FILE__)}/../../activesupport/lib"
-$:.unshift "#{File.dirname(__FILE__)}/../../actionpack/lib"
require 'action_mailer'
require 'action_mailer/test_case'
@@ -14,6 +22,8 @@ ActiveSupport::Deprecation.debug = true
ActionView::Template.register_template_handler :haml, lambda { |template| "Look its HAML!".inspect }
ActionView::Template.register_template_handler :bak, lambda { |template| "Lame backup".inspect }
+ActionView::Base::DEFAULT_CONFIG = { :assets_dir => '/nowhere' }
+
$:.unshift "#{File.dirname(__FILE__)}/fixtures/helpers"
FIXTURE_LOAD_PATH = File.join(File.dirname(__FILE__), 'fixtures')
diff --git a/actionmailer/test/delivery_method_test.rb b/actionmailer/test/delivery_method_test.rb
index 1b8c3ba523..8f8c6b0275 100644
--- a/actionmailer/test/delivery_method_test.rb
+++ b/actionmailer/test/delivery_method_test.rb
@@ -11,6 +11,21 @@ class FileDeliveryMethodMailer < ActionMailer::Base
self.delivery_method = :file
end
+class CustomDeliveryMethod
+ attr_accessor :custom_deliveries
+ def initialize()
+ @customer_deliveries = []
+ end
+
+ def self.perform_delivery(mail)
+ self.custom_deliveries << mail
+ end
+end
+
+class CustomerDeliveryMailer < ActionMailer::Base
+ self.delivery_method = CustomDeliveryMethod.new
+end
+
class ActionMailerBase_delivery_method_Test < Test::Unit::TestCase
def setup
set_delivery_method :smtp
@@ -21,7 +36,7 @@ class ActionMailerBase_delivery_method_Test < Test::Unit::TestCase
end
def test_should_be_the_default_smtp
- assert_equal :smtp, ActionMailer::Base.delivery_method
+ assert_instance_of ActionMailer::DeliveryMethod::Smtp, ActionMailer::Base.delivery_method
end
end
@@ -35,7 +50,7 @@ class DefaultDeliveryMethodMailer_delivery_method_Test < Test::Unit::TestCase
end
def test_should_be_the_default_smtp
- assert_equal :smtp, DefaultDeliveryMethodMailer.delivery_method
+ assert_instance_of ActionMailer::DeliveryMethod::Smtp, DefaultDeliveryMethodMailer.delivery_method
end
end
@@ -49,7 +64,7 @@ class NonDefaultDeliveryMethodMailer_delivery_method_Test < Test::Unit::TestCase
end
def test_should_be_the_set_delivery_method
- assert_equal :sendmail, NonDefaultDeliveryMethodMailer.delivery_method
+ assert_instance_of ActionMailer::DeliveryMethod::Sendmail, NonDefaultDeliveryMethodMailer.delivery_method
end
end
@@ -63,7 +78,7 @@ class FileDeliveryMethodMailer_delivery_method_Test < Test::Unit::TestCase
end
def test_should_be_the_set_delivery_method
- assert_equal :file, FileDeliveryMethodMailer.delivery_method
+ assert_instance_of ActionMailer::DeliveryMethod::File, FileDeliveryMethodMailer.delivery_method
end
def test_should_default_location_to_the_tmpdir
@@ -71,3 +86,16 @@ class FileDeliveryMethodMailer_delivery_method_Test < Test::Unit::TestCase
end
end
+class CustomDeliveryMethodMailer_delivery_method_Test < Test::Unit::TestCase
+ def setup
+ set_delivery_method :smtp
+ end
+
+ def teardown
+ restore_delivery_method
+ end
+
+ def test_should_be_the_set_delivery_method
+ assert_instance_of CustomDeliveryMethod, CustomerDeliveryMailer.delivery_method
+ end
+end
diff --git a/actionmailer/test/mail_helper_test.rb b/actionmailer/test/mail_helper_test.rb
index e94aeff074..f8b002e0a7 100644
--- a/actionmailer/test/mail_helper_test.rb
+++ b/actionmailer/test/mail_helper_test.rb
@@ -20,28 +20,29 @@ class HelperMailer < ActionMailer::Base
recipients recipient
subject "using helpers"
from "tester@example.com"
- self.body = { :text => "emphasize me!" }
+
+ @text = "emphasize me!"
end
def use_mail_helper(recipient)
recipients recipient
subject "using mailing helpers"
from "tester@example.com"
- self.body = { :text =>
- "But soft! What light through yonder window breaks? It is the east, " +
- "and Juliet is the sun. Arise, fair sun, and kill the envious moon, " +
- "which is sick and pale with grief that thou, her maid, art far more " +
- "fair than she. Be not her maid, for she is envious! Her vestal " +
- "livery is but sick and green, and none but fools do wear it. Cast " +
- "it off!"
- }
+
+ @text = "But soft! What light through yonder window breaks? It is the east, " +
+ "and Juliet is the sun. Arise, fair sun, and kill the envious moon, " +
+ "which is sick and pale with grief that thou, her maid, art far more " +
+ "fair than she. Be not her maid, for she is envious! Her vestal " +
+ "livery is but sick and green, and none but fools do wear it. Cast " +
+ "it off!"
end
def use_helper_method(recipient)
recipients recipient
subject "using helpers"
from "tester@example.com"
- self.body = { :text => "emphasize me!" }
+
+ @text = "emphasize me!"
end
private
diff --git a/actionmailer/test/mail_layout_test.rb b/actionmailer/test/mail_layout_test.rb
index 50901f52ec..f37c26ff69 100644
--- a/actionmailer/test/mail_layout_test.rb
+++ b/actionmailer/test/mail_layout_test.rb
@@ -11,14 +11,18 @@ class AutoLayoutMailer < ActionMailer::Base
recipients recipient
subject "You have a mail"
from "tester@example.com"
- body render(:inline => "Hello, <%= @world %>", :layout => 'spam', :body => { :world => "Earth" })
+
+ @world = "Earth"
+ render(:inline => "Hello, <%= @world %>", :layout => 'spam')
end
def nolayout(recipient)
recipients recipient
subject "You have a mail"
from "tester@example.com"
- body render(:inline => "Hello, <%= @world %>", :layout => false, :body => { :world => "Earth" })
+
+ @world = "Earth"
+ render(:inline => "Hello, <%= @world %>", :layout => false)
end
def multipart(recipient, type = nil)
diff --git a/actionmailer/test/mail_render_test.rb b/actionmailer/test/mail_render_test.rb
index 45811612eb..514f7ed798 100644
--- a/actionmailer/test/mail_render_test.rb
+++ b/actionmailer/test/mail_render_test.rb
@@ -5,14 +5,27 @@ class RenderMailer < ActionMailer::Base
recipients recipient
subject "using helpers"
from "tester@example.com"
- body render(:inline => "Hello, <%= @world %>", :body => { :world => "Earth" })
+
+ @world = "Earth"
+ render :inline => "Hello, <%= @world %>"
end
def file_template(recipient)
recipients recipient
subject "using helpers"
from "tester@example.com"
- body render(:file => "signed_up", :body => { :recipient => recipient })
+
+ @recipient = recipient
+ render :file => "templates/signed_up"
+ end
+
+ def implicit_body(recipient)
+ recipients recipient
+ subject "using helpers"
+ from "tester@example.com"
+
+ @recipient = recipient
+ render :template => "templates/signed_up"
end
def rxml_template(recipient)
@@ -31,7 +44,9 @@ class RenderMailer < ActionMailer::Base
recipients recipient
subject "Including another template in the one being rendered"
from "tester@example.com"
- body render(:inline => "Hello, <%= render \"subtemplate\" %>", :body => { :world => "Earth" })
+
+ @world = "Earth"
+ render :inline => "Hello, <%= render \"subtemplate\" %>"
end
def initialize_defaults(method_name)
@@ -69,6 +84,11 @@ class RenderHelperTest < Test::Unit::TestCase
restore_delivery_method
end
+ def test_implicit_body
+ mail = RenderMailer.create_implicit_body(@recipient)
+ assert_equal "Hello there, \n\nMr. test@localhost", mail.body.strip
+ end
+
def test_inline_template
mail = RenderMailer.create_inline_template(@recipient)
assert_equal "Hello, Earth", mail.body.strip
diff --git a/actionmailer/test/mail_service_test.rb b/actionmailer/test/mail_service_test.rb
index 5584afa8be..c98f0a7601 100644
--- a/actionmailer/test/mail_service_test.rb
+++ b/actionmailer/test/mail_service_test.rb
@@ -15,18 +15,20 @@ end
class TestMailer < ActionMailer::Base
def signed_up(recipient)
- @recipients = recipient
- @subject = "[Signed up] Welcome #{recipient}"
- @from = "system@loudthinking.com"
- @body["recipient"] = recipient
+ recipients recipient
+ subject "[Signed up] Welcome #{recipient}"
+ from "system@loudthinking.com"
+
+ @recipient = recipient
end
def cancelled_account(recipient)
- self.recipients = recipient
- self.subject = "[Cancelled] Goodbye #{recipient}"
- self.from = "system@loudthinking.com"
- self.sent_on = Time.local(2004, 12, 12)
- self.body = "Goodbye, Mr. #{recipient}"
+ recipients recipient
+ subject "[Cancelled] Goodbye #{recipient}"
+ from "system@loudthinking.com"
+ sent_on Time.local(2004, 12, 12)
+
+ render :text => "Goodbye, Mr. #{recipient}"
end
def cc_bcc(recipient)
@@ -36,7 +38,8 @@ class TestMailer < ActionMailer::Base
sent_on Time.local(2004, 12, 12)
cc "nobody@loudthinking.com"
bcc "root@loudthinking.com"
- body "Nothing to see here."
+
+ render :text => "Nothing to see here."
end
def different_reply_to(recipient)
@@ -45,50 +48,55 @@ class TestMailer < ActionMailer::Base
from "system@loudthinking.com"
sent_on Time.local(2008, 5, 23)
reply_to "atraver@gmail.com"
- body "Nothing to see here."
+
+ render :text => "Nothing to see here."
end
def iso_charset(recipient)
- @recipients = recipient
- @subject = "testing isø charsets"
- @from = "system@loudthinking.com"
- @sent_on = Time.local 2004, 12, 12
- @cc = "nobody@loudthinking.com"
- @bcc = "root@loudthinking.com"
- @body = "Nothing to see here."
- @charset = "iso-8859-1"
+ recipients recipient
+ subject "testing isø charsets"
+ from "system@loudthinking.com"
+ sent_on Time.local(2004, 12, 12)
+ cc "nobody@loudthinking.com"
+ bcc "root@loudthinking.com"
+ charset "iso-8859-1"
+
+ render :text => "Nothing to see here."
end
def unencoded_subject(recipient)
- @recipients = recipient
- @subject = "testing unencoded subject"
- @from = "system@loudthinking.com"
- @sent_on = Time.local 2004, 12, 12
- @cc = "nobody@loudthinking.com"
- @bcc = "root@loudthinking.com"
- @body = "Nothing to see here."
+ recipients recipient
+ subject "testing unencoded subject"
+ from "system@loudthinking.com"
+ sent_on Time.local(2004, 12, 12)
+ cc "nobody@loudthinking.com"
+ bcc "root@loudthinking.com"
+
+ render :text => "Nothing to see here."
end
def extended_headers(recipient)
- @recipients = recipient
- @subject = "testing extended headers"
- @from = "Grytøyr <stian1@example.net>"
- @sent_on = Time.local 2004, 12, 12
- @cc = "Grytøyr <stian2@example.net>"
- @bcc = "Grytøyr <stian3@example.net>"
- @body = "Nothing to see here."
- @charset = "iso-8859-1"
+ recipients recipient
+ subject "testing extended headers"
+ from "Grytøyr <stian1@example.net>"
+ sent_on Time.local(2004, 12, 12)
+ cc "Grytøyr <stian2@example.net>"
+ bcc "Grytøyr <stian3@example.net>"
+ charset "iso-8859-1"
+
+ render :text => "Nothing to see here."
end
def utf8_body(recipient)
- @recipients = recipient
- @subject = "testing utf-8 body"
- @from = "Foo áëô îü <extended@example.net>"
- @sent_on = Time.local 2004, 12, 12
- @cc = "Foo áëô îü <extended@example.net>"
- @bcc = "Foo áëô îü <extended@example.net>"
- @body = "åœö blah"
- @charset = "utf-8"
+ recipients recipient
+ subject "testing utf-8 body"
+ from "Foo áëô îü <extended@example.net>"
+ sent_on Time.local(2004, 12, 12)
+ cc "Foo áëô îü <extended@example.net>"
+ bcc "Foo áëô îü <extended@example.net>"
+ charset "utf-8"
+
+ render :text => "åœö blah"
end
def multipart_with_mime_version(recipient)
@@ -128,7 +136,6 @@ class TestMailer < ActionMailer::Base
subject "multipart example"
from "test@example.com"
sent_on Time.local(2004, 12, 12)
- body "plain text default"
content_type ct if ct
part "text/html" do |p|
@@ -138,15 +145,18 @@ class TestMailer < ActionMailer::Base
attachment :content_type => "image/jpeg", :filename => "foo.jpg",
:body => "123456789"
+
+ render :text => "plain text default"
end
def implicitly_multipart_example(recipient, cs = nil, order = nil)
- @recipients = recipient
- @subject = "multipart example"
- @from = "test@example.com"
- @sent_on = Time.local 2004, 12, 12
- @body = { "recipient" => recipient }
- @charset = cs if cs
+ recipients recipient
+ subject "multipart example"
+ from "test@example.com"
+ sent_on Time.local(2004, 12, 12)
+
+ @charset = cs if cs
+ @recipient = recipient
@implicit_parts_order = order if order
end
@@ -155,20 +165,22 @@ class TestMailer < ActionMailer::Base
subject "Foo áëô îü"
from "some.one@somewhere.test"
template "implicitly_multipart_example"
- body ({ "recipient" => "no.one@nowhere.test" })
+
+ @recipient = "no.one@nowhere.test"
end
def html_mail(recipient)
recipients recipient
subject "html mail"
from "test@example.com"
- body "<em>Emphasize</em> <strong>this</strong>"
content_type "text/html"
+
+ render :text => "<em>Emphasize</em> <strong>this</strong>"
end
def html_mail_with_underscores(recipient)
subject "html mail with underscores"
- body %{<a href="http://google.com" target="_blank">_Google</a>}
+ render :text => %{<a href="http://google.com" target="_blank">_Google</a>}
end
def custom_template(recipient)
@@ -178,7 +190,7 @@ class TestMailer < ActionMailer::Base
sent_on Time.local(2004, 12, 12)
template "signed_up"
- body["recipient"] = recipient
+ @recipient = recipient
end
def custom_templating_extension(recipient)
@@ -187,15 +199,16 @@ class TestMailer < ActionMailer::Base
from "system@loudthinking.com"
sent_on Time.local(2004, 12, 12)
- body["recipient"] = recipient
+ @recipient = recipient
end
def various_newlines(recipient)
recipients recipient
subject "various newlines"
from "test@example.com"
- body "line #1\nline #2\rline #3\r\nline #4\r\r" +
- "line #5\n\nline#6\r\n\r\nline #7"
+
+ render :text => "line #1\nline #2\rline #3\r\nline #4\r\r" +
+ "line #5\n\nline#6\r\n\r\nline #7"
end
def various_newlines_multipart(recipient)
@@ -203,6 +216,7 @@ class TestMailer < ActionMailer::Base
subject "various newlines multipart"
from "test@example.com"
content_type "multipart/alternative"
+
part :content_type => "text/plain", :body => "line #1\nline #2\rline #3\r\nline #4\r\r"
part :content_type => "text/html", :body => "<p>line #1</p>\n<p>line #2</p>\r<p>line #3</p>\r\n<p>line #4</p>\r\r"
end
@@ -212,10 +226,12 @@ class TestMailer < ActionMailer::Base
subject "nested multipart"
from "test@example.com"
content_type "multipart/mixed"
+
part :content_type => "multipart/alternative", :content_disposition => "inline", :headers => { "foo" => "bar" } do |p|
p.part :content_type => "text/plain", :body => "test text\nline #2"
p.part :content_type => "text/html", :body => "<b>test</b> HTML<br/>\nline #2"
end
+
attachment :content_type => "application/octet-stream",:filename => "test.txt", :body => "test abcdefghijklmnopqstuvwxyz"
end
@@ -224,6 +240,7 @@ class TestMailer < ActionMailer::Base
subject "nested multipart with body"
from "test@example.com"
content_type "multipart/mixed"
+
part :content_type => "multipart/alternative", :content_disposition => "inline", :body => "Nothing to see here." do |p|
p.part :content_type => "text/html", :body => "<b>test</b> HTML<br/>"
end
@@ -253,7 +270,7 @@ class TestMailer < ActionMailer::Base
from "One: Two <test@example.com>"
cc "Three: Four <test@example.com>"
bcc "Five: Six <test@example.com>"
- body "testing"
+ render :text => "testing"
end
def custom_content_type_attributes
@@ -261,15 +278,15 @@ class TestMailer < ActionMailer::Base
subject "custom content types"
from "some.one@somewhere.test"
content_type "text/plain; format=flowed"
- body "testing"
+ render :text => "testing"
end
def return_path
recipients "no.one@nowhere.test"
subject "return path test"
from "some.one@somewhere.test"
- body "testing"
headers "return-path" => "another@somewhere.test"
+ render :text => "testing"
end
def body_ivar(recipient)
@@ -279,7 +296,13 @@ class TestMailer < ActionMailer::Base
body :body => "foo", :bar => "baz"
end
- class <<self
+ def subject_with_i18n(recipient)
+ recipients recipient
+ from "system@loudthinking.com"
+ render :text => "testing"
+ end
+
+ class << self
attr_accessor :received_body
end
@@ -375,6 +398,15 @@ class ActionMailerTest < Test::Unit::TestCase
assert_equal expected.encoded, ActionMailer::Base.deliveries.first.encoded
end
+ def test_subject_with_i18n
+ assert_nothing_raised { TestMailer.deliver_subject_with_i18n(@recipient) }
+ assert_equal "Subject with i18n", ActionMailer::Base.deliveries.first.subject
+
+ I18n.backend.store_translations('en', :actionmailer => {:test_mailer => {:subject_with_i18n => {:subject => "New Subject!"}}})
+ assert_nothing_raised { TestMailer.deliver_subject_with_i18n(@recipient) }
+ assert_equal "New Subject!", ActionMailer::Base.deliveries.last.subject
+ end
+
def test_custom_template
expected = new_mail
expected.to = @recipient
@@ -554,7 +586,7 @@ class ActionMailerTest < Test::Unit::TestCase
def test_doesnt_raise_errors_when_raise_delivery_errors_is_false
ActionMailer::Base.raise_delivery_errors = false
- TestMailer.any_instance.expects(:perform_delivery_test).raises(Exception)
+ TestMailer.delivery_method.expects(:perform_delivery).raises(Exception)
assert_nothing_raised { TestMailer.deliver_signed_up(@recipient) }
end
@@ -1024,7 +1056,7 @@ end
class MethodNamingTest < Test::Unit::TestCase
class TestMailer < ActionMailer::Base
def send
- body 'foo'
+ render :text => 'foo'
end
end
diff --git a/actionmailer/test/test_helper_test.rb b/actionmailer/test/test_helper_test.rb
index 65b07a71b8..34c5243936 100644
--- a/actionmailer/test/test_helper_test.rb
+++ b/actionmailer/test/test_helper_test.rb
@@ -4,13 +4,15 @@ class TestHelperMailer < ActionMailer::Base
def test
recipients "test@example.com"
from "tester@example.com"
- body render(:inline => "Hello, <%= @world %>", :body => { :world => "Earth" })
+
+ @world = "Earth"
+ render(:inline => "Hello, <%= @world %>")
end
end
class TestHelperMailerTest < ActionMailer::TestCase
def test_setup_sets_right_action_mailer_options
- assert_equal :test, ActionMailer::Base.delivery_method
+ assert_instance_of ActionMailer::DeliveryMethod::Test, ActionMailer::Base.delivery_method
assert ActionMailer::Base.perform_deliveries
assert_equal [], ActionMailer::Base.deliveries
end
diff --git a/actionmailer/test/url_test.rb b/actionmailer/test/url_test.rb
index 71286bd1cf..2224f6321c 100644
--- a/actionmailer/test/url_test.rb
+++ b/actionmailer/test/url_test.rb
@@ -1,9 +1,9 @@
require 'abstract_unit'
class TestMailer < ActionMailer::Base
-
+
default_url_options[:host] = 'www.basecamphq.com'
-
+
def signed_up_with_url(recipient)
@recipients = recipient
@subject = "[Signed up] Welcome #{recipient}"
@@ -52,25 +52,27 @@ class ActionMailerUrlTest < Test::Unit::TestCase
end
def test_signed_up_with_url
- ActionController::Routing::Routes.draw do |map|
- map.connect ':controller/:action/:id'
- map.welcome 'welcome', :controller=>"foo", :action=>"bar"
- end
+ ActionController::Routing.use_controllers! ['welcome'] do
+ ActionController::Routing::Routes.draw do |map|
+ map.connect ':controller/:action/:id'
+ map.welcome 'welcome', :controller=>"foo", :action=>"bar"
+ end
- expected = new_mail
- expected.to = @recipient
- expected.subject = "[Signed up] Welcome #{@recipient}"
- expected.body = "Hello there, \n\nMr. #{@recipient}. Please see our greeting at http://example.com/welcome/greeting http://www.basecamphq.com/welcome\n\n<img alt=\"Somelogo\" src=\"/images/somelogo.png\" />"
- expected.from = "system@loudthinking.com"
- expected.date = Time.local(2004, 12, 12)
-
- created = nil
- assert_nothing_raised { created = TestMailer.create_signed_up_with_url(@recipient) }
- assert_not_nil created
- assert_equal expected.encoded, created.encoded
-
- assert_nothing_raised { TestMailer.deliver_signed_up_with_url(@recipient) }
- assert_not_nil ActionMailer::Base.deliveries.first
- assert_equal expected.encoded, ActionMailer::Base.deliveries.first.encoded
+ expected = new_mail
+ expected.to = @recipient
+ expected.subject = "[Signed up] Welcome #{@recipient}"
+ expected.body = "Hello there, \n\nMr. #{@recipient}. Please see our greeting at http://example.com/welcome/greeting http://www.basecamphq.com/welcome\n\n<img alt=\"Somelogo\" src=\"/images/somelogo.png\" />"
+ expected.from = "system@loudthinking.com"
+ expected.date = Time.local(2004, 12, 12)
+
+ created = nil
+ assert_nothing_raised { created = TestMailer.create_signed_up_with_url(@recipient) }
+ assert_not_nil created
+ assert_equal expected.encoded, created.encoded
+
+ assert_nothing_raised { TestMailer.deliver_signed_up_with_url(@recipient) }
+ assert_not_nil ActionMailer::Base.deliveries.first
+ assert_equal expected.encoded, ActionMailer::Base.deliveries.first.encoded
+ end
end
end