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;