• 締切済み

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秒のインターバルをおいてみました。 何がダメで止まってしまうのでしょうか? また、何か良い方法があれば教えていただけませんか?

みんなの回答

回答No.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
  • burn
  • ベストアンサー率65% (25/38)
回答No.1

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