* 絵文字メール送信(Perl+Encode::JP::Mobile) [#rb16e0cf]

** 目的 [#xbb54875]
3キャリア(+PC)対応した絵文字メール送信処理を作る。絵文字は件名・本文共に使用可能にする。

** 方針 [#r542d1d0]

- ドコモとAUはSJISで、ソフトバンクはUTF8で、PCはISO-2022-JPで件名・本文をエンコーディングする。
-- その他の文字コードでも(絵文字なし・ありの)メール送信が可能な場合もあるが、一番問題がなく、メジャーな選択は上記の文字コードになるようだ。
- 絵文字はドコモのSJISコードを使って指定する。
-- SJISコードは人間の目には見づらいので、絵文字対応表を自作してニーモニックで記述できるようにしてもよいと思う。
- Encode::JP::Mobileで絵文字を含めた文字列のエンコーディングを各キャリア向けに変換する。
- Mail::Address::MobileJpを使って、メールアドレスからキャリアを判別する。
- MIME::Base64を使って、本文のMIMEエンコードをする。
-- Encode::JP::MobileやMail::Address::MobileJpの次のバージョンではMIMEエンコード機能を取り入れるようだ。そうなれば、コードをより簡潔に記述出来ると思われる。

** サンプルコード [#hac13ca5]

 use utf8;
 use Encode;
 use Encode::JP::Mobile;
 use Mail::Address::MobileJp;
 use MIME::Lite;
 use MIME::Base64;
 
 my $email_from  = 'taro@example.net';
 my $from_name   = '太郎';
 my $email_to    = 'hanako@ezweb.ne.jp';
 my $subject     = "件名です";
 my $body        = "本文です";
 my $emoji_bytes = "\xF8\x9F"; # ドコモのSJISコード「太陽」
 my $emoji_chars = decode( 'x-sjis-imode', $emoji_bytes );
 
 my $from_name_encoded =
   is_imode($email_to)
   ? '=?SHIFT-JIS?B?' . MIME::Base64::encode_base64( encode( 'x-sjis-docomo', $from_name ), '' ) . '?='
   : is_softbank($email_to)
   ? '=?UTF-8?B?' . MIME::Base64::encode_base64( encode( 'x-utf8-softbank', $from_name ), '' ) . '?='
   : is_ezweb($email_to)
   ? '=?SHIFT-JIS?B?' . MIME::Base64::encode_base64( encode( 'x-sjis-kddi-auto', $from_name ), '' ) . '?='
   : '=?ISO-2022-JP?B?' . MIME::Base64::encode_base64( encode( 'iso-2022-jp', $from_name ), '' ) . '?=';
 my $email_from_encoded = sprintf '%s <%s>', $from_name_encoded, $email_from;
  
 $subject .= $emoji_chars;
 my $subject_encoded =
   is_imode($email_to)
   ? '=?SHIFT-JIS?B?' . MIME::Base64::encode_base64( encode( 'x-sjis-docomo', $subject ), '' ) . '?='
   : is_softbank($email_to)
   ? '=?UTF-8?B?' . MIME::Base64::encode_base64( encode( 'x-utf8-softbank', $subject ), '' ) . '?='
   : is_ezweb($email_to) ? encode( 'x-sjis-kddi-auto', $subject )
   :   '=?ISO-2022-JP?B?' . MIME::Base64::encode_base64( encode( 'iso-2022-jp', $subject ), '' ) . '?=';
 
 my $body_encoded =
     is_imode($email_to)    ? encode( 'x-sjis-docomo',    $body . $emoji_chars )
   : is_softbank($email_to) ? encode( 'x-utf8-softbank',  $body . $emoji_chars )
   : is_ezweb($email_to)    ? encode( 'x-sjis-kddi-auto', $body . $emoji_chars )
   :                          encode( 'iso-2022-jp', $body . $emoji_chars );
 
 my $encoding =
     is_imode($email_to)    ? 'base64'
   : is_softbank($email_to) ? 'base64'
   : is_ezweb($email_to)    ? 'base64'
   :                          '7bit';
 
 my $msg = MIME::Lite->new(
     From     => $email_from_encoded,
     To       => $email_to,
     Subject  => $subject_encoded,
     Data     => $body_encoded,
     Encoding => '8bit',
     Encoding => $encoding,
 );
 $msg->attr( 'content-type' => 'text/plain' );
 $msg->attr(
     'content-type.charset' => (
           is_imode($email_to)    ? 'Shift_JIS'
         : is_softbank($email_to) ? 'UTF-8'
         : is_ezweb($email_to)    ? 'Shift_JIS'
         : 'ISO-2022-JP'
     )
 );
 $msg->send;

- AUではサブジェクトをMIMEエンコードすると化けるらしいので、MIMEエンコードしない。詳細はよく分からない。

** 参考 [#n3f4bde0]
*** CPAN [#f6a9d324]
- http://search.cpan.org/perldoc?Encode::JP::Mobile
- http://search.cpan.org/perldoc?Encode::JP::Mobile::CookBook
- http://search.cpan.org/perldoc?Mail::Address::MobileJp
*** その他 [#w45b29d4]
- Perlで作るモバイルサイトのコツ:第7回 絵文字を含んだメールを送信する http://codezine.jp/article/detail/1262
- use Encode::JP::Mobile; - Perl標準の機能を使った絵文字の相互変換 http://conferences.yapcasia.org/ya2008/talk/1021
- Encode::JP::Emoji - emoji4unicode ベースの絵文字変換 Perl モジュール http://mtl.recruit.co.jp/blog/2009/07/encodejpemoji_emoji4unicode_pe.html
- 携帯の文字コードと絵文字の基礎知識 http://coderepos.org/share/wiki/Mobile/Encoding
*** ドコモ 公式 絵文字一覧 [#q9531010]
- http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/basic/index.html

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS