紅孔雀 このページをアンテナに追加 RSSフィード

2011-10-02 Rails3 でのメール送信

[Ruby on Rails] Ruby1.9 + Rails3 でメール送信時に出力される警告の対応

Ruby1.9 + Rails3 でメール送信を行ったときに、以下のような警告が出力されました。

(省略)/ruby-1.9.2-p136/lib/ruby/1.9.1/net/protocol.rb:305: warning: regexp match /.../n against to UTF-8 string

原因は net/protocol.rb の 305 行目において、エンコーディングが UTF-8 である(ASCII-8BIT ではない)文字列に対して n オプションを指定した正規表現でマッチさせているため。正規表現の n オプションを指定するとバイト列として扱われますが、マルチバイト文字に対して n オプションを指定した正規表現を使用しているため、上記警告が出力されます。

対処法としては次のアプローチが考えられますが、n オプションを指定した正規表現でマッチさせる側で対象の文字列のエンコーディングを ASCII-8BIT にするべきだと考えたので、(A) の対応を行いました。

  • (A) 警告が出ている箇所の直前で文字列を ASCII-8BIT に変更するように net/protocol.rb を修正するパッチを作成する。
  • (B) ASCII-8BIT にエンコーディングを設定した文字列を渡すように ActionMailer を修正するパッチを作成する。

作成したパッチ:

# config/initializers/net_protocol_patch.rb
require 'net/protocol'

class Net::InternetMessageIO

  private

  def each_crlf_line_with_force_encoding(src)
    buffer_filling(@wbuf, src) do
      @wbuf.force_encoding('ASCII-8BIT')
      while line = @wbuf.slice!(/\A.*(?:\n|\r\n|\r(?!\z))/n)
        yield line.chomp("\n") + "\r\n"
      end
    end
  end
  alias_method_chain :each_crlf_line, :force_encoding

end

meeker-botmeeker-bot 2012/01/28 15:44 ありがとうございました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/benikujyaku/20111002/1317536555