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

プロバイダーの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秒のインターバルをおいてみました。
何がダメで止まってしまうのでしょうか?

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

A 回答 (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
    • good
    • 0

特にスクリプトの中身を解析していませんが、CGIの


実行タイムアウトではないでしょうか?
サーバー側の設定に
スリープではなくて、スクリプトを数回に分けて実行するようにしてはどうでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報