SMTP送信するPerlスクリプト(with SMTP認証)

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

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

#Comment
User1<Delimiter>Password1
User2<Delimiter>Password2
...
User100<Delimiter>Password100

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

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

とすれば実行できます。

#!/usr/bin/perl

use strict;
use utf8;
use Encode;
use Net::SMTP;
use Authen::SASL;

my $server   = 'サーバのFQDNまたはIPアドレス';
my $from;
my $to       = '宛先メールアドレス';
my $domain   = '送信者のドメイン名';
my $user;
my $password;
my $subject  = 'テストメール';
my $userfile = shift;
my $header;
my $smtp;

my $contents = '
テキストのメールです。
この内容がメール本文に含まれます。
';

$contents = Encode::encode( 'iso-2022-jp', $contents );
$subject  = Encode::encode( 'MIME-Header-ISO_2022_JP', $subject );

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

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

    $from   = "$user\@$domain";
    $header = "From: $from\n";
    $header .= "To: $to\n";
    $header .= "Subject: $subject ( $from )\n";
    $header .= "MIME-Version: 1.0\n";
    $header .= "Content-type: text/plain; charset=ISO-2022-JP\n";
    $header .= "Content-Transfer-Encoding: 7bit\n\n";

    print Encode::encode( 'utf-8', "$from: SMTP接続 " );
    $smtp = Net::SMTP->new( $server );
    if ( $smtp ) {
        print Encode::encode( 'utf-8', "→ 成功 → SMTP認証 " );
        if ( $smtp->auth( $from, $password ) ) {
            print Encode::encode( 'utf-8', "→ 成功 " );
            $smtp->mail( $from );
            $smtp->to( $to );
            $smtp->data();
            $smtp->datasend( $header );
            $smtp->datasend( $contents );
            $smtp->dataend();
            $smtp->quit;
            print Encode::encode( 'utf-8', "→ 送信完了\n" );
        } else {
            print Encode::encode( 'utf-8', "→ 失敗(Abort)\n" );
        }
    } else {
        print Encode::encode( 'utf-8', "→ 失敗(Abort)\n" );
    }

}
close(IN);
exit;