POPFile : 件名が文字化けする件とか

フォントの問題が解決した所で、メーラーをセットアップした。
とりあえず、Windows環境で使っていたのと同じThunderbirdにして、POPFileで自動振り分けの設定の環境を再構成した。
で、いちおうちゃんと動くようになったのだけれど、POPFileコントロールセンターの履歴タブやメッセージビューで件名や差出人などのヘッダー情報に含まれる日本語が文字化けする。
POPFileのFAQによれば、ヘッダー部がMIMEエンコーディングされていないからだということで、spamメールくらいしかそういうことは起こらないと行っているのだけれど、どうみても普通のメールでも化けている。
なにが悪いのかわからないけれど、これはこのままでは使えない。

      • -

使えないというほどではないということがわかった。でも、納得行かないので調べる。
ところで、Linux側でPOPFileThunderbirdを動かしているのだけれど、マシンパワーがあるため、かなり高速に振り分けが動作する。
これまで、ノートPCでPOPFileを動作させていたときはかなり遅かったので、非常にありがたい。

      • -

dbの中をチェックして、ソースコードを追いかけても、どうしてもMIMEエンコーディングの関連で文字化けるような要因が見付からなくて、困っていたところ、ふと思って、ブラウザの文字コードを買えてみたら、ISO-2022-JPにしたところ、タイトルが正しく表示された。
どうも、本文部の文字コードとタイトル部の文字コードが違うコードで表示されているようだ。
もうすこし調査を進める。

      • -

関係しそうな所に、iso-2022-jpからeuc-jpへの変換をはさんだら、正しく表示されるようになった。って、これってバグじゃないの?
以下、パッチ。

*** HTML.pm.new 2007-04-07 23:06:09.000000000 +0900
--- HTML.pm     2007-04-07 22:57:55.000000000 +0900
***************
*** 36,42 ****
  use Digest::MD5 qw( md5_hex );
  use HTML::Template;
  use Date::Format;
- use Encode;
  
  # A handy variable containing the value of an EOL for the network
  
--- 36,41 ----
***************
*** 2469,2483 ****
              }
  
              $row_data{History_Arrived}       = $self->pretty_date__( $$row[7] );
!             $row_data{History_From}          = encode('euc-jp', decode('iso-2022-jp', $$row[1]));
!             $row_data{History_To}            = encode('euc-jp', decode('iso-2022-jp', $$row[2]));
!             $row_data{History_Cc}            = encode('euc-jp', decode('iso-2022-jp', $$row[3]));
              $row_data{History_Date}          = $self->pretty_date__( $$row[5] );
!             $row_data{History_Subject}       = encode('euc-jp', decode('iso-2022-jp', $$row[4]));
!             $row_data{History_Short_From}    = encode('euc-jp', decode('iso-2022-jp', $self->shorten__( $$row[1], $length )));
!             $row_data{History_Short_To}      = encode('euc-jp', decode('iso-2022-jp', $self->shorten__( $$row[2], $length )));
!             $row_data{History_Short_Cc}      = encode('euc-jp', decode('iso-2022-jp', $self->shorten__( $$row[3], $length )));
!             $row_data{History_Short_Subject} = encode('euc-jp', decode('iso-2022-jp', $self->shorten__( $$row[4], $length )));
              my $bucket = $row_data{History_Bucket} = $$row[8];
              $row_data{History_Bucket_Color}  = $self->{c__}->get_bucket_parameter( $self->{api_session__},
                                                                            $bucket,
--- 2468,2482 ----
              }
  
              $row_data{History_Arrived}       = $self->pretty_date__( $$row[7] );
!             $row_data{History_From}          = $$row[1];
!             $row_data{History_To}            = $$row[2];
!             $row_data{History_Cc}            = $$row[3];
              $row_data{History_Date}          = $self->pretty_date__( $$row[5] );
!             $row_data{History_Subject}       = $$row[4];
!             $row_data{History_Short_From}    = $self->shorten__( $$row[1], $length );
!             $row_data{History_Short_To}      = $self->shorten__( $$row[2], $length );
!             $row_data{History_Short_Cc}      = $self->shorten__( $$row[3], $length );
!             $row_data{History_Short_Subject} = $self->shorten__( $$row[4], $length );
              my $bucket = $row_data{History_Bucket} = $$row[8];
              $row_data{History_Bucket_Color}  = $self->{c__}->get_bucket_parameter( $self->{api_session__},
                                                                            $bucket,
***************
*** 2561,2570 ****
      my ( $id, $from, $to, $cc, $subject, $date, $hash, $inserted,
          $bucket, $reclassified, $bucketid, $magnet ) =
          $self->{history__}->get_slot_fields( $self->{form_}{view} );
-     $from    = encode('euc-jp', decode('iso-2022-jp', $from));
-     $to      = encode('euc-jp', decode('iso-2022-jp', $to));
-     $cc      = encode('euc-jp', decode('iso-2022-jp', $cc));
-     $subject = encode('euc-jp', decode('iso-2022-jp', $subject));
  
      my $color = $self->{c__}->get_bucket_color(
                      $self->{api_session__}, $bucket );
--- 2560,2565 ----