Rails でメール送信を同期で処理すると、画面のレスポンスが遅くなることがあります。
そこでよく使うのが deliver_later です。
目次
deliver_laterとは
Action Mailer でメール送信をバックグラウンドジョブに積み、あとで送る仕組みです。
Rails Guide でも、コントローラの応答を待たせない方法として案内されています。
基本コード
例えば以下のように書けます。
UserMailer.welcome_email(@user).deliver_later
同期で即送る deliver_now と違い、deliver_later は Active Job 経由で実行されます。
実装時の注意点
- default_url_options の host を設定する
- メール内リンクは *_path ではなく *_url を使う
- 画像を使うなら asset_host も設定する
メールは通常のWebリクエスト文脈外で動くので、URL生成周りは特に注意が必要です。
まとめ
Rails でメール送信を実務的に使うなら、deliver_later を前提に考えたほうが扱いやすいです。
レスポンス改善にもつながるので、同期送信が必要な場面以外ではかなり使いやすい方法です。
