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箇所必要ないものにしました。

posted by よっしぃ at 20:02 | Comment(1) | TrackBack(1) | Ruby On Rails

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

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