【rails】メール通知Jobを作成して、非同期処理で送信する

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

自分でJobを作成してみる

今回はアドミンから通知が送られてくるようにする

(ユーザー数が多い場合を想定し、同期処理では終わらないので非同期処理にする)


jobの枠組みを作る

app/jobs/notification_from_admin_job.rbのファイルを作成する

名前の最後に「job」をつけるのがルール

jobがついている=非同期処理

まずjob作成の枠組みは↓のとおりになる

class NotificationFromAdminJob < ApplicationJob
  queue_as :default

  def perform
  end
end
  • queue_as :default どこのキュー(queue)に入れるのか?→default
  • def perform必ず定義すること!
    このJobを実行したとき、performのメソッドが動くため

Mailerを作成する

通知を送るためのMailerを作成する

app/mailers/notification_from_admin_mailer.rbを作成する

class NotificationFromAdminMailer < ApplicationMailer

  def notify(user, msg)
    @msg = msg
    mail to: user.email, subject: 'お知らせ'
  end

end

引数にmsgを入れ、@msg = msgにする

→ アドミン側が自由にメッセージを送れるようにしておく


viewを作成する

views/notification_from_admin_mailer/notify.html.hamlを作成する

%p 運営からのお知らせ
%p= @msg

今回のメインじゃないので適当に。


非同期処理のperformメソッドを定義する

非同期処理したい内容を書いていく

class NotificationFromAdminJob < ApplicationJob
  queue_as :default

  def perform(msg)
    User.all.each do |user|
      NotificationFromAdminMailer.notify(user, msg).deliver_later
    end
  end
  1. 全ユーザーUser.all.each do |user|
  2. NotificationFromAdminMailer.rbで定義された
  3. notify(user, msg)メソッドのメール送信を
  4. 非同期処理deliver_laterでおこなう

非同期処理のメール送信をテストする

rails cを起動する

まずNotificationFromAdminJobと書いて、返ってくるか確認する

  • NotificationFromAdminJob.perfom_now→同期的に処理する
  • NotificationFromAdminJob.perfom_later→非同期的で処理する

Enqueuedとは「queueに溜まった」という意味


sidekiqのログも確認

ActionMailerが、startdoneを繰り返していることがわかる


Letters_openerを確認

送りたいメールが、ちゃんと送信できている


失敗したら再試行してくれる

(現時点ではまだ失敗も再試行も0だけど)

もしメール送信に失敗した場合、sidekiqは再試行してくれる

再試行すると成功することが多いので便利!

#DAY10