アドバイスくださった皆様、ありがとうございます。 岸田様にご指摘いただいたように、 forループでmail()を呼び出すごとに、 ループ回数をechoするようにしてみたところ、 ループ回数を18回にしているにも関わらず 15までしかアウトプットされませんでした。 とりあえず問題の切り分けということで、 set_time_limit(0)としてみましたところ、 こんどはきっちり18まで表示され、メールも 18通送信されました。 mail()はsmtpサーバーと通信して送信できたかどうかを 返すので、その分多少のオーバーヘッドは仕方ないもの なのでしょうか? アドバイスいただいたとおり、20通弱でこのオーバーヘッドと いうことは、500通となってきますと少し苦しいかな、と 感じています。