回答受付中の質問

sendmailについて

以前ここで同様の質問を見たような気がするのですが、時間がないので、また質問させてください。

プロバイダーのsendmailを使ってメールマガジン送信フォームを作成したのですが、2600件メール送信実験中960件辺りで止まってしまいます。
スクリプトは以下の通りです。

foreach (@mailto) {
$ok_cnt ++;
if (open(MAIL,"| $sendmail -t")) {
print MAIL "FormMailer: HOT-NET BINGO Original Mailer Vs2.00\n";
print MAIL "Reply-to: $master\n";
print MAIL "From: $master\n";
print MAIL "To: $_\n";
print MAIL "Subject: $subject\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "Content-Type: text/plain; charset=iso-2022-jp\n";
print MAIL "\n\n";
print MAIL "$message\n";
print MAIL "\n";
close(MAIL);

open(TMP,">>$tmpfile");
print TMP "$ok_cnt\t$_\n";
close(TMP);
          if (($ok_cnt % 100) == 0) {sleep 5;}
}

当初4~500件位で止まってしまっていたので、
100件送信ごとに5秒のインターバルをおいてみました。
何がダメで止まってしまうのでしょうか?

また、何か良い方法があれば教えていただけませんか?

投稿日時 - 2001-05-30 13:51:51

QNo.83184

すぐに回答ほしいです

0人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

回答(2件中 1~2件目)

burnさんのおっしゃるように私もhttpのコネクションのタイムアウト
ではないかと思います。

このような場合、forkして子プロセスでメール送信の処理を
行い、親のCGIプログラム側はclose(STDOUT)して、サーバには
処理が終わったかのように振舞うテクニックが有名です。

ちょっと検索してみたら、下記URLのページがforkの書き方について
具体的に書かれていたので紹介します。

なお、forkの仕方がわかったからといってたくさんのsendmailを
同時に呼びまくって…というのは避けたほうがいいでしょう。
OSの設定や、相手のsmtpサーバが重くてぜんぜん返事をしてくれない
状態などによっては、どんどんsmtpのコネクションが増えたりファイル
ハンドルを使い果たしたりプロセステーブルも…というマズい事態も
ありそうですから、いまのように、ひとつのsendmailが終わるまで
closeで待っている方が賢明だと思います。

参考URL:http://www.itboost.co.jp/perl/perl_14.php

投稿日時 - 2001-05-30 23:33:02

ANo.1

特にスクリプトの中身を解析していませんが、CGIの
実行タイムアウトではないでしょうか?
サーバー側の設定に
スリープではなくて、スクリプトを数回に分けて実行するようにしてはどうでしょうか?

投稿日時 - 2001-05-30 15:00:10

あわせてチェックしたい
  • BINGO! ...
  • インターバル ...
  • インターバル ...
PR

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら