Jak dla mnie to rozwiązania w oparciu o wszelkie sleepy są mocno ryzykowne, zwłaszcza w sytuacji gdy hosting "machluje", czyli ubija skrypt nie według czasu jego działania, ale momentu odpalenia. W ten sposób ubijają własnie procesy będące w uśpieniu, choć przecież nie obciążają one jakoś maszyny.
Najlepiej się tu wychodzi z CRONem. Piszesz skrypt tak, by paczkował co jakiś czas. Znając wielkość paczki i okres czasu, znasz przepustowość. Masz limit maili godzinny na serwerze? Odejmujesz jakieś 10-15% na zapas (rejestacje, zapomniane hasła itp.). Reszta to wybór albo okresu czasu (godzinna liczba cykli) albo wielkości paczki jako dzielnika.
Można co prawda robić skrypty rekurencyjnie odwołujące się do samych siebie, ale tu już zalecam ostrożność. Zły warunek stopu dla takiego i będzie sobie wisiał w pamięci aż do jego ręcznego ubicia

Na pewno jest to lepsze rozwiązanie niż te ze sleepem i o wiele pewniejsze, ale jednak ciut ryzykowne i nie powinny się za to brać osoby niedoświadczone, gdyż głupi błąd i będzie to wieczny skrypt

Za duża częstotliwość i zanim zdolamy ubić proces po PID, będzie on już miał swojego potomka. Tak jako ciekawostkę podam fakt, że na uczelni podczas zajęć na studiach na Linuxie wysłaliśmy na serwer uczelniany takowy skrypt, który powodowal wrzucanie na wszystkie konsole śmieci, a rekurencyjnie uruchamiał się co ułamki sekund. Wyniki poleceń w konsoli widziało się także ułamki sekund, więc wyniki trzeba było zapisywać na jakimś wyjściu, ale zanim skrypt przeanalizował je i próbował ubić proces pasujący do reguły, nie istniał on już, gdyż jego ciałem było wysypanie śmieci na ekran konsoli i uruchomienie kilku instancji samego siebie, bez żadnych sleepów. Oczywiście serwera nie można było ot tak sobie zresetować, więc do końca dnia nikt już nie miał zajęć pod konsolką

Tak więc trzeba bardzo uważać w tym wypadku bo sobie można serwer załatwić.
Inna sprawa to skonfigurowanie jako warstwy transportowej przykładowo programu sendmail. On dorzuci do swojej kolejki Twoje maile, ale jeśli będzie mial ją zawaloną, to mail może wyjść za 10-15 minut choćby, a Ty tak od razu dostaniesz komunikat powodzenia, gdyż przeciez do kolejki mail doda się pomyślnie.
EDIT: Tak... Swift mailer posiada takowe rozwiązanie, ale jakoś mnie ono nigdy nie przekonywało.