mail-iso-2022-jp gem を用いた際に Encoding::UndefinedConversionError が発生
Rails のアプリケーションで mail-iso-2022-jp gem の 1.1.6 を使っていたところ、表題のエラーが発生。
gem の中身を確認してみました。
vi /path/to/gem/mail-iso-2022-jp-1.1.6/lib/mail-iso-2022-jp/patches.rb
# coding:utf-8 require 'mail' require 'base64' module Mail WAVE_DASH = "〜" # U+301C FULLWIDTH_TILDE = "〜" # U+FF5E if RUBY_VERSION >= '1.9' ENCODE = {'iso-2022-jp' => Encoding::CP50221} def self.encoding_to_charset(str, charset) str.encode(ENCODE[charset.to_s.downcase] || charset).force_encoding(charset) end # 略 end end
12行目の str.encode で例外が発生しているようです。
例外をキャッチしてもいいのですが、今回はとにかくメールを飛ばす事を優先したかったので次のように修正。
str.encode((ENCODE[charset.to_s.downcase] || charset), :invalid => :replace, :undef => :replace).force_encoding(charset)
これで不正なバイト列と未定義の文字を?で置き換えるようになりました。