Controllare che i campi siano stati compilati con JavaScript/jQuery è buona cosa, ma lo stesso controllo va effettuato anche nel codice PHP. Il motivo è che un utente può disabilitare l'esecuzione di JavaScript nel browser evitando i controlli ed inviare una richiesta con campi non compilati (oppure forgiare una richiesta senza nemmeno passare dal browser).
Codice PHP:
if (!isset($_POST['nome'], $_POST['cognome'], ..., $_POST['messaggio'])) {
echo "Errore: alcuni campi non sono compilati";
return;
}
Nel JavaScript hai qualche motivo particolare per passare usare una query string nella funzione send, anziché un oggetto? È vero che teoricamente l'utilizzo dell'uno o dell'altro è indifferente, d'altro canto creare a mano una query string concatenando i pezzi può essere fonte di errore (ad esempio hai utilizzato "cognome" anziché "&cognome="). Passando un oggetto la conversione è automatica e non corri rischi.
Attenzione anche a come termini gli headers addizionali quando mandi l'email: la documentazione suggerisce di usare "\r\n" anziché "\n".