Net::POP3::GetAsStruct

久々だ・・・。 ザの人(http://4104.hito.thebbs.jp/Madam/)ばっか使ってました。
それはともかく、Net::POP3::GetAsStructモジュール。 正直適当です。 動けばいいってレベルです。
Net::POP3のget()をオーバーライドしてメールをハッシュのリファレンスとして受け取ります。 multipartなデータ用の処理はいま書いてる途中です。

package Net::POP3::GetAsStruct;

use strict;
use base 'Net::POP3';
use Jcode;
use MIME::Base64;

our $Charset    = 'sjis';
our @NeedDecode = qw( SUBJECT );

sub get{
    my $self   = shift;
    my $msgnum = shift;
    my %mail   = ( headers => {}, file => {}, message => '' );
    
    my $msg = $self->Net::POP3::get( $msgnum );
    
    # ヘッダを処理
    while( my $line = splice(@$msg, 0, 1) ){
        $line =~ s/[\r\n]*$//; # chompでは\rを消せない可能性あるから
        $line eq '' && last;   # ヘッダ処理終了
        
        my( $name, $value ) = split(/: */, $line, 2);
        $name =~ s/-/_/g;
        $name = uc($name); # 大文字に統一
        
        # デコードするのと、文字コード変換
        if( grep { $name eq $_ } @NeedDecode ){
            $value =~ s/=\?ISO-2022-JP\?B\?(.*?)=*\?=/decode_base64($1)/gei;
            
            if( $Charset eq 'sjis' or $Charset eq 'shift_jis' ){
                $value = Jcode->new($value)->sjis;
            } elsif( $Charset eq 'euc' or $Charset eq 'euc-jp' ){
                $value = Jcode->new($value)->euc;
            } elsif( $Charset eq 'utf8' ){
                $value = Jcode->new($value)->utf8;
            }
        }
        
        $mail{headers}->{$name} = $value;
    }
    
    # multipartな場合はあら大変
    if( $mail{headers}->{CONTENT_TYPE} =~ /^multipart/ ){
    } else {
        $mail{message} = ( $Charset eq 'sjis' or $Charset eq 'shift_jis' ) ? Jcode->new(join('', @$msg))->sjis : 
                         ( $Charset eq 'euc' or $Charset eq 'euc-jp' )     ? Jcode->new(join('', @$msg))->euc  : 
                         ( $Charset eq 'utf8' )                            ? Jcode->new(join('', @$msg))->utf8 :
                                                                                        join('', @$msg);
    }
    
    return \%mail;
}

1;