You can't. There is a limit on the processing time.
However, you can refresh. wink wink.
If you use JavaScript or metatags to refresh the page after just a few seconds, you could pass on the remaining workload using normal http means (ie, GET POST or COOKIE), or you can store the workload in a database (or text file) so PHP knows what's left to do.
I would recommend having the email addresses in an array, then email them one at a time. Use array_shift to get each address in turn. You'll want to do that a certain number of times. Go for 50.
Once that 50th email is sent out, you should start outputting the HTML headers and metatags. This will ensure that the 50 emails are already sent before you tell the page to refresh! In your metatags or JS, reload the page, but ensure that you serialize the array and pass that on as a GET.
Back to where you started now
Use GET to obtain the relevant data. unserialize it and you have the remains of that array back.
Not the best or most elegant solution, but it will get the job done.
EDIT: in fact, here's a [modified] small snippet of code I just found in one of my old projects. Modify and use it as you wish
PHP:
<?php
if (isset($_POST['emails']))
$emails_array = unserialize($_POST['emails']);
else
$emails_array = array('emailaddress1'); // GET LIST OF EMAIL ADDRESSES FROM ELSEWHERE
/*
SEND OUT 50 EMAILS, SHIFTING OUT ARRAY VALUES
if you still get timeouts for 50 emails, go for less than 50.
if you have to keep lowering the number, why is it taking so long?
look into your existing code if that's the case.
*/
echo '<html><head></head><body>
<form action="index.php" method="post" name="complete">
<input type="hidden" name="emails" value="'.serialize($emails_array).'"></form>';
?>
<script type="text/javascript">
document.complete.submit();
</script></body></html>