2008年07月31日

Railsで絵文字入りメールを送る方法

 最近は携帯向けメルマガでも絵文字入りメール使うところが増えてきているみたいですね。今回はRailsの場合に絵文字入りメールを送る場合はどうやるのかを調べてみました。

 結論から言っちゃうと、DoCoMo,auはShift_jis、SoftbankはUTF-8をBASE64でエンコードしたものにしてやれば送れます。

 あとは、絵文字の文字コードの各キャリア向けの変換ですが、jpmobile(0.0.2)をちょこと変えたものを使用しました。

 以下がサンプルコードになります。
  def send_mail(mail_address)
mail = TMail::Mail.new
docomo_or_au = (mail_address.ends_with?('docomo.ne.jp') || mail_address.ends_with?('ezweb.ne.jp'))
dummy_controller = DummyController.new
if mail_address.split('@').size == 2
case mail_address.split('@')[1]
when 'docomo.ne.jp'
dummy_controller.request.mobile = Jpmobile::Mobile::Docomo.new({})
when 'ezweb.ne.jp'
dummy_controller.request.mobile = Jpmobile::Mobile::Au.new({})
else
dummy_controller.request.mobile = Jpmobile::Mobile::Softbank.new({})
end
else
logger.error "invalid mail address:#{mail_address}"
return
end
mail_title = docomo_or_au ? NKF.nkf("-xWs", self.title) : self.title
mail_title = Jpmobile::Filter::Emoticon::Outer.new.to_external(mail_title, dummy_controller)
mail.subject = docomo_or_au ? mail_title : "=?UTF-8?B?" + Base64.b64encode(mail_title) + "?="
mail_body = docomo_or_au ? NKF.nkf("-xWs", self.body) : self.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.date = sent_at
mail.from = "hogehoge@hogehoge.com"
mail.to = mail_address
mail.set_content_type "text/plain; charset=#{docomo_or_au ? 'Shift_JIS' : 'UTF-8'}"
mail.transfer_encoding = "base64" unless docomo_or_au
begin
ActionMailer::Base.deliver mail
rescue Exception
logger.error "error sending to #{mail.to}: #{$!}"
end
end
 絵文字のベースは、i絵文字のUnicode形式で挿入されるものを前提としています。(晴れマークなら、。曇りマークなら、とか)まあ、jpmobileがそうだったからですが。
 DummyControllerはActionControllerで使われるのが前提のjpmobileの絵文字コード変換機能を使いたいがために無理やりこさえたクラスで、コードは以下になります。
 実装を思い付いたまま書いたので、もっとスマートな書き方はあるかもしれません。
  class DummyController
attr_accessor :request
def initialize
self.request = DummyRequest.new
end

class DummyRequest
attr_accessor :mobile
end
end
 あとは、jpmobileでうまく動かない部分と変換がSoftbankの絵文字メールの文字コードに対応していなかった部分の修正です。

 一点目。lib/jpmobile/filter.rbの153行目から165行目を以下のように。
    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
 自分の開発環境(Windows Vista)だけかもしれないけど、caseの判定がうまく動いていなかったので、Jpmobile::Mobile::Docomo、Jpmobile::Mobile::Auとかをto_sするように。

 二点目。lib/jpmobile/emoticon.rbの72行目を以下のように。
[converted-0x1000].pack("U")
 jpmobileでの変換がSoftbankの絵文字メールの文字コードに対応していなかった部分。

 以上です。細かい部分はしょりすぎでしょうか?
 足らない部分は意見をいただければ、随時修正させていただきます。
 これで、皆さんもバンバン絵文字メールを送っていただければと思います。

【追記:2009/04/01】
 今更ですけど、 よしみさんに指摘していただいたものを反映し、jpmobileの変更を1箇所必要ないものにしました。

人気blogランキング


posted by よっしぃ at 20:02 | Comment(1) | TrackBack(1) | Ruby On Rails
この記事へのコメント
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

なので。

Posted by よしみ at 2008年09月25日 03:45
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/103947251

この記事へのトラックバック

携帯電話に絵文字入りメールをRailsから送信する。
Excerpt: 本日、jpmobileを使って、絵文字入りのmailを携帯に対して送りたいと言う話がきました。 と言うわけで、よしぶろっIP: Railsで絵文字入りメールを送る方法を参照して モジュールを作ってみ..
Weblog: zenpouの日記
Tracked: 2008-09-23 23:45
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。