回答受付中の質問
以前ここで同様の質問を見たような気がするのですが、時間がないので、また質問させてください。
プロバイダーの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
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
OKWaveのオススメ
おすすめリンク