カテゴリー
PC

bsfilterの「invalid byte sequence in EUC-JP」を回避する

bsfilterでメールを処理していると、以下のようなエラーが出るときがあります。

/path/bsfilter:1371:in `gsub': invalid byte sequence in EUC-JP (ArgumentError)
	from /path/bsfilter:1371:in `decode_character_reference'
	from /path/bsfilter:1590:in `tokenize_body'
	from /path/bsfilter:1303:in `tokenize_buf'
	from /path/bsfilter:2799:in `block (2 levels) in do_imap'
	from /path/bsfilter:2796:in `each'
	from /path/bsfilter:2796:in `block in do_imap'
	from /path/bsfilter:2794:in `each'
	from /path/bsfilter:2794:in `do_imap'
	from /path/bsfilter:3442:in `run'
	from /path/bsfilter:3494:in `<main>'

これを回避するには、Ruby2.1.0以降では、decode_character_refrence()関数の冒頭を以下のようにします。

  def decode_character_reference(str, lang)
    if (@options["utf-8"])
      newstr2 = str.scrub('?') # この行を追加。下の行のstrをnewstr2に変更
      newstr = newstr2.gsub(/\&\#(\d{1,5}|x[\da-f]{1,4});/i) do