edge
詳細はrubyonrails.orgで: もっとRuby on Rails

Action Mailerの基本

このガイドでは、アプリケーションからメールを送信するために必要なすべての情報と、Action Mailerの内部について説明します。また、メーラーのテスト方法についてもカバーしています。

このガイドを読み終えると、以下のことがわかるようになります。

1 Action Mailerとは何ですか?

Action Mailerを使用すると、メーラークラスとビューを使用してアプリケーションからメールを送信することができます。

1.1 メーラーはコントローラに似ています

メーラーはActionMailer::Baseを継承し、app/mailersに存在します。メーラーはコントローラと非常に似た動作をします。以下に類似点のいくつかを挙げます。メーラーは:

  • アクションと、app/viewsに表示される関連するビューを持っています。
  • ビューでアクセス可能なインスタンス変数を持っています。
  • レイアウトとパーシャルを利用することができます。
  • paramsハッシュにアクセスすることができます。

2 メールの送信

このセクションでは、メーラーとそのビューを作成するためのステップバイステップのガイドを提供します。

2.1 メーラーの生成手順

2.1.1 メーラーの作成

$ bin/rails generate mailer User
create  app/mailers/user_mailer.rb
create  app/mailers/application_mailer.rb
invoke  erb
create    app/views/user_mailer
create    app/views/layouts/mailer.text.erb
create    app/views/layouts/mailer.html.erb
invoke  test_unit
create    test/mailers/user_mailer_test.rb
create    test/mailers/previews/user_mailer_preview.rb
# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: "[email protected]"
  layout 'mailer'
end
# app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
end

上記のように、Railsの他のジェネレータと同様に、メーラーを生成することができます。

ジェネレータを使用したくない場合は、app/mailers内に独自のファイルを作成することもできますが、ActionMailer::Baseを継承していることを確認してください。

class MyMailer < ActionMailer::Base
end

2.1.2 メーラーの編集

メーラーには「アクション」と呼ばれるメソッドがあり、ビューを使用してコンテンツを構造化します。コントローラがクライアントに返すためにHTMLなどのコンテンツを生成するのに対し、メーラーはメール経由で配信されるメッセージを作成します。

app/mailers/user_mailer.rbには空のメーラーが含まれています。

class UserMailer < ApplicationMailer
end

ユーザーの登録されたメールアドレスにメールを送信するwelcome_emailというメソッドを追加しましょう。

class UserMailer < ApplicationMailer
  default from: '[email protected]'

  def welcome_email
    @user = params[:user]
    @url  = 'http://example.com/login'
    mail(to: @user.email, subject: 'Welcome to My Awesome Site')
  end
end

前述のメソッドで表示されている項目の簡単な説明を以下に示します。利用可能なオプションの完全なリストについては、後述の「Action Mailerユーザー設定可能な属性の完全なリスト」を参照してください。

  • defaultメソッドは、このメーラーから送信されるすべてのメールのデフォルト値を設定します。この場合、このクラスのすべてのメッセージの:fromヘッダー値を設定するために使用しています。これは、個々のメールごとに上書きすることができます。
  • mailメソッドは、実際のメールメッセージを作成します。このメソッドを使用して、:to:subjectなどのヘッダーの値を指定します。

2.1.3 メーラービューの作成

app/views/user_mailer/welcome_email.html.erbというファイルを作成します。これはHTML形式のメールのテンプレートになります。

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1>Welcome to example.com, <%= @user.name %></h1>
    <p>
      You have successfully signed up to example.com,
      your username is: <%= @user.login %>.<br>
    </p>
    <p>
      To login to the site, just follow this link: <%= @url %>.
    </p>
    <p>Thanks for joining and have a great day!</p>
  </body>
</html>

また、このメールのテキスト部分も作成しましょう。すべてのクライアントがHTMLメールを好むわけではないため、両方を送信するのがベストプラクティスです。これを行うには、app/views/user_mailer/welcome_email.text.erbというファイルを作成します。

