c'è qualche errore e qualche contrasto tra queste 4 righe:
$mail=$_POST['mail'];//fin qui tutto ok
if(!empty($nome) and !empty($mail) and !empty($subject)and !empty($messaggio) ){//questo test gira o è qui che si blocca?
$header = "From: ". $nome . " <" . $_POST[mail] . ">\r\n"; //qui CERTAMENTE mancano le virgolette ('mail'), inoltre perché riprenderlo dalla superglobale $post se ce l'hai nella variabile $mail?
$mail=mail("firemgb@gmail.com", "Mail da $_POST[nome]" , $messaggio , "OGGETTO $_POST[subject]" , $header);//ci metti un booleano, e va bene, ma $mail non la usavi già per altro? Inoltre credo dovrebbe essere così:
blabla=mail("firemgb@gmail.com", "Mail da"+$_POST['nome'] , $messaggio , "OGGETTO"+$_POST['subject'] , $header)
SICURAMENTE l'errore è qua in mezzo, in più fai un casino assurdo perché ti salvi tutti i dati nelle variabili ($mail,$name...) ma poi al momento di usarli li riprendi da $_POST.. questo non è propriamente un "errore", ma rallenta la lettura del codice, contribuisce alla confusione e spreca risorse