instance method mail

Ruby on Rails edge

Since v3.0.20

Available in: v3.0.20 v3.1.12 v3.2.22.5 v4.0.13 v4.1.16 v4.2.11.3 v5.0.7.2 v5.1.7 v5.2.8.1 v6.0.6.1 v6.1.7.10 v7.0.10 v7.1.6 v7.2.4 v8.0.5.1 v8.1.4 edge

Signature

mail(headers = {}, &block)

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.

It accepts a headers hash. This hash allows you to specify
the most used headers in an email message, these are:

* +:subject+ - The subject of the message, if this is omitted, Action Mailer will
  ask the \Rails I18n class for a translated +:subject+ in the scope of
  <tt>[mailer_scope, action_name]</tt> or if this is missing, will translate the
  humanized version of the +action_name+
* +:to+ - Who the message is destined for, can be a string of addresses, or an array
  of addresses.
* +:from+ - Who the message is from
* +:cc+ - Who you would like to Carbon-Copy on this email, can be a string of addresses,
  or an array of addresses.
* +:bcc+ - Who you would like to Blind-Carbon-Copy on this email, can be a string of
  addresses, or an array of addresses.
* +:reply_to+ - Who to set the +Reply-To+ header of the email to.
* +:date+ - The date to say the email was sent on.

You can set default values for any of the above headers (except +:date+)
by using the ::default class method:

 class Notifier < ActionMailer::Base
   default from: 'no-reply@test.lindsaar.net',
           bcc: 'email_logger@test.lindsaar.net',
           reply_to: 'bounces@test.lindsaar.net'
 end

If you need other headers not listed above, you can either pass them in
as part of the headers hash or use the <tt>headers['name'] = value</tt>
method.

When a +:return_path+ 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 sent to a different address than the
one in +:from+. Mail will actually use the +:return_path+ in preference
to the +:sender+ in preference to the +:from+ field for the 'envelope
from' value.

If you do not pass a block to the +mail+ method, it will find all
templates in the view paths using by default the mailer name and the
method name that it is being called from, it will then create parts for
each of these templates intelligently, making educated guesses on correct
content type and sequence, and return a fully prepared +Mail::Message+
ready to call <tt>:deliver</tt> on to send.

For example:

  class Notifier < ActionMailer::Base
    default from: 'no-reply@test.lindsaar.net'

    def welcome
      mail(to: 'mikel@test.lindsaar.net')
    end
  end

Will look for all templates at "app/views/notifier" with name "welcome".
If no welcome template exists, it will raise an ActionView::MissingTemplate error.

However, those can be customized:

  mail(template_path: 'notifications', template_name: 'another')

And now it will look for all templates at "app/views/notifications" with name "another".

If you do pass a block, you can render specific templates of your choice:

  mail(to: 'mikel@test.lindsaar.net') do |format|
    format.text
    format.html
  end

You can even render plain text directly without using a template:

  mail(to: 'mikel@test.lindsaar.net') do |format|
    format.text { render plain: "Hello Mikel!" }
    format.html { render html: "<h1>Hello Mikel!</h1>".html_safe }
  end

Which will render a +multipart/alternative+ email with +text/plain+ and
+text/html+ 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

: (?Hash[untyped, untyped]) ?{ (ActionMailer::Collector) -> void } -> Mail::Message

Parameters

headers opt = {}
block block
Source
# File actionmailer/lib/action_mailer/base.rb, line 881
    def mail(headers = {}, &block)
      return message if @_mail_was_called && headers.blank? && !block

      # At the beginning, do not consider class default for content_type
      content_type = headers[:content_type]

      headers = apply_defaults(headers)

      # Apply charset at the beginning so all fields are properly quoted
      message.charset = charset = headers[:charset]

      # Set configure delivery behavior
      wrap_delivery_behavior!(headers[:delivery_method], headers[:delivery_method_options])

      assign_headers_to_message(message, headers)

      # Render the templates and blocks
      responses = collect_responses(headers, &block)
      @_mail_was_called = true

      create_parts_from_responses(message, responses)
      wrap_inline_attachments(message)

      # Set up content type, reapply charset and handle parts order
      message.content_type = set_content_type(message, content_type, headers[:content_type])
      message.charset      = charset

      if message.multipart?
        message.body.set_sort_order(headers[:parts_order])
        message.body.sort_parts!
      end

      message
    end

Defined in actionmailer/lib/action_mailer/base.rb line 881 · View on GitHub · Improve this page · Find usages on GitHub

Defined in ActionMailer::Base

Type at least 2 characters to search.

Use the arrow keys to navigate results, Enter to open one, Escape to close.

Keyboard shortcuts

/
Focus search
⌘K / Ctrl-K
Command palette
?
This help
Esc
Close