絵文字メール送信(Perl+Encode::JP::Mobile)

目的

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

方針

  • ドコモと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エンコード機能を取り入れるようだ。そうなれば、コードをより簡潔に記述出来ると思われる。

サンプルコード

 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 => $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エンコードしない。詳細はよく分からない。

参考

CPAN

その他

ドコモ 公式 絵文字一覧


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

Last-modified: 2009-12-09 (水) 06:54:49