これは何?
Railsの課題を実施しています。メール送信機能を作りましょうとの課題がありました。作りながら調べたことを勉強も兼ねてまとめています。
なお、実行環境は以下の通りです。
- Rails 5.2.3
 - Ruby 2.6.0
 
そして、本記事は課題の内容を参考にしつつもRailsガイドのAction Mailer の基礎から多くを引用して作成しています。
メール送信機能の実装
必要ファイルの生成
それでは、早速メール送信機能を実装していきます。まずは以下のコマンドを打ちます。
$ rails g mailer UserMailer
このコマンドで、以下のファイルとディレクトリが追加されました。
また、Railsにはデフォルトで以下のレイアウトファイルが含まれています。
views      # 関係のないファイルは省略
└── layouts
     ├── mailer.html.slim
     └── mailer.text.slim
それぞれのファイルには、レイアウトに必要な設定が全て書かれています。メール本文に当たる部分は、先程生成したapp/views/user_mailerディレクトリ内に作成していきます。(下記は、デフォルトで生成されているレイアウトファイルのサンプル)
doctype html
html
  head
    meta[http-equiv="Content-Type" content="text/html; charset=utf-8"]
    style
      |  /* Email styles need to be inline */
  body
    main
      = yield
mailerの書き方(メール送信メソッドの実装)
mailerの書き方は、controllerに似ています。まず、デフォルトで生成されているApplicationMailerには、以下のように記載されています。
class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end
ここでのdefaultは引数にハッシュを取り、全てのメーラーに共通の設定を記載できるそう。from:以外にもto:, reply_to:などの設定がRailsガイドでは扱われていました。
先程生成したUserMailerには、ApplicationMailerを継承した、さまざまなメソッドを記載します。
class UserMailer < ApplicationMailer
  def welcome_email
    @user = params[:user]
    mail(to: @user.email, subject: 'メールのタイトルがここに入ります')
  end
end
mailの部分は、実際のメール・メッセージです。
ビューの生成
mailerで定義した変数はビューで使えます。app/views/user_mailerに例えば以下のようなメッセージを作成することができます。
h2= #{@user.name}さん
p= "アプリへようこそ!楽しんでいってくださいね!" 
p= link_to "ログインはこちら", login_url
mailの場合、*_pathのように相対パスになる表示は使えないので、*_urlのような絶対パスでパスを指定します。
送信のトリガー
最後に、送信のトリガーとなるメソッドを実装します。
userを作成した直後に、先のwelcome_mailメソッドが発動するようにした場合、users_controllerに以下のように記載します。
class UsersController < ApplicationController
  def create
    @user = params[:user]
    if @user.save
      UserMailer.with(user: @user).welcome_mail.deliver_later
      # その他の処理は略
    end
  end
end
.withの部分でkey: valueを渡すと、その部分はparamsになってUserMailerに渡ります。
deliver_laterの部分で、直前の処理(ここではcreateが完了した場合、その直後にメールを送ることができます。
そのほかにもdeliver_nowなどのメソッドもあるようです。
完成!
以上で、メール送信メソッドを完成することができました!
実際には、先の記事で紹介したletter_opener_webのgemを使っているので、メールを送信するとすぐに擬似的なメーラーが開いて確認できます^^
Railsの機能のおかげで、簡単に実装できるんですね。引き続き、頑張ろうと思います。
