Primero anda comentando codigo de manera sectorizada, por ejemplo de a 50 lineas. Y vas testeando si funciona o no y cuando se queda en ese loop es porque identificaste donde esta el problema.
Una vez el porque se queda pegado, anda imprimiendo las variables de ese sector del codigo para asi ver cual es la que no esta funcionando.
Si es por la funcion mail podrias verificar si tu servidor de correos esta tomando la informacion que le envias, sino puede ser que la funcion mail trate y trate por 30+ segs y el servidor de correo no lo pesque.
Tambien voy a recomendarte que la funcion EnviarMail te devuelva la funcion mail para asi poder gestionar alguna accion si el mail no fuese enviado:
Código PHP:
return mail($para, $asunto, $mensaje, $cabeceras);
Asi sabras si el mail fue enviado o no ;)
Bueno... por ahora creo que en eso te puedo aportar.
Suerte!