メールを送ることができる機能で、パスワードリセットや定時のユーザーへの連絡などに使える。

生成の仕方は rails g mailer (model名)Mailer

4009_Ryosuke-nakagawa_runteq_curriculum_advanced % rails g mailer ArticleMailer
create  app/mailers/article_mailer.rb
create  app/mailers/application_mailer.rb
invoke  slim
create    app/views/article_mailer
create    app/views/layouts/mailer.text.slim
create    app/views/layouts/mailer.html.slim
invoke  rspec
create    spec/mailers/article_mailer_spec.rb
create    spec/mailers/previews/article_mailer_preview.rb

勝手にモデル名に合わせたmailerとview,testを作成してくれる

mailerはcontrollerと似ていて、baseになるApplicationMailerと空の(モデル名)Mailerとが生成される。

# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: "[email protected]"
  layout 'mailer'
end
# app/mailers/article_mailer.rb
class ArticleMailer < ApplicationMailer
end

例えば、挨拶メールをユーザーに送るとすると、このようにメソッドを定義する。


# app/mailers/article_mailer.rb
class ArticleMailer < ApplicationMailer
	default from: '[email protected]'
  #<=送り主のアドレスを指定。(各メソッドでメールごとに上書きすることも可能)

  def greeting_email
    @user = params[:user]
    @url  = '<http://example.com/login>' #<=メール本文で使用可能
    mail(to: @user.email, subject: 'おはようございます') #<=userのemailを宛先に格納
  end
end

app/views/article_mailer/ディレクトリでgreeting_email.html.erbというファイルを作成。このファイルを、HTMLでフォーマットされたメールテンプレートにする。

<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1><%= @user.name%>様、おはようございます。</h1>
    <p>
      本日も良い日でありますように。
      もしよろしければサイトにも訪れてみてください。<br>
    </p>
    <p>
      このサイトにログインするには、<%= @url%>をクリックしてください。
    </p>
  </body>
</html>

ユーザーによってはHTMLフォーマットのメールを受け取りたくない人もいるので、テキストメールも作成しておいた方が良い。

作るにはapp/views/user_mailer/ディレクトリでgreeting_email.text.erbというファイルを以下の内容で作成する。

**<%=** @user.**name** **%>**様、おはようございます===============================================
本日も良い日でありますように。
よろしければサイトにも訪れてみてください。

このサイトにログインするには、<%= @url%>をクリックしてください。

現在のAction Mailerでは、mailメソッドを呼び出すと2種類のテンプレート (テキストおよびHTML) があるかどうかを探し、multipart/alternative形式のメールを自動生成する。