POP3受信するPerlスクリプト

POP3受信するPerlスクリプトを作りました(備忘録です)。
複数ユーザー(200以上)のテストを手動でやると発狂しそうなのでスクリプト化しました。
PerlモジュールのEncode、Net::POP3、Email::MIMEが必要です(無い場合はインストールして下さい)。

スクリプトを実行する際、第一引数にファイル名を指定します。
ファイルのsyntaxは以下の通り

#Comment
User1<Delimiter>Password1
User2<Delimiter>Password2
...
User100Password100

<Delimiter>はフィールド区切りでスペースまたはタブになります。
行頭に"#"があるとコメント行になります。
標準入力からデータを読み込ませる場合は

echo "User Password" | this-script.pl -

とすれば実行できます。

#!/usr/bin/perl

use strict;
use utf8;
use Encode;
use Net::POP3;
use Email::MIME;

my $server = 'サーバのFQDNまたはIPアドレス';
my $userfile = shift;
my $layout = << 'TMPL';
[TITLE]
%s

[BODY]
%s


TMPL

die "Usage: $0 [file]\n" unless $userfile;
open(IN, $userfile) || die "can't open file: $!\n";

while(<IN>){
    s/[\r\n]*$//;
    my ($user, $password) = split(/[\t\x20]+/, $_, 2);
    if ( $user =~ /^#|^$/ ) { next; }

    print Encode::encode( 'utf-8', "$user: POP3接続 " );
    my $pop = Net::POP3->new( $server );
    my $result = $pop->login( $user, $password );

    if ( $result ) {
        if ( $result == "0E0" ) {
            print Encode::encode( 'utf-8', "→ 成功(0)件\n" );
        } else {
            print Encode::encode( 'utf-8', "→ 成功($result)件\n" );
            my $list_href = $pop->list;        # メール一覧のハッシュのリファレンスを得る
            foreach my $msg_id ( keys %{ $list_href } ) {
                my $message = join q(), @{ $pop->get( $msg_id ) }; # メール本文を取得
                my $parsed  = Email::MIME->new($message);
                print sprintf $layout,
                    Encode::encode( 'utf8', $parsed->header('Subject') ),
                    Encode::encode( 'utf8', Encode::decode( 'jis', $parsed->body ) );

                $pop->delete( $msg_id );      # 受信したメールを削除する
            }
        }
    } else {
        print Encode::encode( 'utf-8', "→ 認証失敗\n" );
    }
    $pop->quit;
}
close(IN);
exit;