Вы должны переместить логику времени в запрос к базе данных - нет смысла извлекать ВСЕ строки, только отбрасывать некоторые (большинство? Все?) Строки, если ничего не нужно делать:
SELECT *
FROM users
WHERE `time` < (now() - INTERVAL 3 DAY)
Как только это будет сделано, я бы посоветовал убрать фактическую часть mail () из цикла извлечения базы данных, чтобы вы могли сначала собрать вместе брошюры каждого пользователя:
$users = array();
while($row = mysql_fetch_array($time_query_result)) {
if (!array_key_exists($row['userID'], $users)) {
$users[$row['userID']] = array('email' => $row['email'], 'brochures' => array());
$users[$row['userID']]['brochures'] = array('b' => $row['brochures'], 't' => $row['time']);
}
}
Затем вы перешли бы этот циклМассив $ users для создания электронных писем для пользователей:
foreach ($users as $user) {
$text = '<html><body><p>Brochure reminder</p>';
$i = 1;
foreach ($user['brochures'] as $brochure) {
$text .= 'Brochures:<br />'.$i++ .$row['b']. $row['b'];
}
$text .= '</body></html>';
mail($user['email'], $subject, $text, $headers);
}
Таким образом, вы получаете все данные пользователя за один раз.Затем вы создадите ЕДИНСТВЕННОЕ электронное письмо каждому пользователю, в котором перечислены все их брошюры и (надеюсь) проблема решена.