HTML_Emoji を使った絵文字メールの処理

目次

はじめに

ここでは、メールの絵文字を HTML_Emoji ライブラリでどのように処理すれば良いかを説明します。 ただし、以下の説明は私が実際に調べたわけではなく、 インターネットで集めた情報に推測を交えて書いています。 動作確認もしておりませんので、どなたか実際に試してみて、 本当にこれでうまくいくのかどうかを教えていただけると幸いです。

また、HTML_Emoji ライブラリ自身は、メールを送受信する機能は持っていません。 メールを送受信する部分については、mail() 関数やメール用のライブラリを用いて下さい。

絵文字メールの受信

通常の携帯メールの場合

docomo, SoftBank の携帯から、携帯以外にメールを送ると、絵文字は〓に変換されて届きます。 そのため、これらの携帯からはメールで絵文字を受け取ることはできません。

一方、au の携帯からは、メールに含まれている絵文字もそのまま届きます *1。 受信したメールは、次のように convertEncoding() メソッドか JisToUtf8 フィルタを用いることによって、 UTF-8 に変換することができます。

// HTML_Emoji ライブラリの読み込み
require_once 'HTML/Emoji.php';

// メールアドレスからキャリアを判別
// 3キャリアを全て $carrier = 'au'; にしても一応は動くはず
$carrier = ......

// 送信元のキャリア用の HTML_Emoji オブジェクトを作成
$emoji = HTML_Emoji::getInstance($carrier);

// 絵文字の混じったメールを UTF-8 に変換
$text = $emoji->convertEncoding($text, 'UTF-8', 'JIS');

UTF-8 に変換してしまえば、後はフォームから入力されたデータと同じように扱うことができます。

Gmail を経由する場合

docomo や SoftBank のメールから絵文字を受け取るには、 Gmail のメールアドレス宛てにメールを送ってもらい、 そこから別のメールアドレスに転送するという方法があります。 このように Gmail を経由すると、絵文字が〓に変換されることなく届きます。 この方法を取った場合、メールは Shift_JIS で届きますので、 フォームからの入力と同じように SjisToUTf8 フィルタで変換してやれば、 メールに含まれている絵文字を処理できます。

au のメールを Gmail 経由で受信するとどうなるかがはっきりしないのですが、 おそらく ISO-2022-JP エンコーディングで届くのではないかと思いますので、 JisToUTf8 フィルタで処理すれば大丈夫だと思います。

絵文字メールの送信

docomo, au の場合は Shift_JIS で、SoftBank の場合は UTF-8 で送るのが良いそうなので、 Web ページに表示する場合と同じように、次のようにすれば良いはずです。

// HTML_Emoji ライブラリの読み込み
require_once 'HTML/Emoji.php';

// メールアドレスからキャリアを判別
$carrier = ......

// 送信先のキャリア用の HTML_Emoji オブジェクトを作成
$emoji = HTML_Emoji::getInstance($carrier);

// 絵文字をエスケープしないで出力するように設定
$emoji->disableEscaping();

// UTF-8 で書いたメールの読み込み
$text = ......

// 各端末に適した形にテキストを変換
$text = $emoji->filter($text, 'output');

// メールの送信
......

なお、au の Shift_JIS 絵文字コードには2種類あり、 通常は「KDDI絵文字用Shift-JISコード」に変換していますが、 HTML_Emoji::getInstance('aumail'); とすると、 「Eメール送出用JISコードに対応したShift-JISコード」に変換するようにしてあります。 メール送信時には、こちらのコードを用いることを推奨します。

実際には、どちらのコードを使っても大丈夫なようなのですが、 au の 技術情報のページ には、 メールを送信する際には後者のコードを使うよう書かれています。 また、以下の書き込みにあるように、 IS03 などのスマートフォンは後者のコードしか受け付けないようです。


*1 WILLCOM からのメールでも絵文字は届くのですが、現在のバージョンの HTML_Emoji では対応していません。