Welcome to example.com, <%= @user.name %>
===============================================

You have successfully signed up to example.com,
your username is: <%= @user.login %>.

To login to the site, just follow this link: <%= @url %>.

Thanks for joining and have a great day!

mailメソッドを呼び出すと、Action Mailerは2つのテンプレート(テキストとHTML)を検出し、自動的にmultipart/alternativeのメールを生成します。

2.1.4 メーラーの呼び出し

メーラーは、ビューをレンダリングする別の方法です。ビューをレンダリングしてHTTPプロトコルを介して送信する代わりに、メールプロトコルを介して送信します。そのため、コントローラーがユーザーの作成に成功した場合にメーラーに電子メールを送信するように指示することは理にかなっています。

これを設定するのは簡単です。

まず、Userのスキャフォールドを作成しましょう:

$ bin/rails generate scaffold user name email login
$ bin/rails db:migrate

これで遊ぶためのユーザーモデルができたので、app/controllers/users_controller.rbファイルを編集して、ユーザーが正常に作成された場合にUserMailerに新しく作成されたユーザーにメールを配信するように指示します。具体的には、createアクションを編集し、ユーザーが正常に保存された後にUserMailer.with(user: @user).welcome_emailを呼び出します。

コントローラーアクションが完了するのを待たずに送信が完了するように、deliver_laterを使用してメールを送信するようにエンキューします。これはActive Jobによってバックアップされています。

class UsersController < ApplicationController
  # ...

  # POST /users or /users.json
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        # ユーザーが保存された後にUserMailerにウェルカムメールを送信するように指示する
        UserMailer.with(user: @user).welcome_email.deliver_later

        format.html { redirect_to(@user, notice: 'User was successfully created.') }
        format.json { render json: @user, status: :created, location: @user }
      else
        format.html { render action: 'new' }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # ...
end

注意:Active Jobのデフォルトの動作は、:asyncアダプターを介してジョブを実行することです。そのため、deliver_laterを使用してメールを非同期に送信できます。Active Jobのデフォルトのアダプターは、インプロセスのスレッドプールでジョブを実行します。これは、外部のインフラストラクチャを必要としないため、開発/テスト環境に適していますが、再起動時に保留中のジョブが削除されるため、本番環境には適していません。永続的なバックエンドが必要な場合は、永続的なバックエンドを持つActive Jobアダプター(Sidekiq、Resqueなど)を使用する必要があります。

すぐにメールを送信したい場合(たとえばcronジョブから)、deliver_nowを呼び出すだけです:

class SendWeeklySummary
  def run
    User.find_each do |user|
      UserMailer.with(user: user).weekly_summary.deliver_now
    end
  end
end

withに渡されるキーと値のペアは、メーラーアクションのparamsになります。つまり、with(user: @user, account: @user.account)は、メーラーアクションでparams[:user]params[:account]を使用できるようにします。コントローラーと同様に、メーラーもparamsを持っています。

welcome_emailメソッドはActionMailer::MessageDeliveryオブジェクトを返し、それ自体を送信するためにdeliver_nowまたはdeliver_laterと指示できます。ActionMailer::MessageDeliveryオブジェクトはMail::Messageのラッパーです。Mail::Messageオブジェクトを検査、変更、またはその他の操作を行う場合は、ActionMailer::MessageDeliveryオブジェクトのmessageメソッドでアクセスできます。

2.2 ヘッダー値の自動エンコード

Action Mailerは、ヘッダーや本文内のマルチバイト文字の自動エンコードを処理します。

より複雑な例として、代替文字セットの定義や自己エンコードテキストの最初については、Mailライブラリを参照してください。

2.3 Action Mailerメソッドの完全なリスト

