絵文字メール送信(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