letter_opener_webをRails3.2+ruby1.9.3の環境で使う

送信メール確認用にdevelopment環境ではletter_openerを使っていたのですが dockerへ移行したので動かなくなりました。。

そこで、Webインターフェースで送信メールを確認できるletter_opener_webに乗り換えました。 ただ、Rails3.2+ruby1.9.3という古い環境では簡単にはいかなかったのでメモを残します。

結論

以下の環境で無事動きました

Gemfile

group :development do
  gem 'public_suffix', '~> 1.4.6' 
  gem "letter_opener", '1.4.1' 
  gem 'letter_opener_web', '1.2.2' 
end

docker-compose.yml

services:
  web:
    # 他は省略
    environment:
      - BROWSER=echo

動くようになるまでの道筋

おまけです。

public_suffixのインストールに失敗

依存gemの1つ、public_suffixのインストールで失敗しました。

public_suffix requires Ruby version >= 2.0.

そこで、ruby1.9.3をサポートしているバージョン '1.4.6' にダウングレードします。

参考にしたページ

Ruby 1.9.3 build broken due to public_suffix gem not compatible + Selenium Error · Issue #6885 · travis-ci/travis-ci · GitHub

/letter_openerを開くとエラー

/usr/local/bundle/gems/letter_opener_web-1.3.4/app/controllers/letter_opener_web/letters_controller.rb:8: unknown type of %string
    before_action :load_letter, only: %i[show attachment destroy]
  • %i の記法は ruby2.0からのサポート
  • before_action は Rails4からの機能

このため、letter_opener_web を '1.2.2' にダウングレードしました

Launchy::CommandNotFoundError のエラーが出る

このエラーは letter_opener_web の バージョン1.3.3 から rescue節でハンドリングすることで出ないようになっているのですが 1.2.2 にダウングレードしているためエラーが出てしまいます..

該当のコミット

https://github.com/fgrehm/letter_opener_web/commit/661ef92c9c83afa47e913b5ddad264b39f22ad09#diff-b83fce5786125deb6a48e47051caa2fe

環境変数 BROWSER をセットすることで回避します。 ブラウザでなくともコマンドにURLを渡すことさえできればエラーは出ないので 環境変数 BROWSER=echo をセットします。

メール送信時に undefined method `html_part'

letter_opener がエラーを出しています。 以下のページによると バージョン1.4.xではエラーが出ないようなので 1.4.1 にダウングレードします。

undefined method `html_part' for #<String:0x00007f5b16161520> · Issue #147 · ryanb/letter_opener · GitHub