ほとんどのメールメッセージを送信するために必要なのは、次の3つのメソッドだけです:

  • headers - メールの任意のヘッダーを指定します。ヘッダーフィールド名と値のペアのハッシュを渡すか、headers[:field_name] = 'value'と呼び出すことができます。
  • attachments - メールに添付ファイルを追加することができます。例えば、attachments['file-name.jpg'] = File.read('file-name.jpg')です。
  • mail - 実際のメール自体を作成します。mailメソッドにヘッダーをハッシュとしてパラメーターとして渡すことができます。mailは、定義したメールテンプレートに応じて、プレーンテキストまたはマルチパートのメールを作成します。 #### 添付ファイルの追加

Action Mailerを使用すると、添付ファイルの追加が非常に簡単になります。

  • ファイル名と内容をAction MailerとMail gemに渡すと、mime_typeを自動的に推測し、encodingを設定し、添付ファイルを作成します。

    attachments['filename.jpg'] = File.read('/path/to/filename.jpg')
    

mailメソッドがトリガーされると、添付ファイルを含むマルチパートのメールが送信され、トップレベルがmultipart/mixedであり、最初のパートがプレーンテキストとHTMLメールメッセージを含むmultipart/alternativeになります。

注意:Mailは添付ファイルを自動的にBase64エンコードします。異なるエンコード方法を使用する場合は、コンテンツをエンコードし、エンコードされたコンテンツとエンコーディングをHashattachmentsメソッドに渡します。

  • ファイル名とヘッダーとコンテンツを指定し、Action MailerとMailは渡した設定を使用します。

    encoded_content = SpecialEncode(File.read('/path/to/filename.jpg'))
    attachments['filename.jpg'] = {
      mime_type: 'application/gzip',
      encoding: 'SpecialEncoding',
      content: encoded_content
    }
    

注意:エンコーディングを指定すると、Mailはコンテンツが既にエンコードされているとみなし、Base64エンコードを試みません。

2.3.1 インライン添付ファイルの作成

Action Mailer 3.0では、3.0以前のバージョンでは多くのハッキングが必要だったインライン添付ファイルが、より簡単で当然のようになりました。

  • まず、Mailに添付ファイルをインライン添付ファイルに変換するように指示するには、Mailer内のattachmentsメソッドに対して#inlineを呼び出すだけです。

    def welcome
      attachments.inline['image.jpg'] = File.read('/path/to/image.jpg')
    end
    
  • 次に、ビューでattachmentsをハッシュとして参照し、表示したい添付ファイルを指定し、urlを呼び出してその結果をimage_tagメソッドに渡すだけです。

    <p>Hello there, this is our image</p>
    
    <%= image_tag attachments['image.jpg'].url %>
    
  • これはimage_tagへの標準的な呼び出しであるため、他の画像と同様に、添付ファイルのURLの後にオプションのハッシュを渡すことができます。

    <p>Hello there, this is our image</p>
    
    <%= image_tag attachments['image.jpg'].url, alt: 'My Photo', class: 'photos' %>
    

2.3.2 複数の受信者にメールを送信する

1つのメールで1人以上の受信者にメールを送信することができます(例:新しいサインアップの通知としてすべての管理者に通知する)。「:to」キーにメールアドレスのリストを設定することで、メールのリストを指定できます。メールのリストは、メールアドレスの配列またはカンマで区切られたアドレスを含む単一の文字列にすることができます。

class AdminMailer < ApplicationMailer
  default to: -> { Admin.pluck(:email) },
          from: '[email protected]'

  def new_registration(user)
    @user = user
    mail(subject: "New User Signup: #{@user.email}")
  end
end

同じ形式を使用して、カーボンコピー(Cc:)とブラインドカーボンコピー(Bcc:)の受信者を設定することもできます。それぞれ「:cc」と「:bcc」キーを使用します。

2.3.3 名前付きでメールを送信する

メールを受け取る人のメールアドレスだけでなく、その人の名前も表示したい場合があります。その場合は、email_address_with_nameを使用できます。

def welcome_email
  @user = params[:user]
  mail(
    to: email_address_with_name(@user.email, @user.name),
    subject: 'Welcome to My Awesome Site'
  )
end

