- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 携帯/絵文字メール送信(Perl+Encode-JP-Mobile) へ行く。
- 1 (2009-09-01 (火) 23:59:23)
- 2 (2009-09-02 (水) 02:26:15)
絵文字メール送信(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 $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 $subject_encoded = is_imode($email_to) ? '=?SHIFT-JIS?B?' . MIME::Base64::encode( encode( 'x-sjis-docomo', $subject ) ) . '?=' : is_softbank($email_to) ? '=?UTF-8?B?' . MIME::Base64::encode( encode( 'x-utf8-softbank', $subject ) ) . '?=' : is_ezweb($email_to) ? encode( 'x-sjis-kddi-auto', $subject . $emoji_chars ) : '=?ISO-2022-JP?B?' . MIME::Base64::encode( 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 $msg = MIME::Lite->new( From => $email_from, To => $email_to, Subject => $subject_encoded, Data => $body_encoded, Encoding => '8bit', ); $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
- 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
その他
- 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