2004-11-24 09:04:44 +08:00
= Action Mailer -- Easy email delivery and testing
2005-10-26 21:04:20 +08:00
Action Mailer is a framework for designing email-service layers. These layers
2006-09-03 03:32:45 +08:00
are used to consolidate code for sending out forgotten passwords, welcome
2004-11-24 09:04:44 +08:00
wishes on signup, invoices for billing, and any other use case that requires
a written notification to either a person or another system.
2010-08-14 13:13:00 +08:00
Action Mailer is in essence a wrapper around Action Controller and the
2010-01-25 20:46:09 +08:00
Mail gem. It provides a way to make emails using templates in the same
way that Action Controller renders views using templates.
2005-03-21 01:51:11 +08:00
Additionally, an Action Mailer class can be used to process incoming email,
2011-07-31 09:27:08 +08:00
such as allowing a blog to accept new posts from an email (which could even
2005-03-21 01:51:11 +08:00
have been sent from a phone).
== Sending emails
2010-01-25 20:46:09 +08:00
The framework works by initializing any instance variables you want to be
available in the email template, followed by a call to +mail+ to deliver
the email.
This can be as simple as:
class Notifier < ActionMailer::Base
2012-04-28 12:58:15 +08:00
default from: 'system@loudthinking.com'
2010-08-14 13:13:00 +08:00
2010-01-25 20:46:09 +08:00
def welcome(recipient)
@recipient = recipient
2012-04-28 12:58:15 +08:00
mail(to: recipient,
subject: "[Signed up] Welcome #{recipient}")
2010-01-25 20:46:09 +08:00
end
2004-11-24 09:04:44 +08:00
end
The body of the email is created by using an Action View template (regular
2011-04-03 15:59:37 +08:00
ERB) that has the instance variables that are declared in the mailer action.
2010-01-25 20:46:09 +08:00
2004-11-24 09:04:44 +08:00
So the corresponding body template for the method above could look like this:
2010-08-14 13:13:00 +08:00
Hello there,
2004-11-24 09:04:44 +08:00
Mr. <%= @recipient %>
2010-01-25 20:46:09 +08:00
Thank you for signing up!
2010-08-14 13:13:00 +08:00
2011-12-23 13:10:01 +08:00
If the recipient was given as "david@loudthinking.com", the email
2004-11-24 09:04:44 +08:00
generated would look like this:
2010-01-25 20:46:09 +08:00
Date: Mon, 25 Jan 2010 22:48:09 +1100
2004-11-24 09:04:44 +08:00
From: system@loudthinking.com
To: david@loudthinking.com
2010-01-25 20:46:09 +08:00
Message-ID: <4b5d84f9dd6a5_7380800b81ac29578@void.loudthinking.com.mail>
2004-11-24 09:04:44 +08:00
Subject: [Signed up] Welcome david@loudthinking.com
2010-01-25 20:46:09 +08:00
Mime-Version: 1.0
Content-Type: text/plain;
charset="US-ASCII";
Content-Transfer-Encoding: 7bit
2004-11-24 09:04:44 +08:00
2010-08-14 13:13:00 +08:00
Hello there,
2004-11-24 09:04:44 +08:00
Mr. david@loudthinking.com
2011-09-27 01:46:25 +08:00
Thank you for signing up!
2010-12-20 03:37:33 +08:00
In previous version of Rails you would call <tt>create_method_name</tt> and
2011-12-23 13:10:01 +08:00
<tt>deliver_method_name</tt>. Rails 3.0 has a much simpler interface - you
2010-01-25 20:46:09 +08:00
simply call the method and optionally call +deliver+ on the return value.
Calling the method returns a Mail Message object:
2010-08-12 23:09:58 +08:00
message = Notifier.welcome # => Returns a Mail::Message object
message.deliver # => delivers the email
2004-11-24 09:04:44 +08:00
2010-01-25 20:46:09 +08:00
Or you can just chain the methods together like:
Notifier.welcome.deliver # Creates the email and sends it immediately
2004-11-24 09:04:44 +08:00
2011-04-03 19:17:26 +08:00
== Setting defaults
2011-12-23 13:10:01 +08:00
It is possible to set default values that will be used in every method in your Action Mailer class. To implement this functionality, you just call the public class method <tt>default</tt> which you get for free from ActionMailer::Base. This method accepts a Hash as the parameter. You can use any of the headers e-mail messages has, like <tt>:from</tt> as the key. You can also pass in a string as the key, like "Content-Type", but Action Mailer does this out of the box for you, so you won't need to worry about that. Finally, it is also possible to pass in a Proc that will get evaluated when it is needed.
2011-04-03 19:17:26 +08:00
2011-04-04 00:12:07 +08:00
Note that every value you set with this method will get over written if you use the same key in your mailer method.
2011-04-03 19:17:26 +08:00
Example:
2012-02-12 14:52:12 +08:00
class AuthenticationMailer < ActionMailer::Base
2011-04-04 00:12:07 +08:00
default :from => "awesome@application.com", :subject => Proc.new { "E-mail was generated at #{Time.now}" }
2011-04-03 19:17:26 +08:00
.....
end
2005-03-21 01:51:11 +08:00
== Receiving emails
2011-03-07 04:52:47 +08:00
To receive emails, you need to implement a public instance method called <tt>receive</tt> that takes an
2011-03-05 08:38:21 +08:00
email object as its single parameter. The Action Mailer framework has a corresponding class method,
2010-07-29 09:50:24 +08:00
which is also called <tt>receive</tt>, that accepts a raw, unprocessed email as a string, which it then turns
2011-03-05 08:38:21 +08:00
into the email object and calls the receive instance method.
2005-03-21 01:51:11 +08:00
Example:
class Mailman < ActionMailer::Base
def receive(email)
page = Page.find_by_address(email.to.first)
page.emails.create(
2005-03-21 20:10:47 +08:00
:subject => email.subject, :body => email.body
2005-03-21 01:51:11 +08:00
)
if email.has_attachments?
2011-05-19 11:47:49 +08:00
email.attachments.each do |attachment|
2010-08-14 13:13:00 +08:00
page.attachments.create({
2005-03-21 20:10:47 +08:00
:file => attachment, :description => email.subject
2005-03-21 01:51:11 +08:00
})
end
end
end
end
2010-08-14 13:13:00 +08:00
This Mailman can be the target for Postfix or other MTAs. In Rails, you would use the runner in the
2008-05-17 06:01:32 +08:00
trivial case like this:
2005-03-21 01:51:11 +08:00
2010-02-07 00:18:10 +08:00
rails runner 'Mailman.receive(STDIN.read)'
2005-03-21 01:51:11 +08:00
2010-08-14 13:13:00 +08:00
However, invoking Rails in the runner for each mail to be received is very resource intensive. A single
2011-03-05 08:38:21 +08:00
instance of Rails should be run within a daemon, if it is going to be utilized to process more than just
2008-05-17 06:01:32 +08:00
a limited number of email.
2005-07-10 01:18:01 +08:00
== Configuration
The Base class has the full list of configuration options. Here's an example:
2008-05-17 06:01:32 +08:00
ActionMailer::Base.smtp_settings = {
:address => 'smtp.yourserver.com', # default: localhost
:port => '25', # default: 25
:user_name => 'user',
:password => 'pass',
:authentication => :plain # :plain, :login or :cram_md5
}
2004-11-24 09:04:44 +08:00
2010-07-18 20:58:40 +08:00
== Download and installation
2004-11-24 09:04:44 +08:00
2011-08-05 16:34:43 +08:00
The latest version of Action Mailer can be installed with RubyGems:
2004-11-24 09:04:44 +08:00
2010-07-18 20:58:40 +08:00
% [sudo] gem install actionmailer
Source code can be downloaded as part of the Rails project on GitHub
2004-11-24 09:04:44 +08:00
2011-08-04 12:43:55 +08:00
* https://github.com/rails/rails/tree/master/actionmailer
2004-11-24 09:04:44 +08:00
== License
2011-12-23 13:13:28 +08:00
Action Mailer is released under the MIT license:
* http://www.opensource.org/licenses/MIT
2004-11-24 09:04:44 +08:00
2010-07-18 20:58:40 +08:00
2004-11-24 09:04:44 +08:00
== Support
2010-07-18 20:58:40 +08:00
API documentation is at
2011-05-24 23:42:01 +08:00
* http://api.rubyonrails.org
2010-07-18 20:58:40 +08:00
Bug reports and feature requests can be filed with the rest for the Ruby on Rails project here:
2004-11-24 09:04:44 +08:00
2011-05-11 00:30:06 +08:00
* https://github.com/rails/rails/issues
2011-03-05 08:38:21 +08:00