Rails6 のちょい足しな新機能を試す41（MailDeliveryJob 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第41段。 今回は、 `MailDeliveryJob` 編です。
Rails 6 では、 `ActionMailer::DeliveryJob` を使うと `DEPRECATION WARNING` が表示されるようになります。
代わりに `ActionMailer::MailDeliveryJob` が用意されています。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

1. parameterized mail に対応するために、 `ActionMailer::Parameterized::DeliveryJob` が導入される。
2. `ActionMailer::DeliveryJob` と `ActionMailer::Parameterized::DeliveryJob` の2つがあるのはややこしいから、1つのクラス `ActionMailer::MailDeliveryJob` に統合しよう。
3. クラスが変わってしまうから、 `ActionMailer::DeliveryJob` や `ActionMailer::Parameterized::DeliveryJob` を使った場合に `DEPRECATION WARNING` を表示しよう。

という流れだったみたいです。

# 今回の準備

今回は、 [Rails6 のちょい足しな新機能を試す27（perform_deliveries 編）](https://qiita.com/suketa/items/4daf2767071ab0a70176) のソースに手を加えていくことにより動作確認します。

# MyMailDeliveryJob を作る

メール送信のジョブを差し変えるため、 `MyMailDeliveryJob` クラスを作ります。
このとき派生元のクラスを `DEPRECATION WARNING` を出すために、意図的に `ActionMailer::DeliveryJob` にします。

```ruby:app/jobs/my_mail_delivery_job.rb
class MyMailDeliveryJob < ActionMailer::DeliveryJob
  before_perform :logger_info

  def logger_info
    Rails.logger.info('BEFORE MyMailDeliveryJob perform')
  end
end
```

# MyMailDeliveryJob を使う

MyMailDeliveryJob を使うように `UserMailer` を修正します。

```ruby:app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  self.delivery_job = MyMailDeliveryJob # この行を追加
  ...
end
```

# ユーザーを登録する

ブラウザから User を登録してメールを送信します。

development.log に `DEPRECATION WARNING` が表示されます。また、 `MyMailDeliveryJob` を設定したにも関わらず、 `ActionMailer::Parameterized::DeliveryJob` が動作していることにも注意してください。

```log/development.log
...
[ActiveJob] [ActionMailer::Parameterized::DeliveryJob] [...] DEPRECATION WARNING: Sending mail with DeliveryJob and Parameterized::DeliveryJob is deprecated and will be removed in Rails 6.1. Please use MailDeliveryJob instead. (called from instance_exec at /usr/local/bundle/gems/activesupport-6.0.0.rc1/lib/active_support/callbacks.rb:429)
...
```

# MyMailDeliveryJob クラスの親クラスを変更する

MyMailDeliveryJob の親クラスを `ActionMailer::MailDeliveryJob` に変更します。

```ruby:app/job/my_mail_delivery_job.rb
class MyMailDeliveryJob < ActionMailer::MailDeliveryJob
  ...
end
```

# 再度ユーザーを登録する

ブラウザから User を登録してメールを送信します。

今度は、 `DEPRECATION WARNING` も消えて、 `MyMailDeliveryJob` が動作していることがわかります。

```log/development.log
...
[ActiveJob] [MyMailDeliveryJob] [...] Performing MyMailDeliveryJob ...
[ActiveJob] [MyMailDeliveryJob] [...] BEFORE MyMailDeliveryJob perform
...
```

# 結論

`ActionMailer::DeliveryJob` や `ActionMailer::Parameterized::DeliveryJob` を使っている場合や独自のメール送信ジョブのクラスを作っている場合は、 `ActionMailer::MailDeliveryJob` から派生させたメール送信ジョブのクラスに変更するのが良いでしょう。

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try041_mail_delivery_job

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Parameterized mailers can configure delivery job](https://github.com/rails/rails/pull/34097)
* [Deliver parameterized mail with DeliveryJob](https://github.com/rails/rails/pull/34367)
* [Add MailDeliveryJob for unified mail delivery](https://github.com/rails/rails/pull/34591)
* [Move MailDeliveryJob default to 6.0 defaults](https://github.com/rails/rails/pull/34692)