同じテクニックを使用して、送信者の名前を指定することもできます。

class UserMailer < ApplicationMailer
  default from: email_address_with_name('[email protected]', 'Example Company Notifications')
end

名前が空の文字列の場合、アドレスのみが返されます。

2.4 メーラービュー

メーラービューはapp/views/name_of_mailer_classディレクトリにあります。メーラービューは、メーラーメソッドと同じ名前であるため、クラスには特定のメーラービューがわかります。上記の例では、welcome_emailメソッドのメーラービューは、HTMLバージョンの場合はapp/views/user_mailer/welcome_email.html.erbに、プレーンテキストバージョンの場合はwelcome_email.text.erbになります。

アクションのデフォルトメーラービューを変更するには、次のようにします。

class UserMailer < ApplicationMailer
  default from: '[email protected]'

  def welcome_email
    @user = params[:user]
    @url  = 'http://example.com/login'
    mail(to: @user.email,
         subject: 'Welcome to My Awesome Site',
         template_path: 'notifications',
         template_name: 'another')
  end
end

この場合、app/views/notifications内のanotherという名前のテンプレートを探します。template_pathにはパスの配列を指定することもでき、順番に検索されます。

柔軟性を高めるために、ブロックを渡して特定のテンプレートをレンダリングしたり、テンプレートファイルを使用せずにインラインまたはテキストをレンダリングすることもできます。

class UserMailer < ApplicationMailer
  default from: '[email protected]'

  def welcome_email
    @user = params[:user]
    @url  = 'http://example.com/login'
    mail(to: @user.email,
         subject: 'Welcome to My Awesome Site') do |format|
      format.html { render 'another_template' }
      format.text { render plain: 'Render text' }
    end
  end
end

これにより、HTMLパートにはテンプレートanother_template.html.erbがレンダリングされ、テキストパートにはレンダリングされたテキストが使用されます。renderコマンドはAction Controller内で使用されるものと同じなので、:text:inlineなどのオプションも使用できます。

デフォルトのapp/views/mailer_name/ディレクトリ以外にあるテンプレートをレンダリングする場合は、prepend_view_pathを適用することもできます。

class UserMailer < ApplicationMailer
  prepend_view_path "custom/path/to/mailer/view"

  # "custom/path/to/mailer/view/welcome_email"テンプレートを読み込もうとします
  def welcome_email
    # ...
  end
end

append_view_pathメソッドを使用することもできます。

2.4.1 メーラービューのキャッシュ

cacheメソッドを使用して、アプリケーションビューと同様にメーラービューでフラグメントキャッシュを実行できます。

<% cache do %>
  <%= @company.name %>
<% end %>

この機能を使用するには、アプリケーションを次のように設定する必要があります。

config.action_mailer.perform_caching = true

フラグメントキャッシュは、マルチパートメールでもサポートされています。キャッシュについての詳細は、Railsキャッシュガイドを参照してください。

2.5 Action Mailerのレイアウト

コントローラービューと同様に、メーラーレイアウトを使用することもできます。レイアウト名はメーラーと同じである必要があります。例えば、user_mailer.html.erbuser_mailer.text.erbは、メーラーによって自動的にレイアウトとして認識されます。

異なるファイルを使用する場合は、メーラー内でlayoutを呼び出します。

class UserMailer < ApplicationMailer
  layout 'awesome' # awesome.(html|text).erbをレイアウトとして使用する
end

コントローラービューと同様に、yieldを使用してレイアウト内でビューをレンダリングします。

異なるフォーマットに対して異なるレイアウトを指定するために、フォーマットブロック内のレンダーコールにlayout: 'layout_name'オプションを渡すこともできます。

class UserMailer < ApplicationMailer
  def welcome_email
    mail(to: params[:user].email) do |format|
      format.html { render layout: 'my_layout' }
      format.text
    end
  end
end

これにより、HTMLパートはmy_layout.html.erbファイルを使用してレンダリングされ、テキストパートは通常のuser_mailer.text.erbファイルが存在する場合に使用されます。

2.6 メールのプレビュー

Action Mailerプレビューを使用すると、特別なURLを訪れることでメールの表示方法を確認することができます。上記の例では、UserMailerのプレビュークラスはUserMailerPreviewという名前であり、test/mailers/previews/user_mailer_preview.rbに配置する必要があります。welcome_emailのプレビューを表示するには、同じ名前のメソッドを実装し、UserMailer.welcome_emailを呼び出します。

class UserMailerPreview < ActionMailer::Preview
  def welcome_email
    UserMailer.with(user: User.first).welcome_email
  end
end

その後、プレビューはhttp://localhost:3000/rails/mailers/user_mailer/welcome_emailで利用できます。

app/views/user_mailer/welcome_email.html.erbまたはメーラー自体を変更すると、自動的にリロードされてレンダリングされるため、新しいスタイルを即座に視覚的に確認できます。プレビューのリストはhttp://localhost:3000/rails/mailersでも利用できます。

デフォルトでは、これらのプレビュークラスはtest/mailers/previewsに存在します。preview_pathsオプションを使用してこれを設定することができます。たとえば、lib/mailer_previewsを追加したい場合は、config/application.rbで設定できます。

config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews"

2.7 Action MailerビューでURLを生成する

コントローラーとは異なり、メーラーインスタンスには受信リクエストに関するコンテキストがありませんので、:hostパラメータを自分で指定する必要があります。

通常、:hostはアプリケーション全体で一貫しているため、config/application.rbでグローバルに設定できます。

config.action_mailer.default_url_options = { host: 'example.com' }

この動作のため、メール内では*_pathヘルパーを使用することはできません。代わりに関連する*_urlヘルパーを使用する必要があります。例えば、次のように使用します。

<%= link_to 'welcome', welcome_url %>

完全なURLを使用することで、リンクがメール内で機能するようになります。

2.7.1 url_forを使用したURLの生成

url_forは、テンプレート内ではデフォルトで完全なURLを生成します。

グローバルにhostオプションを設定していない場合は、url_forに渡す必要があります。

<%= url_for(host: 'example.com',
            controller: 'welcome',
            action: 'greeting') %>

2.7.2 名前付きルートを使用したURLの生成

メールクライアントにはWebコンテキストがないため、パスには完全なWebアドレスを形成するためのベースURLがありません。そのため、常に名前付きルートヘルパーの*_urlバリアントを使用する必要があります。

グローバルにhostオプションを設定していない場合は、URLヘルパーに渡す必要があります。

<%= user_url(@user, host: 'example.com') %>

注意:非GETリンクにはrails-ujsまたはjQuery UJSが必要であり、メーラーテンプレートでは機能しません。通常のGETリクエストになります。

2.8 Action Mailerビューに画像を追加する

コントローラとは異なり、メーラーインスタンスには受信リクエストに関するコンテキストがありませんので、asset_hostパラメータを自分で指定する必要があります。

通常、asset_hostはアプリケーション全体で一貫しているため、config/application.rbでグローバルに設定できます。

config.asset_host = 'http://example.com'

これで、メール内に画像を表示することができます。

<%= image_tag 'image.jpg' %>

2.9 マルチパートメールの送信

Action Mailerは、同じアクションに対して異なるテンプレートがある場合、自動的にマルチパートメールを送信します。したがって、UserMailerの例では、app/views/user_mailerwelcome_email.text.erbwelcome_email.html.erbがある場合、Action Mailerは自動的にHTMLとテキストのバージョンを異なるパーツとして設定したマルチパートメールを送信します。

パーツの挿入順序は、ActionMailer::Base.defaultメソッド内の:parts_orderによって決まります。

2.10 動的な配信オプションを使用したメールの送信

メールの配信時にデフォルトの配信オプション(例:SMTPの資格情報)を上書きしたい場合は、メーラーアクションでdelivery_method_optionsを使用してこれを行うことができます。

