- 締切済み
Net::SMTPでエラーの場合のリトライ方法
PerlのSMTP処理がエラーの場合に、リトライする方法 下記のようなPerlスクリプトを例に、質問させていただきます。2点あります。 ------------------------------------------------------------------------- 01: use Net::SMTP; 02: use Encode; 03: my($smtp,$ret); 04: $smtp = Net::SMTP->new('xxx.xxx.jp', Hello=>"xxx.com", Timeout => 120); 05: $ret = $smtp->mail($from); 06: $ret = $smtp->to($to); 07: $ret = $smtp->cc($cc) if("$cc" ne ""); 08: $ret = $smtp->data(); 09: $ret = $smtp->datasend("From:$from\n"); 10: $ret = $smtp->datasend("To:$to\n"); 11: $ret = $smtp->datasend("Cc:$cc\n") if("$cc" ne ""); 12: Encode::from_to($subject,"s-jis","jis"); 13: $ret = $smtp->datasend("Subject:$subject\n"); 14: $ret = $smtp->datasend("Content-Transfer-Encoding: 7bit\n"); 15: $ret = $smtp->datasend("Content-Type: text/plain;charset=\"ISO-2022-JP\"\n\n"); 16: Encode::from_to($body,"s-jis","jis"); 17: $ret = $smtp->datasend("$body\n"); 18: $ret = $smtp->dataend(); 19: $ret = $smtp->quit; ------------------------------------------------------------------------- ($from,$to,$cc,$subject,$body 等は上位で設定しているものとします) 質問1) 例えば、08行目でエラー($ret==0)になった場合に、リトライしたければ、 少し待って(sleep等)から、08行目からを再実行すればOKでしょうか、 それとも、05行目、あるいは、04行目のSMTP->newの再取得からやり直さなければならないでしょうか。 質問2) また、18行目でエラー($ret==0)の場合、実際にはメールは送信されるようですが、 そのまま放置しておいても特に問題ないでしょうか。 以上、よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- zxcv0000
- ベストアンサー率56% (111/196)
回答が付かない様なのでご参考までに。 smtp って、メールの送信ですよね? 外部の sendmail 等に頼らずに処理したい訳でしょうか? それから、エラー発生時にリトライするかどうかの判定は本気でしっかりやってください。 smtp サーバービジーなんかの場合にはリトライすれば良いんでしょうが、リトライ間隔が短か過ぎるのは「ビジーなサーバーの事情」を考えると巨大な迷惑です。 あるいは、「そんなユーザーいないよ」のエラーは通常は送信成功の後にエラーメールが返りますが、これに起因して送信が失敗するケースもあります。 自動リトライが無駄かつ迷惑なのは自明ですね? 他にも同一条件でリトライしても成功が見込めないケースは非常に多いです。 成功が見込めないのにリトライするのは迷惑行為です。 人の迷惑を省みずに送信メールの一部が届けば良いと考えるのはSpamメールを大量発信する人の特徴ですが、あなたはそうじゃ無いですよね?
お礼
ご回答ありがとうございました。 色々なページ(Perl SMTPなどでgoogle検索すると)で、リトライについて触れているページが見つからないのも、 ご指摘のようなことが考慮されているからでしょうか。 もう一点、補足させて頂くと、 「サーバ等からのメッセージを無人で通知する際に、送信エラーになる場合」というのは、 普段は、送信が成功する宛先(たとえば、自分自身あて)に対してのものです。 メールサーバ負荷が高い?などの理由で処理がエラーになっていると思われますので、 このようなとき、単純に”時間を置いて再実行”と考えていましたが、 何らかの手段で、メールサーバが”空いている”ということを検知した上で再実行できれば、それが一番良いと思いました。 実際に、このような自動応答や自動報告メールのような仕組みを使われている所では、 エラー再送はどんな風にされているのでしょうか。 判定を厳密に行うにあたっては、SMTPの応答コードによって、 処理を変えていくというようなことが必要ということになりますか。 (下記のようなページを参考にしています) http://www.site-cooler.com/kwl/perl/smtp.htm
補足
ご回答ありがとうございました。 詳細を記載し漏れましたが、このメールの仕組みは、ローカルなネットワーク内でのものです。 一般外部へのメール送信に関するものではありませんでした。 サーバ等からのメッセージを無人で通知する際に、送信エラーになる場合がたまにあり、 これを回避する方法がないかを確認させて頂いていました。 現状では、上記のスクリプトの各処理(05~19行目それぞれ)でエラーが出た場合は、30秒程度待ってから、 その処理からを再開させるような仕組みにしていたのですが、 結局、一度エラーになると、そこから何度リトライしたところで、復旧することは無かったため、 先頭の処理からやり直す必要があるのかを確認させて頂いていました。 ただ、ご指摘のとおり、この問い合わせが世間公開されているものだとすると、 この内容を真似てしまい、はた迷惑を起こす可能性もあるということに、今さらながら気づきました。 spamメール業者の嫌疑がありましたので、補足させて頂きました。