メールの長い件名が文字化けするときは

perlで書いたメールフォームで、件名をめっちゃ長くしてみたら文字化けした。

my $subject = MIME::Base64::encode($mailsubject);
chomp $subject;
$subject = "=?ISO-2022-JP?B?$subject?=";

なんじゃろうと思って調べてみると、原因はMIME::Base64のエンコード処理だった。たぶん基本的なことだと思うのだけど、今まで支障がなくて気付かなかった。ううう。

encode_base64関数は、以下のような動きをするのが仕様。

返されるエンコードされた文字列は76文字を越えないように分割され、空文字列でなければ$eolが最後に付きます。もしエンコードされた文字列を複数の行に分割したくない場合は、2番目の引数として空白の文字列を渡してください。

要は、長い件名にしちゃうと勝手に改行コード入れちゃうから文字化けするって話。改行されたくなかったら、第2引数に空文字を指定しましょう、と。引数2つ取れることなんて、知らなんだ。無知は怖い。まんじゅう怖い。お茶も怖い。

ということで、以下のようにしてアッサリ解決。

my $subject = MIME::Base64::encode($mailsubject, "");

ちゃんとドキュメント読まないとダメってことですな。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/452