class UserMailer < ApplicationMailer
  def welcome_email
    @user = params[:user]
    @url  = user_url(@user)
    delivery_options = { user_name: params[:company].smtp_user,
                         password: params[:company].smtp_password,
                         address: params[:company].smtp_host }
    mail(to: @user.email,
         subject: "Please see the Terms and Conditions attached",
         delivery_method_options: delivery_options)
  end
end

2.11 テンプレートのレンダリングなしでメールを送信する

テンプレートのレンダリングステップをスキップして、メール本文を文字列で指定したい場合があります。これは、bodyオプションを使用して実現できます。この場合、content_typeオプションを追加することを忘れないでください。そうしないと、Railsはデフォルトでtext/plainになります。

class UserMailer < ApplicationMailer
  def welcome_email
    mail(to: params[:user].email,
         body: params[:email_body],
         content_type: "text/html",
         subject: "Already rendered!")
  end
end

3 Action Mailerコールバック

Action Mailerでは、メッセージを設定するためのbefore_actionafter_actionaround_action、および配信を制御するためのbefore_deliverafter_deliveraround_deliverを指定できます。

  • コールバックは、コントローラと同様に、ブロックまたはメーラークラス内のメソッドへのシンボルとして指定できます。

  • before_actionを使用してインスタンス変数を設定したり、メールオブジェクトにデフォルト値を設定したり、デフォルトのヘッダーや添付ファイルを挿入したりすることができます。

class InvitationsMailer < ApplicationMailer
  before_action :set_inviter_and_invitee
  before_action { @account = params[:inviter].account }

  default to:       -> { @invitee.email_address },
          from:     -> { common_address(@inviter) },
          reply_to: -> { @inviter.email_address_with_name }

  def account_invitation
    mail subject: "#{@inviter.name} invited you to their Basecamp (#{@account.name})"
  end

  def project_invitation
    @project    = params[:project]
    @summarizer = ProjectInvitationSummarizer.new(@project.bucket)

    mail subject: "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})"
  end

  private
    def set_inviter_and_invitee
      @inviter = params[:inviter]
      @invitee = params[:invitee]
    end
end
  • before_actionを使用して、メーラーアクションで設定されたインスタンス変数を使用して、before_actionと同様のセットアップを行うことができます。

  • after_actionコールバックを使用すると、mail.delivery_method.settingsを更新することで配信方法の設定をオーバーライドすることもできます。

class UserMailer < ApplicationMailer
  before_action { @business, @user = params[:business], params[:user] }

  after_action :set_delivery_options,
               :prevent_delivery_to_guests,
               :set_business_headers

  def feedback_message
  end

  def campaign_message
  end

  private
    def set_delivery_options
      # ここでは、メールインスタンス、@business、@userのインスタンス変数にアクセスできます
      if @business && @business.has_smtp_settings?
        mail.delivery_method.settings.merge!(@business.smtp_settings)
      end
    end

    def prevent_delivery_to_guests
      if @user && @user.guest?
        mail.perform_deliveries = false
      end
    end

    def set_business_headers
      if @business
        headers["X-SMTPAPI-CATEGORY"] = @business.code
      end
    end
end
  • after_deliveryを使用して、メッセージの配信を記録することができます。

  • メーラーコールバックは、本文が非nilの値に設定されている場合、さらなる処理を中止します。before_deliverthrow :abortで中止することができます。

4 Action Mailerヘルパーの使用

Action MailerはAbstractControllerを継承しているため、Action Controllerと同じヘルパーのほとんどにアクセスすることができます。

また、ActionMailer::MailHelperにはAction Mailer固有のヘルパーメソッドもあります。例えば、mailerを使用してビューからメーラーインスタンスにアクセスしたり、messageを使用してメッセージにアクセスしたりすることができます。

<%= stylesheet_link_tag mailer.name.underscore %>
<h1><%= message.subject %></h1>

5 Action Mailerの設定

以下の設定オプションは、環境ファイル(environment.rb、production.rbなど)のいずれかに設定するのが最適です。

