gotoshin

主に学んだ事の自分メモ用です。記事に書くまでも無いような事はhttps://scrapbox.io/study-diary/に書いてます。

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
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)

ActionMailer::MessageDelivery

letter_openerの導入

毎回メールが飛んでくると面倒なので、letter_openerでメール送信機能 - Gemfileに記載

gem 'letter_opener_web'
  • config/development.rbに記載
config.action_mailer.delivery_method = :letter_opener

参考にした資料

Action Mailer の基礎 - Railsガイド

ActionMailerは何をしているのか - Qiita