SoftBankで絵文字メールを送る方法
SoftBankの端末に、絵文字入りのテキストメールを送る必要があり、試行錯誤していたのですが、うまくいかない。
ke-tai.orgで紹介されていた方法
参考にした情報はこちら。
「ケータイに絵文字入りメールを送信するには(SoftBank編) | ke-tai.org - インフィニットループ」
Shift_JISで本文を書き、Webで表示するのと同じ方法でバイナリ文字を入れる方法だ。
<?php //色付け $subject = "\x1b\$Pe\x0f絵文字入り題名デス\x1b\$OW\x0f"; $body = "絵文字入りの\x1b\$E#\x0f本文デス。\x1b\$E%\x0f";
こんな感じ。
詳しくは、SoftBankのWebサイト参照してください。
「ページが見つかりません」
ですが、この方法では問題が出てきます。
ke-tai.orgのコメントにも書かれていますが、以下のような問題があります。
絵文字が出ないだけでなく、どちらも「$Pe」という文字が出てしまうので見栄えがわるくなってしまいます。
別の方法を模索
\x1b \x0fではさむ方法ではなく、バイナリで埋め込めば出るだろうと予想して、その方法を模索したがうまくいかない。
SoftBankのサイトには、Unicodeの指定方法が載っているが、こちらをpackしてもだめだし、途方にくれてしまった。
Twitterでつぶやく
解決の糸口が見つからずにつぶやく…
http://twitter.com/maru_cc/statuses/812668302
SoftBank に絵文字メール送信ってどうするんだろう。。
そしたら、湯どうふさんが返事をくれました。
http://twitter.com/yudoufu/statuses/812670981
@maru_cc おろ?なんかうまくいってないんですか?
このyudoufu印のざるに乗った豆腐。癒されます。
湯どうふさんと言えば
ついこの間、すばらしいライブラリが公開されたことを思い出しました。
「絵文字ライブラリをPEARパッケージ化&sfPictogramMobilePluginをバージョンアップしました。 : アシアルブログ」
前回のエントリで、中を見た時に、キャリアが指定する表示方法ではなく、packしたバイナリを吐き出すのを面白く感じたことを思い出しました。
で、もしかして、と思って再度ソースを追っかけたところ、SoftBankの絵文字もバイナリで出しています。
簡単なテストプログラムを作成し、UTF-8で絵文字をバイナリデータとしてメールを送ってみたところ、ばっちりいけました!
実際に書いたコード
まずは、ke-tai.orgさんで紹介されている方法
「ケータイに絵文字入りメールを送信するには(SoftBank編) | ke-tai.org - インフィニットループ」
こちらのサンプルでは、SJISでバイナリをソース中に埋め込む方法が紹介されていましたが、プログラムを UTF-8 で記述し、SJISとして送る方法です。
<?php // ソフトバンクに絵文字入りメールを送るサンプル $to = '[ソフトバンクのアドレス]@softbank.ne.jp'; $from = 'example@example.jp'; $subject = mb_convert_encoding("\x1b\$Pe\x0f絵文字入り題名デス\x1b\$OW\x0f", "SJIS", "auto"); $body = mb_convert_encoding("絵文字入りの\x1b\$E#\x0f本文デス。\x1b\$E%\x0f", "SJIS", "auto"); $body = str_repeat($body, 20); //テスト用に長い文章にするため // MIMEエンコーディングを行う $subject = "=?shift_jis?B?" . base64_encode($subject) . "?="; $body = base64_encode($body); // ヘッダを作成 $headers = "From: " . $from . "\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/plain; charset=Shift-JIS\r\n"; $headers .= "Content-Transfer-Encoding: base64"; // メールを送信 $res = mail($to, $subject, $body, $headers); // 結果を取得 if ($res) { echo "OK\n"; } else { echo "NG\n"; }
$body のところで使っている str_repeat関数は、SoftBankの 3G端末の「続きを読む」機能を使用したときのテストのために、本文を長くするために使用しているだけです。
バイナリ埋め込みをする方法
バイナリデータにpackして送る方法です。
"EE9185" とかどこから探したの?ということに関しては、Text_Pictogram_Mobile-0.0.2.tgz の中のデータを見ました。
<?php // ソフトバンクに絵文字入りメールを送るサンプル $to = '[ソフトバンクのアドレス]@softbank.ne.jp'; $from = 'example@example.jp'; $subject = pack("H*", "EE9185") . mb_convert_encoding("絵文字入り題名デス", "UTF-8", "auto") . pack("H*", "EE8CB7"); $body = mb_convert_encoding("絵文字入りの", "UTF-8", "auto") . pack("H*", "EE8483") . mb_convert_encoding("本文デス。", "UTF-8", "auto") . pack("H*", "EE8485"); $body = str_repeat($body, 20); //テスト用に長い文章にするため // MIMEエンコーディングを行う $subject = "=?UTF-8?B?" . base64_encode($subject) . "?="; $body = base64_encode($body); // ヘッダを作成 $headers = "From: " . $from . "\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; $headers .= "Content-Transfer-Encoding: base64"; // メールを送信 $res = mail($to, $subject, $body, $headers); // 結果を取得 if ($res) { echo "OK\n"; } else { echo "NG\n"; }