Ok, in questo caso l'errore sta nell'attributo action del form.
Nel codice della pagina che hai mostrato (chiamiamola index.php tanto per darle un nome) sono presenti sia il form per l'invio dei dati che il codice PHP per gestirli (con le varie letture da $_POST, la fwrite, eccetera). Però hai usato formmail.php come action del modulo, quindi i dati vengono inviati direttamente a quest'ultima pagina (che immagino sia pensata solo per essere scritta, non per gestire i dati in arrivo da un modulo), anziché ad index.php che sarebbe in grado di gestirli.
Una soluzione è cambiare l'action:
Codice PHP:
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
In questo modo i dati saranno inviati alla pagina stessa, e lo script per salvarli si attiverà.
Altra cosa: al momento la fwrite (come il resto dello script) viene chiamata ad ogni caricamento della pagina. Questo significa che, soltanto aprendo la pagina per compilare il modulo, parte una scrittura sul file formmail.php (che produrrà campi vuoti come "Nome: \nE-mail:\nMessaggio:\n"). Sarebbe meglio attivare quel codice solo a condizione che siano stati ricevuti dei dati tramite POST:
Codice PHP:
if (isset($_POST['nome'], $_POST['email'], $_POST['msg'])) {
$nome=$_POST["nome"];
$email=$_POST["email"];
$msg=$_POST["msg"];
//compilo un messaggio combinando i dati recuperati dal form
$testo="Nome:".$nome."\n" ...
...
}
Ultima osservazione: perché scrivere i dati ricevuti in un file PHP?
Per questo genere di operazioni è più semplice e sicuro utilizzare un database. Pensa, per esempio, se qualcuno aprisse il file formmail.php nel browser: potrebbe vedere in chiaro gli indirizzi email degli utenti...