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:
parent
1b3cb54eba
commit
6589976533
4 changed files with 58 additions and 38 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
|
Loading…
Reference in a new issue