Rails Action Mailerを使ったメール送信機能実装
参考
Rails Action Mailerを使ってメール送信機能を作る。 漠然と作ってもアレなので、一応オススメの本を紹介するメールとして作る。 (今どきメールで紹介しないとか置いておいて)
メイラーを生成する
docker-compose run web rails generate mailer BookMailer
こんな感じで空のメイラーが生成される。
class BookMailer < ApplicationMailer end
これを編集する。
class BookMailer < ApplicationMailer default from: 'book@example.com' def send_recommend # メール本文 @user = params[:user] @title = params[:title] @email = params[:email] mail(to: @email, subject: 'オススメの本が届きました') end end
default ハッシュ
- メイラーから送信されるあらゆる値のデフォルト値を設定出来る
- Rails アプリケーションを設定する - Railsガイド
メイラー内で定義されたインスタンス変数はViewでも使用可能
- ApplicationMailer.Baseのmailメソッド。
body
やfrom
を定義する事も可能だがここでは:toヘッダーと:subjectヘッダーを渡している。 - Action Mailer で覚えておくと便利な機能 :: by and for engineers
- ApplicationMailer.Baseのmailメソッド。
ちなみにこいつが継承している
ApplicationMailer
というのはデフォルトで存在しており内容は以下の通りで、特にデフォルトから編集する必要なし。
class ApplicationMailer < ActionMailer::Base default from: 'from@example.com' layout 'mailer' end
ActionMailer::Base
を継承している。こいつが色々と機能を提供してくれる。
Viewを生成する
先程のgenerate
でviews/book_mailerフォルダが出来ているため
send_recommend.html.erb
を生成する。
<!DOCTYPE html> <html> <head> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> </head> <body> <h1><%= @user.name %>様からオススメの本が届きました。</h1> <p>タイトル: <%= @book.title %>.<br></p> </body> </html>
先程作成したBookMailer
のメソッド名とファイル名を一致させる必要がある。
メール送信するコントローラーを生成する
class SendMailController < ApplicationController def send_recommend user = '紹介者' title = 'タイトル' email = 'a@a.com' BookMailer.with(user: user, title: title, email: email).send_mail.deliver_now end end
- with(キー:値)で渡すとメイラーアクションでparams[:キー]で取り出す事が可能。
- deliver_now すぐメールを送信するメソッド ActionMailer::MessageDelivery
- deliver_later こんな感じで数秒間待ったり出来る
Notifier.welcome(User.first).deliver_later!(wait: 1.hour) Notifier.welcome(User.first).deliver_later!(wait_until: 10.hours.from_now)
letter_openerの導入
毎回メールが飛んでくると面倒なので、letter_openerでメール送信機能 - Gemfileに記載
gem 'letter_opener_web'
- config/development.rbに記載
config.action_mailer.delivery_method = :letter_opener