Most people fondly as developers don’t think about the psychological impacts in generating emails via cronjobs/scheduled tasks and should serious consider implementing this say you have a cron set up like so in you scheduler to periodically every 2 hours send a batch of emails ie:
* */2 * * * /usr/bin/php -q /path/to/crons/send-emails.php
there is a couple of things you need to do to change the psychology impact of this regular batch of emails firstly at the top of the php file you need to implement a random sleep like so for a period if it is firing every 2 hours up to 1.5 hours like so:
sleep(mt_rand(0, 3600 * 1.5));
This sits at the top of each of the crons, part of the reason you do this is so the times of the email changes when they arrive for a randomised workflow, this means the business or organisation shop floor, wont have stints of work and sometime they make and may have time to spend more on the last email depending on the delay.
The other thing to do is between sending email delay for a random upto 45 seconds like so at the bottom of each loop between caching and sending the mail, with sleep(); again like so:
Part of the reason this is done to load balance the mail transport layers as well as provide a completely different date of recieving the mail rather than the impact of recieving emails always on the hour, or on the every two hour with little or difference in the time displayed, so doing this will make the daily grind of working from schedule emails actually enjoyable as well as fun for the employee as they will not have any way of estimating when the next group of emails will arrive, making the shop floor dynamic again!
Of course the other way around with a shorter delay from the start of the php script to each loop generating the email as a longer delay is also a very good way of distributing emails over an employee shop floor where the grind is a gentle workflow where different people start at different times, also if you can randomise the sort of the email being sent this is also good.
You generally use sleep(); with load balancing cronjobs and scheduled tasks, so you where firing a cron every minute, then you would sleep(mt_rand(0, 90)); especially when you are running multiples of the same cronjob so it doesn’t fire on the 0 second of every minute over requesting the queing on your servers processor threading.