Hatena::ブログ(Diary)

zenpouの日記 このページをアンテナに追加 RSSフィード

2008-09-23

[]携帯電話に絵文字入りメールをRailsから送信する。

本日、jpmobileを使って、絵文字入りのmailを携帯に対して送りたいと言う話がきました。

と言うわけで、Railsで絵文字入りメールを送る方法: ぐうたら技術屋のTipsを参照して

モジュールを作ってみた。


ActionMailer::Baseを上書きする。

class ActionMailer::Base
  def create!(*)
    super
    @mobile_filter = nil 
    @docomo_or_au = nil 
    dummy_controller = DummyController.new
    if @mail.to.to_s.split(/@/).size == 2
      if @mail.to.to_s.split(/@/)[1] =~ /docomo.ne.jp/
        dummy_controller.request.mobile = Jpmobile::Mobile::Docomo.new({})
        @mobile_filter = true
        @docomo_or_au = true
      elsif @mail.to.to_s.split(/@/)[1] =~ /ezweb.ne.jp/
        dummy_controller.request.mobile = Jpmobile::Mobile::Au.new({})
        @mobile_filter = true
        @docomo_or_au = true
      elsif @mail.to.to_s.split(/@/)[1] =~ /softbank.ne.jp/ || @mail.to.to_s.split(/@/)[1] =~ /vodafone.ne.jp/
        dummy_controller.request.mobile = Jpmobile::Mobile::Softbank.new({})
        @mobile_filter = true
      end 
    end

    if @mobile_filter
      mail_title = @docomo_or_au ? NKF.nkf("-xWs", @mail.subject) : @mail.subject
      mail_title = Jpmobile::Filter::Emoticon::Outer.new.to_external(mail_title, dummy_controller)
      @mail.subject = @docomo_or_au ? mail_title : Base64.b64encode(mail_title)
      @mail.body = @docomo_or_au ? NKF.nkf("-xWs", @mail.body) : @mail.body
      @mail.body = Jpmobile::Filter::Emoticon::Outer.new.to_external(@mail.body, dummy_controller)
      @mail.body = @docomo_or_au ? @mail.body : Base64.b64encode(@mail.body)
      @mail.set_content_type "text/plain; charset=#{@docomo_or_au ? 'Shift_JIS' : 'UTF-8'}"
      @mail.transfer_encoding = "base64" unless @docomo_or_au
    end 
    @mail
  end 


  class DummyController
    attr_accessor :request
    def initialize
      self.request = DummyRequest.new
    end 

    class DummyRequest
      attr_accessor :mobile
    end 
  end 
end

(9/25修正: id:walf443さんのコメントを受けて修正)

上のPGをlib/mobile_emoji_mail.rbとかで保存して、

config/enviroment.rbの最後の方に

require 'mobile_emoji_mail'

とかすれば動くはず。

ちなみにjpmobile必須です。

後、元サイトに書いてあるjpmobileの修正は必須。

一点目。lib/jpmobile/filter.rb

    case controller.request.mobile.to_s
    when Jpmobile::Mobile::Docomo.to_s
      table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_DOCOMO
      to_sjis = true
    when Jpmobile::Mobile::Au.to_s
      table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_AU
      to_sjis = true
    when Jpmobile::Mobile::Jphone.to_s
      table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK
      to_sjis = true
    when Jpmobile::Mobile::Softbank.to_s
      table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK
    end

to_sをつける形。(9/25追記:コードのミスによりそうなっており、必要無かった様です。)

svn logは

--- vendor/plugins/jpmobile/lib/jpmobile/filter.rb      (revision 1830)
+++ vendor/plugins/jpmobile/lib/jpmobile/filter.rb      (revision 1831)
@@ -154,17 +154,17 @@
           # 使用する変換テーブルの決定
           table = nil
           to_sjis = false
-          case controller.request.mobile
-          when Jpmobile::Mobile::Docomo
+          case controller.request.mobile.to_s
+          when Jpmobile::Mobile::Docomo.to_s
             table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_DOCOMO
             to_sjis = true
-          when Jpmobile::Mobile::Au
+          when Jpmobile::Mobile::Au.to_s
             table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_AU
             to_sjis = true
-          when Jpmobile::Mobile::Jphone
+          when Jpmobile::Mobile::Jphone.to_s
             table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK
             to_sjis = true
-          when Jpmobile::Mobile::Softbank
+          when Jpmobile::Mobile::Softbank.to_s
             table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK
           end

で、後2点目lib/jpmobile/emoticon.rb

[converted-0x1000].pack("U")

svn ログは

Index: vendor/plugins/jpmobile/lib/jpmobile/emoticon.rb
===================================================================
--- vendor/plugins/jpmobile/lib/jpmobile/emoticon.rb    (revision 1832)
+++ vendor/plugins/jpmobile/lib/jpmobile/emoticon.rb    (revision 1833)
@@ -87,7 +87,9 @@
           if sjis = UNICODE_TO_SJIS[converted]
             [sjis].pack('n')
           elsif webcode = SOFTBANK_UNICODE_TO_WEBCODE[converted-0x1000]
-            "\x1b\x24#{webcode}\x0f"
+            [converted-0x1000].pack("U")
           else
             # キャリア変換テーブルに指定されていたUnicodeに対応する
             # 携帯側エンコーディングが見つからない(変換テーブルの不備の可能性あり)。

こんな感じになりました。


参照元のエントリに感謝。

walf443walf443 2008/09/25 04:08 参照元のページのコメントにも一応書いたのですが、jpmobileにパッチをあててる.to_sのところはおそらくrequest.mobileに間違ったものを代入しているのが原因で、

dummy_controller.request.mobile = Jpmobile::Mobile::Docomo

のところは

dummy_controller.request.mobile = Jpmobile::Mobile::Docomo.new({})

とかいうようにインスタンスを入れるようにするとjpmobile/filter.rbにはパッチをあてる必要はないのではないかと思います。

Jpmobile::Mobile::Docomo === Jpmobile::Mobile::Docomo
#=> false

Jpmobile::Mobile::Docomo === Jpmobile::Mobile::Docomo.new({})
#=> true

なので。

それとメールアドレスの判定の部分なのですが、
元のページのようにやらないと、例えば、
docomo.ne.jp@ezweb.ne.jpとかいうアドレスがあった際に誤判定してしまうのではないかと思います。

それとソフトバンクの際にi.softbank.jpも判定されるようなのですが、iPhoneの場合は絵文字メールを送信しても表示できないので除外してあげた方が親切かなとは思います。(基本的には送信するアドレス一覧には入らないと思いますが;)

zenpouzenpou 2008/09/25 09:40 ご指摘ありがとうございます!(エントリの方修正しました。)

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


画像認証

トラックバック - http://d.hatena.ne.jp/zenpou/20080923/1222181105