1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Remove old files, add some information to docs and improve test suite.

This commit is contained in:
José Valim and Mikel Lindsaar 2010-01-26 01:43:41 +01:00
parent 1b3cb54eba
commit 6589976533
4 changed files with 58 additions and 38 deletions

View file

@ -22,7 +22,6 @@ the email.
This can be as simple as: This can be as simple as:
class Notifier < ActionMailer::Base class Notifier < ActionMailer::Base
delivers_from 'system@loudthinking.com' delivers_from 'system@loudthinking.com'
def welcome(recipient) def welcome(recipient)
@ -30,7 +29,6 @@ This can be as simple as:
mail(:to => recipient, mail(:to => recipient,
:subject => "[Signed up] Welcome #{recipient}") :subject => "[Signed up] Welcome #{recipient}")
end end
end end
The body of the email is created by using an Action View template (regular The body of the email is created by using an Action View template (regular

View file

@ -27,9 +27,8 @@ module ActionMailer #:nodoc:
# #
# def welcome(recipient) # def welcome(recipient)
# @account = recipient # @account = recipient
# mail { :to => recipient.email_address_with_name, # mail(:to => recipient.email_address_with_name,
# :bcc => ["bcc@example.com", "Order Watcher <watcher@example.com>"], # :bcc => ["bcc@example.com", "Order Watcher <watcher@example.com>"])
# :subject => "New account information" }
# end # end
# end # end
# #
@ -37,13 +36,15 @@ module ActionMailer #:nodoc:
# #
# * <tt>attachments[]=</tt> - Allows you to add attachments to your email in an intuitive # * <tt>attachments[]=</tt> - Allows you to add attachments to your email in an intuitive
# manner; <tt>attachments['filename.png'] = File.read('path/to/filename.png')</tt> # manner; <tt>attachments['filename.png'] = File.read('path/to/filename.png')</tt>
#
# * <tt>headers[]=</tt> - Allows you to specify non standard headers in your email such # * <tt>headers[]=</tt> - Allows you to specify non standard headers in your email such
# as <tt>headers['X-No-Spam'] = 'True'</tt> # as <tt>headers['X-No-Spam'] = 'True'</tt>
#
# * <tt>mail</tt> - Allows you to specify your email to send. # * <tt>mail</tt> - Allows you to specify your email to send.
# #
# The hash passed to the mail method allows you to specify the most used headers in an email # The hash passed to the mail method allows you to specify the most used headers in an email
# message, such as <tt>Subject</tt>, <tt>To</tt>, <tt>From</tt>, <tt>Cc</tt>, <tt>Bcc</tt>, # message, such as <tt>Subject</tt>, <tt>To</tt>, <tt>From</tt>, <tt>Cc</tt>, <tt>Bcc</tt>,
# <tt>Reply-To</tt> and <tt>Date</tt>. See the <tt>ActionMailer#mail</tt> method for more details. # <tt>Reply-To</tt> and <tt>Date</tt>. See the <tt>ActionMailer#mail</tt> method for more details.
# #
# If you need other headers not listed above, use the <tt>headers['name'] = value</tt> method. # If you need other headers not listed above, use the <tt>headers['name'] = value</tt> method.
# #
@ -58,6 +59,20 @@ module ActionMailer #:nodoc:
# format.html # format.html
# end # end
# #
# The block syntax is useful if also need to specify information specific to a part:
#
# mail(:to => user.emai) do |format|
# format.text(:content_transfer_encoding => "base64")
# format.html
# end
#
# Or even to renderize a special view:
#
# mail(:to => user.emai) do |format|
# format.text
# format.html { render "some_other_template" }
# end
#
# = Mailer views # = Mailer views
# #
# Like Action Controller, each mailer class has a corresponding view directory in which each # Like Action Controller, each mailer class has a corresponding view directory in which each
@ -79,9 +94,9 @@ module ActionMailer #:nodoc:
# You got a new note! # You got a new note!
# <%= truncate(@note.body, 25) %> # <%= truncate(@note.body, 25) %>
# #
# If you need to access the subject, from or the recipients in the view, you can do that through mailer object: # If you need to access the subject, from or the recipients in the view, you can do that through message object:
# #
# You got a new note from <%= mailer.from %>! # You got a new note from <%= message.from %>!
# <%= truncate(@note.body, 25) %> # <%= truncate(@note.body, 25) %>
# #
# #
@ -137,7 +152,7 @@ module ActionMailer #:nodoc:
# * signup_notification.text.plain.erb # * signup_notification.text.plain.erb
# * signup_notification.text.html.erb # * signup_notification.text.html.erb
# * signup_notification.text.xml.builder # * signup_notification.text.xml.builder
# * signup_notification.text.x-yaml.erb # * signup_notification.text.yaml.erb
# #
# Each would be rendered and added as a separate part to the message, with the corresponding content # Each would be rendered and added as a separate part to the message, with the corresponding content
# type. The content type for the entire message is automatically set to <tt>multipart/alternative</tt>, # type. The content type for the entire message is automatically set to <tt>multipart/alternative</tt>,
@ -174,8 +189,6 @@ module ActionMailer #:nodoc:
# * <tt>delivers_from</tt> - Pass this the address that then defaults as the +from+ address on all the # * <tt>delivers_from</tt> - Pass this the address that then defaults as the +from+ address on all the
# emails sent. Can be overridden on a per mail basis by passing <tt>:from => 'another@address'</tt> in # emails sent. Can be overridden on a per mail basis by passing <tt>:from => 'another@address'</tt> in
# the +mail+ method. # the +mail+ method.
#
# * <tt>template_root</tt> - Determines the base from which template references will be made.
# #
# * <tt>logger</tt> - the logger is used for generating information on the mailing run if available. # * <tt>logger</tt> - the logger is used for generating information on the mailing run if available.
# Can be set to nil for no logging. Compatible with both Ruby's own Logger and Log4r loggers. # Can be set to nil for no logging. Compatible with both Ruby's own Logger and Log4r loggers.
@ -300,9 +313,7 @@ module ActionMailer #:nodoc:
def deliver_mail(mail) #:nodoc: def deliver_mail(mail) #:nodoc:
ActiveSupport::Notifications.instrument("action_mailer.deliver") do |payload| ActiveSupport::Notifications.instrument("action_mailer.deliver") do |payload|
self.set_payload_for_mail(payload, mail) self.set_payload_for_mail(payload, mail)
yield # Let Mail do the delivery actions yield # Let Mail do the delivery actions
end end
end end
@ -399,7 +410,7 @@ module ActionMailer #:nodoc:
# The main method that creates the message and renders the email templates. There are # The main method that creates the message and renders the email templates. There are
# two ways to call this method, with a block, or without a block. # two ways to call this method, with a block, or without a block.
# #
# Both methods accept a headers hash. This hash allows you to specify the most used headers # Both methods accept a headers hash. This hash allows you to specify the most used headers
# in an email message, these are: # in an email message, these are:
# #
# * <tt>:subject</tt> - The subject of the message, if this is omitted, ActionMailer will # * <tt>:subject</tt> - The subject of the message, if this is omitted, ActionMailer will
@ -419,7 +430,7 @@ module ActionMailer #:nodoc:
# #
# If you need other headers not listed above, use the <tt>headers['name'] = value</tt> method. # If you need other headers not listed above, use the <tt>headers['name'] = value</tt> method.
# #
# When a <tt>:return_path</tt> is specified, that value will be used as the 'envelope from' # When a <tt>:return_path</tt> is specified as header, that value will be used as the 'envelope from'
# address for the Mail message. Setting this is useful when you want delivery notifications # address for the Mail message. Setting this is useful when you want delivery notifications
# sent to a different address than the one in <tt>:from</tt>. Mail will actually use the # sent to a different address than the one in <tt>:from</tt>. Mail will actually use the
# <tt>:return_path</tt> in preference to the <tt>:sender</tt> in preference to the <tt>:from</tt> # <tt>:return_path</tt> in preference to the <tt>:sender</tt> in preference to the <tt>:from</tt>
@ -447,6 +458,14 @@ module ActionMailer #:nodoc:
# #
# Which will render a <tt>multipart/alternate</tt> email with <tt>text/plain</tt> and # Which will render a <tt>multipart/alternate</tt> email with <tt>text/plain</tt> and
# <tt>text/html</tt> parts. # <tt>text/html</tt> parts.
#
# The block syntax also allows you to customize the part headers if desired:
#
# mail(:to => 'mikel@test.lindsaar.net') do |format|
# format.text(:content_transfer_encoding => "base64")
# format.html
# end
#
def mail(headers={}, &block) def mail(headers={}, &block)
# Guard flag to prevent both the old and the new API from firing # Guard flag to prevent both the old and the new API from firing
# Should be removed when old API is removed # Should be removed when old API is removed
@ -541,7 +560,8 @@ module ActionMailer #:nodoc:
def create_parts_from_responses(m, responses, charset) #:nodoc: def create_parts_from_responses(m, responses, charset) #:nodoc:
if responses.size == 1 && !m.has_attachments? if responses.size == 1 && !m.has_attachments?
m.body = responses[0][:body] headers = responses[0]
headers.each { |k,v| m[k] = v }
return responses[0][:content_type] return responses[0][:content_type]
elsif responses.size > 1 && m.has_attachments? elsif responses.size > 1 && m.has_attachments?
container = Mail::Part.new container = Mail::Part.new

View file

@ -56,6 +56,13 @@ class BaseTest < ActiveSupport::TestCase
format.any(:text, :html){ render :text => "Format with any!" } format.any(:text, :html){ render :text => "Format with any!" }
end end
end end
def custom_block(include_html=false)
mail(DEFAULT_HEADERS) do |format|
format.text(:content_transfer_encoding => "base64"){ render "welcome" }
format.html{ render "welcome" } if include_html
end
end
end end
test "method call to mail does not raise error" do test "method call to mail does not raise error" do
@ -337,6 +344,23 @@ class BaseTest < ActiveSupport::TestCase
assert_equal("Format with any!", email.parts[1].body.encoded) assert_equal("Format with any!", email.parts[1].body.encoded)
end end
test "explicit multipart with options" do
email = BaseMailer.custom_block(true).deliver
assert_equal(2, email.parts.size)
assert_equal("multipart/alternate", email.mime_type)
assert_equal("text/plain", email.parts[0].mime_type)
assert_equal("base64", email.parts[0].content_transfer_encoding)
assert_equal("text/html", email.parts[1].mime_type)
assert_equal("7bit", email.parts[1].content_transfer_encoding)
end
test "explicit multipart with one part is rendered as body" do
email = BaseMailer.custom_block.deliver
assert_equal(0, email.parts.size)
assert_equal("text/plain", email.mime_type)
assert_equal("base64", email.content_transfer_encoding)
end
# Class level API with method missing # Class level API with method missing
test "should respond to action methods" do test "should respond to action methods" do
assert BaseMailer.respond_to?(:welcome) assert BaseMailer.respond_to?(:welcome)

View file

@ -1,22 +0,0 @@
require 'abstract_unit'
class MailTest < Test::Unit::TestCase
def test_body
m = Mail.new
expected = 'something_with_underscores'
m.content_transfer_encoding = 'quoted-printable'
quoted_body = [expected].pack('*M')
m.body = quoted_body
assert_equal "something_with_underscores=\r\n", m.body.encoded
assert_equal expected, m.body.to_s
end
def test_nested_attachments_are_recognized_correctly
fixture = File.read("#{File.dirname(__FILE__)}/fixtures/raw_email_with_nested_attachment")
mail = Mail.new(fixture)
assert_equal 2, mail.attachments.length
assert_equal "image/png", mail.attachments.first.mime_type
assert_equal 1902, mail.attachments.first.decoded.length
assert_equal "application/pkcs7-signature", mail.attachments.last.mime_type
end
end