Redmineでもletter_openerを使って調整したメールを確認してみよう。

## これはなに？

- Redmineでは、メール本文のヘッダやフッタのカスタマイズができます
- このカスタマイズが問題ないかどうか、[letter_opener](https://github.com/ryanb/letter_opener)というgemを使って確認する方法をご紹介します

### どういう人向けの記事？

このgemは、Railsでは非常に利用されているgemです。
どちらかというとRubyやRails専門ではないけれど、**Redmineを運用**したり、必要に応じて**カスタマイズしたい人向け**になります。

- **developmentモード** で利用が前提のgemのため、開発環境で検証する方法を理解している方向けになります
 - カスタマイズの際に、まずdevelopmentモードで機能を追加調整する方針をとっている方
 - その上で本番に適用する、という流れを実施できる方 

### どういうシーンに使うと便利？

- Redmineでメール部分のカスタマイズをしている方向け
- 管理画面からのヘッダ / フッタ調整だけでなく、内部のメール用のテンプレートをカスタマイズしたい場合
- プラグインでメールをカスタマイズしたり**通知を追加**したりする場合

想定通りの文言が当てはまってメールが生成されているかを確認しやすくなります。

### やらないこと

- Qiita上にも[letter_openerの記事](https://qiita.com/search?q=letter_opener)はたくさんありますので、詳細には触れません

## letter_openerの設定

公式の[README](https://github.com/ryanb/letter_opener/blob/master/README.md#rails-setup)に記載がある通り進めればOKです。
RedmineもRailsアプリケーションなので、Gemfileとdevelopment.rbの設定のみで利用できるようになります。

- https://github.com/ryanb/letter_opener/blob/master/README.md#rails-setup (Rails Setup)


### まずはgemの追加

- Redmineのソースをダウンロード（clone) します
- Redmine直下のGemfileに、以下を追記します

```ruby:Gemfile
gem "letter_opener", :group => :development
```

追加したら、この追加gemを取得するため、``bundle install`` を実行します。すでにRedmineに必要なgemが入っており、あとからその環境に追加する場合でも、同じくbundle install (bundle) であれば、追加で入ります。

```bash
# オプション無しだとdevelopmentモードのgemを取得します
bundle install
```

### 設定ファイルの調整

#### Redmine公式のメール設定を確認

Redmineの公式サイトでの、メール送信設定は以下に記載があります。

- https://redmine.org/projects/redmine/wiki/EmailConfiguration (Email Configuration)

基本は、``config/configuration.yml.example`` を元に ``config/configuration.yml`` ファイルを作成し、設定をしていきます。

developmentモードでも実際にsmtpを使ってメール送信を試すことができますが、デフォルトでは送信はされず、ログに送信メッセージが出力されます。

#### letter_openerの設定を追加する

##### letter_openerのREADMEに沿って設定する場合

developmentモードではメール送信をせず、letter_openerで確認する場合は、``config/environments/development.rb`` に追記します。

```ruby:config/environments/development.rb
config.action_mailer.delivery_method = :letter_opener
config.action_mailer.perform_deliveries = true
```

Redmineにも ``config/environments/development.rb`` があるので、上記の通りの追記で利用が可能です。

##### Redmineのconfig/configuration.ymlを使う場合

Redmine公式のメール設定にも記載がある通り、こちらでも送信設定を調整することができます。
delivery_methodをletter_openerに設定となります。

```yml:config/configuration.yml
development:
  email_delivery:
    delivery_method: :letter_opener
    perform_deliveries: true
```

## メールを送って確認してみる

developmentモードでチケットを作成、終了してみた例です。

- メール送信対象のものは、tmp/letter_opener/ 以下に書き出されます
- 実際の送信内容と同じく、メールのテンプレートに変数が展開された形で書き出しになります

<img width="1069" alt="mail-sending.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/d3a6c3de-9ba9-3ce5-6054-03859ee4f22f.png">

### カスタマイズしたメールの確認

Redmineに慣れていない場合は、ユーザの方が直にメールに返信してしまう、ということもありがちです。

運用の初めのころは、そういったことも配慮して「このメールには返信しないでくださいね！」的なメッセージを追加していました。

Redmineの管理画面では、メール本文の上部と下部（ヘッダ / フッタ）に簡単にメッセージを追加できますので、試しに設定して、想定通りになっているか確認してみます。

**Redmineの管理画面**

<img width="512" alt="redmine-setting.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/7f89ba73-6791-57fa-27c9-6ed443292e85.png">

結果はこのような感じ。

<img width="748" alt="mail-customize.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/07f103d6-7337-bf14-9f3d-8f96fd099c78.png">

簡単ですが、十分に確認ができますね！

## letter_opener_webも使う場合

letter_openerは、送信メールを**ファイルに書き出してくれる**gemです。

さて、letter_openerはファイルシステムに書き出すため、ローカル開発環境やターミナルでの確認はできますが、開発環境がサーバにある場合は、ちょっと確認がしづらいですね。

こちらもRails開発ではポピュラーですが、[letter_opener_web](https://github.com/fgrehm/letter_opener_web)というgemを追加すると、Railsアプリケーションに同居する形で、ブラウザを通してletter_openerで書き出したメールを確認することができます。

### 追加するものは？

Gemfileに以下を追加します。

```ruby
# developmentモードでのみ利用します
group :development do
  gem 'letter_opener_web', '~> 1.0'
end
```

- gem "letter_opener" 単体を先に追加していれば、置き換えをします
- bundle installの際に、依存関係でletter_openerも入ります
- 上記の通り、**letter_openerの設定**が必要です
  - ``delivery_method = :letter_opener``

### ルーティングを追加

letter_opener_webのREADMEに記載のあるとおり、ルーティングを追加します。

- https://github.com/fgrehm/letter_opener_web#usage
- こうすることで、http://localhost:3000/letter_opener にアクセスすると、tmp/letter_opener のディレクトリが参照できます
- Redmineへは、``config/routes.rb`` の末尾（最後のendの手前）に追加で大丈夫です

```ruby:config/routes.rb

# 設定例
redmine $ svn diff config/routes.rb
Index: config/routes.rb
===================================================================
--- config/routes.rb	(revision 19511)
+++ config/routes.rb	(working copy)
@@ -374,4 +374,6 @@
       end
     end
   end
+
+  mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development?
 end
```

- ``mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development?`` を追加して再起動します

### ブラウザから確認してみる

ふたたびメール送信対象の操作をしてみます。
こちらはチケット変更の例。

<img width="888" alt="letter_opener_web.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/e6695fc6-76ee-8da3-25e3-1f980d70b010.png">

ブラウザでアクセスすると、新しいメールから降順に一覧が表示されます。
また、右側には最新のメールが表示されます。

キャプチャの左隅の、tmp/letter_opener/ 側の件数と一致します。
letter_opener_webの画面から、不要になったメールを削除することも可能です。


## まとめ

以上、簡単な例でした。

一度通知が出てしまうと、相手のもとに届いてしまったメールは取り消せません。**必要以上の情報が盛り込まれていないか？宛先は適切か？**など、心配なことがありますね。
Redmineに限らず、慎重さが必要なメールに関しては、こういったツールでチェックができるというのは、とても助かりますね。

実運用の際の、なにかにお役に立てば幸いです。