1
Net::SMTP
Perl で SMTP Auth の認証が出来たかどうかをチェックするツールを書いていて、Net::SMTP->auth(user,passwd) を使えば良さそうなので早速試した。しかし簡単なプログラムを書いてみても全く動かない。
#!/usr/bin/perl
use Net::SMTP;
my ($remotehost, $user, $passwd) = @ARGV;
my $smtp = Net::SMTP->new($remotehost, Timeout=>60, Debug=>0);
if($smtp->auth($user, $passwd) {
print "SMTP Auth: success.\n";
} else {
print "SMTP Auth: failed.\n";
}
$smtp->quit;
exit;
Debug=>1 にして SMTP のログを見ていたら、明らかに EHLO の直後に何も無しで QUIT して終わっている。なんだこりゃ、と perldoc -m Net::SMTP を見てみると
sub auth {
....
eval {
require MIME::Base64;
require Authen::SASL;
} or $self->set_status(500,["Need MIME::Base64 and Authen::SASL todo auth"]), return 0;
....
どうやら Authen::SASL が必要で、これが無いと set_status はするものの、表面的にはなにも言わずに AUTH 処理せず終了している。お陰で気付かなかったわけか…。わざわざ eval で例外処理しいるのが親切だか迷惑だかわからんなぁ。apt-get install libauthen-sasl-perl したら動いた。しかし都合上、出来れば perl 標準 module だけでこなしたかったんだが...
個人的には QUIT 無しに SMTP セッションが切れてもそれはそれだと思うんだけど、smtp->quit() を呼ぶ事が本質ならば (evalしようがユーザの quit 忘れがあるわけなんだから) destructor でやるのも手なわけだけど、perl では異常終了時には DESTROY も呼ばれなかったかな。
まぁ本音を言えば例外処理系の無い perl ではどうしても無理が出るよなーとも思う。
---
> if($smtp->auth($user, $passwd)) {