携帯向けのmail_to

とりあえずRailsで3キャリア対応のサイト作ったりしてるんだけど、携帯端末のメーラに題名や本文を渡して立ち上げさせるのがちょっと面倒。
mailtoだと認識してくれないのでaタグのhrefに"mailto:hogehoge"と書かないといけない。

そんときにパラメータでsubjectやbodyにエスケープされた日本語文字列を渡せばちゃんと題名や本文が入った状態でメーラが立ち上がってくれる。
んだけど、最近のソフトバンク端末はutf8、それ以外はsjisの日本語文字列を渡さないとどっかのキャリアで文字化けしちゃう。


そんなわけでapplication_helper内にmobile_mail_toみたいなのを用意。jpmobileを使ってる前提です。

def mobile_mail_to(email_address, name, html_options = {})
  html_options = html_options.stringify_keys
  subject, body = html_options.delete("subject"), html_options.delete("body")
  
  # subjectとbodyをエンコード
  encoded_subject = mailto_string subject
  encoded_body    = mailto_string body
  
  "<a href=mailto:#{email_address}?subject=#{encoded_subject}&body=#{encoded_body}>#{name}</a>"
end

# mailto用文字エンコード変更
def mailto_string(strings)
  return "" unless strings
  result_string =""

  # ソフトバンクの以外はsjis化、ソフトバンクはutf8化してからエスケープをかける。
  unless request.mobile.is_a?(Jpmobile::Mobile::Softbank)
    result_string = CGI.escape(strings.tosjis)
  else
    result_string = CGI.escape(strings.toutf8)
  end

  result_string
end

これで

mobile_mail_to 'info@hoge.com',
               '会員登録',
               :subject => 'このまま送ってね',
               :body => '会員登録用のメールでーす'

みたいにすれば"会員登録"という文字にmailto用のリンクを張ってくれて、クリックするとメーラに題名と本文も入れてくれる。

もう少しやるなら、mail_to自体をオーバーライドしちゃって携帯端末じゃなければ普通のmailtoで出力して、携帯端末ならこのmobile_mail_toに渡すのがよさそうですね。