結論から言っちゃうと、DoCoMo,auはShift_jis、SoftbankはUTF-8をBASE64でエンコードしたものにしてやれば送れます。
あとは、絵文字の文字コードの各キャリア向けの変換ですが、jpmobile(0.0.2)をちょこと変えたものを使用しました。
以下がサンプルコードになります。
def send_mail(mail_address)絵文字のベースは、i絵文字のUnicode形式で挿入されるものを前提としています。(晴れマークなら、。曇りマークなら、とか)まあ、jpmobileがそうだったからですが。
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
when 'ezweb.ne.jp'
dummy_controller.request.mobile = Jpmobile::Mobile::Au
else
dummy_controller.request.mobile = Jpmobile::Mobile::Softbank
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
DummyControllerはActionControllerで使われるのが前提のjpmobileの絵文字コード変換機能を使いたいがために無理やりこさえたクラスで、コードは以下になります。
実装を思い付いたまま書いたので、もっとスマートな書き方はあるかもしれません。
class DummyControllerあとは、jpmobileでうまく動かない部分と変換がSoftbankの絵文字メールの文字コードに対応していなかった部分の修正です。
attr_accessor :request
def initialize
self.request = DummyRequest.new
end
class DummyRequest
attr_accessor :mobile
end
end
一点目。lib/jpmobile/filter.rbの153行目から165行目を以下のように。
case controller.request.mobile.to_s自分の開発環境(Windows Vista)だけかもしれないけど、caseの判定がうまく動いていなかったので、Jpmobile::Mobile::Docomo、Jpmobile::Mobile::Auとかを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
二点目。lib/jpmobile/emoticon.rbの72行目を以下のように。
[converted-0x1000].pack("U")jpmobileでの変換がSoftbankの絵文字メールの文字コードに対応していなかった部分。
以上です。細かい部分はしょりすぎでしょうか?
足らない部分は意見をいただければ、随時修正させていただきます。
これで、皆さんもバンバン絵文字メールを送っていただければと思います。
タグ:携帯 ruby on rails