これは何?
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の機能のおかげで、簡単に実装できるんですね。引き続き、頑張ろうと思います。