have a web page for the user to view status and start the emailing. to start the emailing call another email script like so:
exec("/usr/local/bin/php /home/httpd/html/email_script.php > /dev/null 2>&1 &");
this will start it and won't tie up the current running php script.
next, in your email_script.php query the database like normal and send the email.
i use a table for a list of the emails to be sent and another for a log. by getting the number of sent verus unsent msg you can tell the user the status. record any errors to the log db and even maybe dump a log of the session to the log db because if your email_script.php fails php won't tell you.