letter_openerで添付ファイル名の日本語がアンダースコア(_)に変換されてしまう問題の解決方法です。
letter_openerやletter_opener_webで添付ファイル名に日本語が含まれていると、
ダウンロード時に_
に変換されてしまいます。


問題のコードはこちら。
https://github.com/ryanb/letter_opener/blob/master/lib/letter_opener/message.rb#L122
def attachment_filename(attachment) attachment.filename.gsub(/[^\w\-.]/, '_') end
日本語があると全部 _
に変換しちゃってますね。。。
解決方法
パッチを当てるにあたって、
letter_openerやletter_opener_webのバージョンが古いと後述のコードを足しても治らないのでupdateします。
$ bundle update --source letter_opener $ bundle update --source letter_opener_web
それぞれ以下のバージョン以上であれば問題ないです。
letter_opener (1.7.0) letter_opener_web (1.4.0)
実際のパッチがこちらです。
config/initializers/letter_opener/message.rb
if defined? LetterOpenerWeb LetterOpener::Message.class_eval do def attachment_filename(attachment) URI.encode(attachment.filename) end end end
問題のメソッドをclass_evalで上書きします。
ファイル名に日本語が含まれている場合は、エンコードするようにしました。
たいていletter_opener_webは開発環境(Rails.env.develpment?)でしか使わないと思うので、
if defined?
で productionでも動作するようにしています。
これがないとproductionでrails起動時にエラーが発生します。

エンコードされたURLが埋め込まれて、ダウンロード時は日本語がファイル名に含まれるようになります。
本家にPR出した
本家にPRを出したのでマージされてほしい、、
コメントを残す