gem letter_opener を試してみる

## これは何？
Railsの課題を実施しています。メール送信機能を作るにあたって`letter_opener_web`を使いましょうとの指定があったので、導入がてら色々と調べてみました。

なお、実行環境は以下の通りです。

- Rails 5.2.3
- Ruby 2.6.0

## letter_opener と letter_opener_web

`letter_opener`自体は職場でも使われていたので名前は聞いたことがありました。メール送信内容の確認は[デフォルトだとコンソールから確認できるみたい](https://zenn.dev/junki555/articles/9e324dbefcecde)なのですが、それだと面倒なので、実際のメールに似た読みやすい画面で表示できるように作られたgemのようですね。
ただ、すぐに `letter_opener`と`letter_opener_web`があることがわかりました。まずは、両者の違いの確認から入ります。

### letter_opener
まず、`letter_opener`は、[公式サイト](https://github.com/fgrehm/letter_opener_web)の説明によると

> メールを送信する代わりに、デフォルトのブラウザでプレビューします。これは、開発環境で電子メール配信を設定する必要がなく、誤って他の人のアドレスにテスト電子メールを送信することを心配する必要がないことを意味します。

というGemだそうです。

一方で、`letter_opener_web`は、同じく[公式サイト](https://github.com/fgrehm/letter_opener_web)によると

> letter_openerに送信された電子メールを閲覧するためのインターフェースを提供します。

だそうです。これだけだと「？？？」ですよね。
ちょうど、[こちらのブログ記事](http://rubyandrails.hatenablog.com/entry/letter_opener_web)で両者の違いをわかりやすく説明していました。

> ただし letter_opener はリモートで開発していると使えないことが。例えば Mac の iTerm から Linux サーバにリモート接続して、ブラウザが Mac にある場合。letter_opener はリモート先の Linux でメールを開いている。なので見えない。
そんな時は letter_opener_web が便利。
デフォルトでは localhost:3000/letter_opener/ にアクセスすることで（画像を表示）な感じで見ることができます。

[公式が提供しているデモサイト](http://letter-opener-web.herokuapp.com/)にもアクセスすることで、挙動も確認できました。

[![Image from Gyazo](https://i.gyazo.com/3163b8c6b337ef0ec6d02c5a0631b652.gif)](https://gyazo.com/3163b8c6b337ef0ec6d02c5a0631b652)

ブラウザで送信からメールでの受信のサンプルまで、一貫して作ってくれるんですね。そして、`letter_opener_web`の場合、ブラウザはデフォルトのブラウザに限らず、`localhost:3000//letter_opener`が開けるところなら、どこでも上記のような画面を開いてくれる模様です。

**メール送信メソッド**はまた別のようでしたので、次の記事で実装になりそうです。:relaxed:
（実装したら追記します！）

## 使い方

さて、gemの導入です。まず`Gemfile.rb`に以下のように記入して...

```Ruby:Gemfile
group :development do
  gem 'letter_opener_web', '~> 1.0'
end
```
`bundle install`します。
次に、`routes.rb`に`letter_opener`用のルーティングを追加します。

```ruby:config/routes.rb
Rails.application.routes.draw do
  if Rails.env.development?
    mount LetterOpenerWeb::Engine, at: "/letter_opener"
  end

  # 後略　そのほかに設定したさまざまなルーティング
end
```

そして、`letter_opener`の`deliverly method`を`config/environments/development.rb`にセットします。

```ruby:config/environments/development.rb

config.action_mailer.delivery_method = :letter_opener
config.action_mailer.perform_deliveries = true
```

`action_mailer`のさまざまな設定に関しては、[Railsガイドの Rails アプリケーションを設定する](https://railsguides.jp/configuring.html#action-mailer%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)のページに一気に載っています。

- [3.12 Action Mailerを設定する](https://railsguides.jp/configuring.html#action-mailer%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)

上記は、それぞれ

- `config.action_mailer.delivery_method` ... 配信方法を指定。詳細は[Action Mailerガイド](https://railsguides.jp/action_mailer_basics.html#action-mailer%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)も参照
- `config.action_mailer.perform_deliveries` ... メールを実際に配信するかどうかを指定します。デフォルトは`true`。

もう一つ、今回は以下のような設定も追記しました。

```ruby:config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost:3000' }
```

こちらは、[Railsガイドのこちらの項目](https://railsguides.jp/action_mailer_basics.html#action-mailer%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)に詳しい設定が載っていたのですが、アプリケーションのホスト情報をメイラー内で使うためのオプションだそうです。

メール送信機能そのものは別途実装で、それはこちらの記事で書きました。(letter_openerとの接続は出てきませんが。。。)
[Railsでメール送信機能を実装する](https://qiita.com/tanutanu/items/e0e9f1aaeed47c616c6b)

[Railsチュートリアル](https://railstutorial.jp/chapters/account_activation?version=5.1#sec-account_activation_emails)では、メール送信機能は、Railsのデフォルトの機能を利用して作っていましたね。こちらもいつかやり直してみたいです。

それでは、ここまで読んでくださり、ありがとうございました:relaxed: