Net::SMTP->auth

Posted by yoosee on Debian at 2004-08-25 23:42 JST

*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 だけでこなしたかったんだが...

( Permalink | Comments (3) | tags: programming  )
悩みました.1時間ほど.. 検索してみると,やはり同じように悩み,別のアプローチ...
何年かぶりに、Perlからメール送信のプログラムを作ってる。 今まではsendmailコマンドをたたいてたけど、昨今の状況だと、適当なサーバーからのsendmailは迷惑メールとして扱われる。 ということで、「差し出し元Emailの正規のsmtpサーバー」に接続してメール送信を行うことにします。smtp authやらサブミッションポートやらがあるので、 Net::SMTP を使用。 Authe.....
Noel Cafeで使用しているサーバーLolipopがパワーアップした。 いろいろ喜ばしいことではあるが、 自作CGIの改良が必要になってしまった。 Photo Blogでは 添付付きメール送信→Perl(自作)  →Movable Type投稿→Twitpic投稿  →その他サービスへメールで投稿 という仕組みになっている。 「メールで投稿」をLolipopメールを使用しているのだが 認.....
Noel Cafeで使用しているサーバーLolipopがパワーアップした。 いろいろ喜ばしいことではあるが、 自作CGIの改良が必要になってしまった。 Photo Blogでは 添付付きメール送信→Perl(自作)  →Movable Type投稿→Twitpic投稿  →その他サービスへメールで投稿 という仕組みになっている。 「メールで投稿」をLolipopメールを使用しているのだが 認.....
Comments
1. ほそのひでとも at 2004-08-28 23:42
Net::SMTPの場合はrequire...をevalした方がよいと思うっす。確かに親切だとは思えないけど、evalで評価しとかないと、auth()を実行している最中にrequireに失敗して、SMTPセッションをちゃんと切らないままプログラムが死んじゃって、もっと嫌な気がするので(って、yooseeなら分かっているかもしれないが…)。
2. yoosee at 2004-09-01 08:09
問題は何もいわずに auth 失敗と同じ値を返すことなので、これだと気づかない人は永遠に気づかずに auth 周りを疑うことになりかねない。せめて DEBUG=>1 の場合には set_status の値を output すべき。
個人的には QUIT 無しに SMTP セッションが切れてもそれはそれだと思うんだけど、smtp->quit() を呼ぶ事が本質ならば (evalしようがユーザの quit 忘れがあるわけなんだから) destructor でやるのも手なわけだけど、perl では異常終了時には DESTROY も呼ばれなかったかな。

まぁ本音を言えば例外処理系の無い perl ではどうしても無理が出るよなーとも思う。
auth($user, $passwd) {
---
> if($smtp->auth($user, $passwd)) {

Please write your comment. email address won't appear. Cannot use any HTML tags in comment.
コメントをお書き下さい。メールアドレスは公開されません。 またHTMLタグは利用できません。
Name   E-mail   URL
Comment

About W.W.Walker

World Wide Walker は yoosee による blog です。PDA, Web・サーバ技術, 美味しい食べ物などの話題を取り上げています... read more

このエントリーのブックマーク

Monthly Archives

Select Month to read