imapsyncでモバメをGmailにコピーする その2

特に実用上支障はない(自分は使わないので)けど、日本語のフォルダが文字化けする。
これはデコードにUnicode::Stringを使ってるせいで、Encode::IMAPUTF7を使うとうまくいく。
IMAP4ではUTF-7ではなく修正UTF-7というものを使っているのが原因らしいが、まあ詳しく調べる気はあんまりない。

use strict;
use warnings;

use Unicode::String;
use Encode;
use Encode::IMAPUTF7;

my $s = shift;
print imap_utf7_decode($s);
print "\n";
print encode('utf8', imap_utf7_decode2($s));

sub imap_utf7_decode2 {
  my $s = shift;
  return decode('IMAP-UTF-7', $s);
}

# Copied from http://cpansearch.perl.org/src/FABPOT/Unicode-IMAPUtf7-2.01/lib/Unicode/IMAPUtf7.pm
# and then fixed with
# https://rt.cpan.org/Public/Bug/Display.html?id=11172
sub imap_utf7_decode {
        my ( $s ) = shift ;

        # Algorithm
        # On remplace , par / dans les BASE 64 (, entre & et -)
        # On remplace les &, non suivi d'un - par +
        # On remplace les &- par &
        $s =~ s/&([^,&\-]*),([^,\-&]*)\-/&$1\/$2\-/xg ;
        $s =~ s/&(?!\-)/\+/xg ;
        $s =~ s/&\-/&/xg ;
        return( Unicode::String::utf7( $s )->utf8 ) ;
}
$ perl u7.pl "&,wM- 90&ZeVO5VJNMG5T10,hMOEw,DDr-"
# 90日以前の受,hMOEw,DDr-
# 90日以前の受信メール

それにしてもimapsync、しょうもないバグが多くないか。重要なバグがないから良いという考え方もあるが。

imap_utf7_encode()も同じように直したほうがいいかもしれない(未確認)