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;