Here's some pseudo code describing the algorithm for fast email sending. You could use thread model or fork model for parallel network async processing. I am in favour of the fork model personally.
active_send_mail = 0
threshold = 20
for (each email in the list) {
send_email(address, content)
# make sure we don't fork too many processes
active_send_mail = active_send_mail + 1
if (active_send_mail >= threshold) {
waitpid -1
active_send_mail --
report on status
}
}
sub send_email
{
fork
if child {
send_the_email using mail or Net::SMTP
exit
}
# in parent
return child pid
}