I don't know if it is a best practice, but one thing that I
do for a similar tool I've created is send the emails out in
smaller batches.
I have a queue DB table that stores emails to be sent. I then
have a CF Scheduled task that runs every 15 minutes. It takes the
next X number of emails and sends them, then removes them from the
send queue and enters them in the sent table. This way, we didn't
overtax our email server with giant blasts of thousands of emails
all at once...
Again, not sure about best practicies, but our IT guys was
much happier when we didn't bombard his email server with thousands
of messages at once.
However, it does mean that the messages take longer to go
out...