第8回 メールで絵文字を送りたい - モバイル開発講座 入門・実践編

PHP基礎編

まる先生のモバイル開発講座 入門・実践編

Lecutures on PHP

第8回 メールで絵文字を送りたい (その1)

 このエントリーをはてなブックマークに追加
maru

今回は、アプリケーションから携帯宛にメールを送る方法について取り上げます。
単純にテキストメールを単発で送るだけであれば特別気にする必要はありませんが、半角カナや絵文字を含む携帯用の文面を送るためには、ちょっと手を加える必要があります。

今回のテーマはこちらになります。

  1. 基本的なメールを送る方法
    半角カナを含んだテキストメールを送る方法
  2. 絵文字を含んだテキストメールを送る方法
  3. HTML_Emoji ライブラリを使用してメールを送る
  4. 大量のメール配信をする場合に気をつけること

1.基本的なメールを送る方法

基本的なテキストメールを送るだけであれば、パソコン向けにテキストメールを送るのと変わりはありません。

phpにmbstring拡張モジュールがインストールされている環境であれば、mb_sned_mai関数を使用するのが一番簡単な方法でしょう。

mb_language('ja');
mb_internal_encoding('UTF-8'); // プログラム文字コードがUTF-8の場合
 
$to = '...@docomo.ne.jp'; // 送り先メールアドレス
$from = 'from@example.com'; // 送信元アドレス
$subject = '件名';
$message= '本文';
$header = 'From: ' . $from;
mb_send_mail($to, $subject, $message, $header);

日本語のメールを送る場合、基本的には ISO-2022-JP (JIS) という文字コードで送ることになります。mb_send_mailを使用した場合にも、内部では JIS文字コードに変換されて送信されます。
携帯向けメールとして半角カナを含む場合には、JIS文字コードでは送ることが出来ません。
半角カナを含むメールを送りたい場合には、Shift_JISの文字コードでメールを送る必要があります。

$to = '...@docomo.ne.jp'; // 送り先メールアドレス
$from = 'from@example.com'; // 送信元アドレス
$subject = '件名';
$message = ' 半角カナを含む本文';
 
$subject_b64 = '=?shift_jis?B?' . base64_encode(mb_convert_encoding($subject, 'SJIS', 'UTF-8')) . '?=';
$message_b64 = chunk_split(base64_encode(mb_convert_encoding($message, 'SJIS', 'UTF-8')));
$headers = array();
$headers[] = 'Content-Type: text/plain; charset=Shift_JIS';
$headers[] = 'Content-Transfer-Encoding: base64';
$headers[] = 'From: ' . $from;
$header_line = implode("\n", $headers);
 
mail($to, $subject_b64, $message_b64, $header_line);

※プログラムの文字コードはUTF-8

maru

2.絵文字を含んだテキストメールを送る方法

携帯向けということで、さらに絵文字を含むメールを送る方法は各キャリア次のようになります。
基本的には、各キャリアの絵文字のバイナリを含むテキストをメールで送ることになります。
メール送信の基本処理は、半角カナを送る場合と同じですので、mail関数に渡す本文の $message_b64 変数に入れる文字列のキャリアごとの作り方の違いを見てみましょう。

  • docomo

    絵文字のコードは「作ろうiモードコンテンツ」の絵文字一覧を参照し、16進数の4桁を2桁ずつ「\x」を付けて記述します。
    http://www.nttdocomo.co.jp/service/developer/make/content/pictograph/basic/index.html
    太陽の絵文字のそれぞれのコードは次のように値になります。
    S-JISコード(16進数)「F89F」
    Unicode「E63E」

    $message = '絵文字を含む本文';
    $message_sjis = mb_convert_encoding($message, 'SJIS', 'UTF-8');
    $message_sjis .= "\xF8\x9F"
    // $message_sjis .= mb_convert_encoding("\xE6\x3E", 'SJIS-win', 'UCS-2');
    $message_b64 = chunk_split(base64_encode($message_sjis));

    コメントアウトしている行は、Unicode形式のコードを使う場合の記述方法になります。

  • au

    auの「技術情報>絵文字」の絵文字一覧を参照し、16進数の4桁を2桁ずつ「\x」を付けて記述します。
    docomoのサンプルコードに合わせるために太陽の絵文字を使用します。
    太陽の絵文字は、下記PDFの絵文字番号44番になります。
    Shift-JIS「f660」
    Unicode「e488」
    http://www.au.kddi.com/ezfactory/tec/spec/3.html
    http://www.au.kddi.com/ezfactory/tec/spec/pdf/typeC.pdf (PDF)

    $message_sjis = mb_convert_encoding($message, 'SJIS', 'UTF-8');
    $message_sjis.= "\xF6\x60";
    // $message_sjis.= mb_convert_encoding("\xE4\x88", 'SJIS-win', 'UCS-2');
    $message_b64 = chunk_split(base64_encode($message_sjis));

    コメントアウトしている行は、Unicode形式のコードを使う場合の記述になります。

  • SoftBank

    SoftBankは、フィーチャーフォン、Android、iPhoneすべてに絵文字を送る場合には、UTF-8で送る必要があります。
    (ShiftJISで送ると、Android端末で絵文字が出ない場合があります)
    また、iPhoneでは「softbank.ne.jp」ドメインに送った場合、SMS/MMSとして端末へ届くことになります。
    また、SoftBankの絵文字コードは、Unicodeの記述のみWebで公開されています。
    Unicode「E04A」
    http://creation.mb.softbank.jp/mc/tech/tech_pic/pic_material_1.html

    //$to = '...@softbank.ne.jp'; // 送り先メールアドレス disney.ne.jpも同様
    $from = 'from@example.com'; // 送信元アドレス
    $subject = '件名';
    $message = ' 絵文字を含む本文';
    $subject_b64 = '=?utf-8?B?' . base64_encode($subject) . '?=';
    $message.= mb_convert_encoding("\xE0\x4A", 'UTF-8', 'UCS-2');
    $message_b64 = chunk_split(base64_encode($message));
    $headers = array();
    $headers[] = 'Content-Type: text/plain; charset=UTF-8';
    $headers[] = 'Content-Transfer-Encoding: base64';
    $headers[] = 'From: ' . $from;
    $header_line = implode("\n", $headers);
    mail($to, $subject_b64, $message_b64, $header_line);

    キャリアごとの配信区別を行った場合、auの iPhoneへは、SoftBankの方式では絵文字を送ることが出来ます。
    しかし、au方式のメールでは、現状では化けてしまい絵文字を表示することができません。

  • 1
  • 2


Pick Up Q&A

Q
マジッククォートとmysql_real_escape_string
 このエントリーをはてなブックマークに追加 
A
magic_quotes_gpcでは、SQLインジェクション対処は十分できません。主な理由として、以下が上げられます。 ・magic_quotes_gpcは文字コードを考慮しないで処理するので、Shift_JISを使っている場合、SQLインジェ...

>>続きを読む

SQLインジェクション対策は時と場合で使う関数が変わります。その時にあったものを使いましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)