設定 説明
logger 利用可能な場合、メーリング実行に関する情報を生成します。ログを記録しない場合はnilに設定できます。RubyのLoggerLog4rの両方に対応しています。
smtp_settings :smtp配信方法の詳細な設定を可能にします。
  • :address - リモートメールサーバーを使用することができます。デフォルトの"localhost"設定から変更してください。
  • :port - メールサーバーがポート25で動作しない場合、変更できます。
  • :domain - HELOドメインを指定する必要がある場合は、ここで指定できます。
  • :user_name - メールサーバーが認証を必要とする場合、この設定でユーザー名を設定します。
  • :password - メールサーバーが認証を必要とする場合、この設定でパスワードを設定します。
  • :authentication - メールサーバーが認証を必要とする場合、ここで認証タイプを指定する必要があります。これはシンボルであり、:plain(パスワードをクリアテキストで送信)、:login(パスワードをBase64エンコードで送信)、:cram_md5(Challenge/Responseメカニズムと重要な情報をハッシュ化するための暗号化メッセージダイジェスト5アルゴリズムを組み合わせたもの)のいずれかです。
  • :enable_starttls - SMTPサーバーへの接続時にSTARTTLSを使用し、サポートされていない場合は失敗します。デフォルトはfalseです。
  • :enable_starttls_auto - SMTPサーバーでSTARTTLSが有効になっているかどうかを検出し、使用を開始します。デフォルトはtrueです。
  • :openssl_verify_mode - TLSを使用する場合、OpenSSLが証明書をどのようにチェックするかを設定できます。これは、自己署名証明書と/またはワイルドカード証明書を検証する必要がある場合に非常に便利です。OpenSSLの検証定数('none'または'peer')の名前または定数(OpenSSL::SSL::VERIFY_NONEまたはOpenSSL::SSL::VERIFY_PEER)を使用できます。
  • :ssl/:tls - SMTP接続がSMTP/TLS(SMTPS:直接TLS接続上のSMTP)を使用するようにします。
  • :open_timeout - 接続を開こうとする間の待機時間(秒単位)。
  • :read_timeout - 読み取り(2)呼び出しのタイムアウトまでの待機時間(秒単位)。
sendmail_settings :sendmail配信方法のオプションを上書きすることができます。
  • :location - sendmail実行可能ファイルの場所。デフォルトは"/usr/sbin/sendmail"です。
  • :arguments - sendmailに渡されるコマンドライン引数。デフォルトは["-i"]です。
raise_delivery_errors メールの配信に失敗した場合にエラーを発生させるかどうかを指定します。これは、外部のメールサーバーが即時配信に設定されている場合にのみ機能します。デフォルトはtrueです。
delivery_method 配信方法を定義します。可能な値は次のとおりです:
  • :smtp(デフォルト) - config.action_mailer.smtp_settingsを使用して設定できます。
  • :sendmail - config.action_mailer.sendmail_settingsを使用して設定できます。
  • :file - メールをファイルに保存します。config.action_mailer.file_settingsを使用して設定できます。
  • :test - メールをActionMailer::Base.deliveries配列に保存します。
詳細については、APIドキュメントを参照してください。
perform_deliveries deliverメソッドがMailメッセージで呼び出されたときに、実際に配信が行われるかどうかを決定します。デフォルトでは、配信が行われますが、これをオフにすると機能テストに役立ちます。この値がfalseの場合、delivery_method:testであってもdeliveries配列は更新されません。
deliveries Action Mailerを介して送信されたすべてのメールをdelivery_method:testの場合に保持する配列です。ユニットテストと機能テストに最も役立ちます。
delivery_job deliver_laterで使用されるジョブクラスです。デフォルトはActionMailer::MailDeliveryJobです。
deliver_later_queue_name デフォルトのdelivery_jobで使用されるキューの名前です。デフォルトはデフォルトのActive Jobキューです。
default_options mailメソッドのオプション(:from:reply_toなど)のデフォルト値を設定できます。

