【Rails】deliver_laterで送信したはずのメールがletter_openerでプレビューできない

困ったこと

すでに開発されているプロジェクトで.deliver_laterを使ってメールを送信している箇所がletter_openerでプレビューされなかった。

deviseを使った招待メールはプレビューで確認できているのに。。

結論

ローカル環境でジョブの実行がされていなかったことが原因。

delayed_jobを使っているプロジェクトの場合はrake jobs:workでジョブの実行したら、今まで送信されていなかったメールが一気に送信されました。

学び

deliver_laterメソッド

Railsガイドの説明

deliver_laterを使うと、Active Jobによるメールキューにメールを登録できます。これにより、コントローラは送信完了を待たずに処理を続行できます。

つまり以下のようなアクション内のコードで.deliver_laterの処理は遅延されずに実行することができます。

class UsersController < ApplicationController
  def send_email
    user = User.find(params[:id])
    UserMailer.welcome_email(user).deliver_later
    # この時点でメールは非同期に送信され、処理はすぐに続行される
    ...
  end
end

実際にdeliver_later後のdelayed_jobsテーブルを確認すると、キューのレコードが生成されています。

rake jobs:workでジョブの実行していたら、このキューが実行されるというわけですね。。

参考