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, "");
ちゃんとドキュメント読まないとダメってことですな。