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のコメントにも書かれていますが、以下のような問題があります。

  • 2G端末で絵文字が出ない (v602SH)
  • 3G端末でも、長い文章で続きをDLすると絵文字が出ない (904SH)

絵文字が出ないだけでなく、どちらも「$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";
}

まとめ

バイナリを使用する方法だと、文字コード変換時に破壊されないように注意する必要があります。


あとあと、すばらしいパッケージの公開に感謝!!
この絵文字のJSONデータの価値はすばらしすぎます。