Dokładnie, problemem jest to co napisali już koledzy powyżej - próbujesz wysłać wszystkie wiadomości za jednym razem.
Rozwiązaniem jest porcjowanie.
Możesz to rozwiązać tak:
tworzysz sobie dwie nowe tabele np.: wiadomosc i kolejka
w tabeli wiadomość kolumny: msg_id (autoincrement), tytul, tresc
w tabeli kolejka: adresat, msg_id
teraz do tabeli wiadomosc dopisujesz sobie kolejno treści maili jakie będziesz wysyłał, zaś do tabeli kolejka dopisujesz rekordy konkretnych wiadomości do wysyłki (adres email i id treści )
Rozwiązanie w tym stylu pozwoli ci realizować wysyłkę wielu różnych treści jednocześnie.
masz już zakolejkowane wiadomości do wysłania, pozostaje sama wysyłka.
Najlepiej jako crona, odpalany np co 5 minut sprawdza czy w kolejce są jakieś wiadomości do wysłania - jeśli nie, kończy działanie. Jeśli są - pobiera X wiadomości dajmy 50, wysyła maile, po wysłaniu kasuje z kolejki wykonane zadania i kończy pracę.
I tak w kółeczko.
Możesz sobie dostosować ten schemat do własnych potrzeb. Mozesz wykorzystać tylko tabelę kolejki, możesz w niej zamiast pełnego maila skorzystać z relacji i podać tylko id użytkownika itd.
No i na co zwrócił uwagę kostek135, w zapytaniach sql ograniczaj się do niezbędnych kolumn. Jeżeli chcesz pobrać tylko rekordy z kolumny mail, to daj SELECT mail FROM , wybieranie w takich przypadkach wszystkich kolumn * , to czyste marnotrawstwo czasu i pamięci. To najlepszy sposób by dobić bazę.