- 追加された行はこの色です。
- 削除された行はこの色です。
* 絵文字メール送信(Perl+Encode::JP::Mobile) [#rb16e0cf]
** 目的 [#xbb54875]
3キャリア(+PC)対応した絵文字メール送信処理を作る。絵文字は件名・本文共に使用可能にする。
** 方針 [#r542d1d0]
- 3キャリア対応した絵文字メール送信処理を作る。
- ドコモとAUはSJISで、ソフトバンクはUTF8で本文をエンコーディングする。
- ドコモとAUはSJISで、ソフトバンクはUTF8で、PCはISO-2022-JPで件名・本文をエンコーディングする。
-- その他の文字コードでも(絵文字なし・ありの)メール送信が可能な場合もあるが、一番問題がなく、メジャーな選択は上記の文字コードになるようだ。
- 絵文字はドコモのSJISコードを使って指定する。
- Encode::JP::Mobileで絵文字を含めた文字列のエンコーディングを相互変換する。
-- SJISコードは人間の目には見づらいので、絵文字対応表を自作してニーモニックで記述できるようにしてもよいと思う。
- Encode::JP::Mobileで絵文字を含めた文字列のエンコーディングを各キャリア向けに変換する。
- Mail::Address::MobileJpを使って、メールアドレスからキャリアを判別する。
- MIME::Base64を使って、本文のMIMEエンコードをする。
-- Encode::JP::MobileやMail::Address::MobileJpの次のバージョンではMIMEエンコード機能を取り入れるようだ。そうなれば、コードをより簡潔に記述出来ると思われる。
** サンプルコード [#hac13ca5]
#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use Encode::JP::Mobile;
use Mail::Address::MobileJp;
use MIME::Lite;
use Jcode;
use MIME::Base64;
my $email_from = 'taro@example.net';
my $from_name = '太郎';
my $email_to = 'hanako@ezweb.ne.jp';
my $text = "こんにちは:";
my $subject = "件名です";
my $body = "本文です";
my $emoji_bytes = "\xF8\x9F"; # ドコモのSJISコード「太陽」
my $emoji_chars = decode( 'x-sjis-imode', $emoji_bytes );
my $mail_encoding =
( is_imode($email_to) ) ? 'x-sjis-docomo'
: ( is_softbank($email_to) ) ? 'x-utf8-softbank'
: ( is_ezweb($email_to) ) ? 'x-sjis-kddi-auto'
: 'x-sjis-docomo';
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,
From => $email_from_encoded,
To => $email_to,
Subject => 'HELLO!',
Data => encode( $mail_encoding, $text.$emoji_chars),
Encoding => '8bit',
Subject => $subject_encoded,
Data => $body_encoded,
Encoding => $encoding,
);
$msg->attr( 'content-type' => 'text/plain' );
$msg->attr( 'content-type.charset' => $mail_encoding =~ /utf8/ ? 'UTF-8' : 'Shift_JIS' );
$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