完全な設定の詳細については、Configuring Rails ApplicationsガイドのConfiguring Action Mailerを参照してください。

5.1 Action Mailerの設定例

以下を適切なconfig/environments/$RAILS_ENV.rbファイルに追加する例です。

config.action_mailer.delivery_method = :sendmail
# デフォルト:
# config.action_mailer.sendmail_settings = {
#   location: '/usr/sbin/sendmail',
#   arguments: %w[ -i ]
# }
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_options = { from: '[email protected]' }

5.2 Gmail用のAction Mailerの設定

Action MailerはMail gemを使用し、類似の設定を受け入れます。 Gmail経由で送信するには、以下をconfig/environments/$RAILS_ENV.rbファイルに追加してください。

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  address:         'smtp.gmail.com',
  port:            587,
  domain:          'example.com',
  user_name:       '<username>',
  password:        '<password>',
  authentication:  'plain',
  enable_starttls: true,
  open_timeout:    5,
  read_timeout:    5 }

Mail gemの古いバージョン(2.6.x以前)を使用している場合は、enable_starttlsの代わりにenable_starttls_autoを使用してください。

注意:Googleは、より安全でないと判断したアプリからのサインインをブロックします。 試行を許可するために、Gmailの設定をここで変更できます。Gmailアカウントで2要素認証が有効になっている場合は、通常のパスワードの代わりにアプリパスワードを設定する必要があります。

6 メーラーテスト

メーラーのテスト方法の詳細な手順については、テストガイドを参照してください。

7 メールのインターセプトと監視

Action Mailerは、メールの配信ライフサイクルの間に呼び出されるクラスを登録するためのMailオブザーバーとインターセプターのフックを提供します。

7.1 メールのインターセプト

インターセプターを使用すると、メールが配信エージェントに渡される前に変更を加えることができます。インターセプタークラスは、メールが送信される前に呼び出される::delivering_email(message)メソッドを実装する必要があります。

class SandboxEmailInterceptor
  def self.delivering_email(message)
    message.to = ['[email protected]']
  end
end

インターセプターが機能する前に、interceptorsの設定オプションを使用して登録する必要があります。 これは、config/initializers/mail_interceptors.rbのような初期化ファイルで行うことができます。

Rails.application.configure do
  if Rails.env.staging?
    config.action_mailer.interceptors = %w[SandboxEmailInterceptor]
  end
end

注意:上記の例では、テスト目的のプロダクションライクなサーバーに「staging」というカスタム環境を使用しています。カスタムRails環境についての詳細は、Creating Rails Environmentsを参照してください。

7.2 メールの監視

オブザーバーを使用すると、メールが送信された後にメールメッセージにアクセスできます。オブザーバークラスは、メールが送信された後に呼び出される:delivered_email(message)メソッドを実装する必要があります。

class EmailDeliveryObserver
  def self.delivered_email(message)
    EmailDelivery.log(message)
  end
end

インターセプターと同様に、observersの設定オプションを使用してオブザーバーを登録する必要があります。 これは、config/initializers/mail_observers.rbのような初期化ファイルで行うことができます。

Rails.application.configure do
  config.action_mailer.observers = %w[EmailDeliveryObserver]
end

フィードバック

このガイドの品質向上にご協力ください。

タイポや事実の誤りを見つけた場合は、ぜひ貢献してください。 開始するには、ドキュメントへの貢献セクションを読んでください。

不完全なコンテンツや最新でない情報も見つかるかもしれません。 メインのドキュメントに不足しているドキュメントを追加してください。 修正済みかどうかは、まずEdge Guidesを確認してください。 スタイルと規約については、Ruby on Rails Guides Guidelinesを確認してください。

修正すべき点を見つけたが、自分で修正できない場合は、 問題を報告してください

そして最後に、Ruby on Railsのドキュメントに関するあらゆる議論は、公式のRuby on Railsフォーラムで大歓迎です。