EncodeMIMEHeader – 全ての文字を1行76バイト以内にMIMEヘッダエンコードする

.mailfilterに続きNTTドコモの「メール使いホーダイ」ネタ第3弾。

ケータイからFacebookに投稿したいけど、Facebookの投稿用メールアドレス宛に送信しても反映されるのはメールの件名に書いた分だけで、メール本文は無効なのです。ぼくのケータイは件名が30バイトまでしか対応していない古いタイプなので、これでは短い文章しか投稿できない!

なので本文を件名に埋めて投稿用メールアドレス宛に再送信するプログラムを作ったのですが、Encode::MIME::Headerでエンコードした文字列がFacebook側でうまくデコードされなかったのです。どうやら$especialsで定義されている文字が含まれているとうまくいかない。

いろいろ考えた結果、RFCを満たさんけどもう全部エンコードしてしまおうと、でも守れるところは守ろうと1行は76バイト以内に収めるエンコードモジュールを作りました。

フィールド名(Subject: とか)を含めた1行のUTF8フラグ付き文字列を引数に指定すると、戻り値にMIMEヘッダエンコードした文字列が得られます。

概要

use EncodeMIMEHeader qw( encode_MIME_header );

use utf8;
my $header = ‘Subject: 食卓の電灯、電球が切れたので LED に変えました!Amazon で 1,745 円 x 3 灯、熱くなくて明るさも十分。良いです!’;

print encode_MIME_header($header);

結果

Subject: =?UTF-8?B?6aOf5Y2T44Gu6Zu754Gv44CB6Zu755CD44GM5YiH44KM44Gf44Gu?=
 =?UTF-8?B?44GnIExFRCDjgavlpInjgYjjgb7jgZfjgZ/vvIFBbWF6b24g44GnIDEsNzQ1?=
 =?UTF-8?B?IOWGhiB4IDMg54Gv44CB54ax44GP44Gq44GP44Gm5piO44KL44GV44KC5Y2B?=
 =?UTF-8?B?5YiG44CC6Imv44GE44Gn44GZ77yB?=

ソース

http://www.tamashiro.org/src/EncodeMIMEHeader-0.01/
http://www.tamashiro.org/src/EncodeMIMEHeader-0.01.tar.gz