154 30/03/2026 07/04/2026 6 min

Diagnosi probabile

Quando un form contatti non invia, la causa più comune non è il modulo in sé ma uno dei passaggi che lo supportano: PHP che genera un errore, SMTP configurato male, blocco lato hosting, SPF/DKIM/DMARC incoerenti, oppure una chiamata AJAX che si interrompe prima di completare l’invio. In alcuni casi il form “sembra” funzionare perché mostra un messaggio di successo, ma l’email non parte davvero o finisce in spam.

La diagnosi giusta parte sempre da una domanda semplice: il problema è nella submission del form, nella generazione della mail, nella consegna, oppure nella ricezione? Se si salta questo passaggio, si rischia di cambiare plugin, tema o server senza risolvere nulla.

Principio operativo: prima si verifica dove si ferma il flusso, poi si applica il fix minimo e reversibile.

Verifiche immediate

  1. Controlla se il form produce un invio reale oppure solo un messaggio grafico. Apri il sito, invia una prova e verifica se arriva almeno una richiesta nel pannello del plugin o nei log applicativi. Se compare “messaggio inviato” ma non arriva nulla, il problema è nella posta o nella parte server-side.
  2. Verifica la posta in arrivo e lo spam. Controlla la casella destinataria, la cartella spam e, se usi un servizio esterno come Microsoft 365, Google Workspace o un antispam, cerca il messaggio nei log di ricezione. Se il messaggio compare in spam, il problema è spesso di autenticazione del dominio o reputazione del mittente.
  3. Controlla i log del sito o del pannello hosting. In cPanel, Plesk o FastPanel cerca errori PHP, errori del web server e log del plugin del form. Se trovi errori tipo mail() fallita, timeout, nonce scaduto, 403 o errore SMTP, hai già il punto di rottura.
  4. Prova un invio con un mittente del tuo dominio. Se il form usa un indirizzo esterno come mittente, alcuni server rifiutano o penalizzano il messaggio. Un mittente coerente con il dominio riduce i blocchi e migliora la consegna.

Soluzione consigliata passo-passo

  1. Stabilizza il flusso usando SMTP al posto della funzione mail nativa. Se il form usa la funzione PHP mail(), passa a SMTP autenticato. È la soluzione più sicura e verificabile perché ti permette di usare credenziali, TLS e log di consegna. In WordPress, ad esempio, puoi farlo dal plugin del form o con un plugin SMTP dedicato; in altri CMS il principio è lo stesso: invio autenticato, non invio anonimo.
  2. Verifica il mittente e il destinatario. Imposta come mittente un indirizzo del dominio, ad esempio noreply@tuodominio.it o info@tuodominio.it, e come destinatario una casella realmente attiva. Evita alias non configurati, forward incompleti o caselle piene. Se la casella è su hosting condiviso, verifica anche i limiti giornalieri di invio.
  3. Controlla SPF, DKIM e DMARC. Se il form invia dal tuo dominio, i record DNS devono essere coerenti con il provider di posta. Un SPF mancante o troppo permissivo, un DKIM non firmato o un DMARC troppo rigido possono causare rifiuti o spam. La verifica va fatta sul dominio del mittente, non su quello del destinatario.
  4. Escludi il blocco lato hosting. Alcuni provider limitano l’invio tramite PHP o bloccano SMTP verso porte specifiche. Se hai accesso al pannello, cerca la sezione email o i limiti di invio. Se il form ha smesso di funzionare dopo un aggiornamento, controlla anche che non sia stato introdotto un blocco di sicurezza o un CAPTCHA mal configurato.
  5. Controlla JavaScript e richieste AJAX. Se il form usa AJAX, un errore di script può interrompere la richiesta prima dell’invio. Apri la console del browser e verifica se compaiono errori. Se ci sono errori JS, il fix non è nella posta ma nello script o nel tema che interferisce.
  6. Fai una prova minima con un form semplice. Crea una pagina di test con un solo campo email e un messaggio breve. Se il form minimale funziona, il problema è nel form originale, nei suoi campi condizionali, in un plugin aggiuntivo o in un hook personalizzato. Se non funziona, il problema è quasi certamente server, posta o DNS.

Se usi WordPress, il percorso pratico è questo: verifica il plugin del form, disattiva temporaneamente estensioni che toccano cache, sicurezza o SMTP, e riprova. I plugin di cache e sicurezza possono bloccare nonce, token o richieste POST se hanno regole troppo aggressive.

Se usi cPanel, controlla Metrics > Errors, Email > Track Delivery e le impostazioni della casella. Se il messaggio parte ma non arriva, Track Delivery spesso mostra se è stato accettato, rifiutato o filtrato. Se usi Plesk, verifica Mail, i log del dominio e le impostazioni anti-spam. In FastPanel, controlla il dominio, i log e la configurazione mail associata al sito.

Se il problema è su un hosting Linux con accesso SSH, i controlli essenziali sono questi:

tail -n 100 /var/log/maillog

oppure, su alcuni sistemi:

tail -n 100 /var/log/mail.log

Se compaiono errori SMTP, rifiuti di autenticazione o connessioni negate, hai già la conferma del punto di rottura. Se invece non compare nulla, devi guardare i log applicativi del sito e del web server.

Per verificare rapidamente la posta inviata dal server, spesso è utile controllare anche la coda mail:

mailq

Se la coda è piena o i messaggi restano bloccati, il problema è nella consegna in uscita. Se la coda è vuota ma il destinatario non riceve, il problema può essere a valle: filtraggio, reputazione o configurazione DNS.

Un caso molto frequente è questo: il form usa un indirizzo mittente esterno, ad esempio Gmail o un provider terzo, ma il server invia dal dominio del sito. In quel caso alcuni sistemi considerano il messaggio sospetto. La soluzione più pulita è inviare con SMTP autenticato del dominio o del provider mail ufficiale, mantenendo coerenza tra mittente, server e record DNS.

Se il form ha iniziato a fallire dopo un aggiornamento, ripristina prima la compatibilità: disattiva solo il plugin coinvolto, prova una versione precedente se disponibile, oppure disabilita temporaneamente funzioni avanzate come file upload, campi condizionali, reCAPTCHA o integrazioni esterne. Il fix minimo è sempre meglio di una riscrittura completa.

Se sospetti un problema di spam o reputazione, controlla anche la presenza di SPF, DKIM e DMARC con gli strumenti del provider DNS o con un controllo esterno. Un dominio senza autenticazione mail può inviare per anni e poi iniziare a perdere messaggi quando i filtri diventano più severi.

Controlli finali / rollback

  1. Ripeti il test di invio e verifica il risultato end-to-end. Il controllo è concluso solo se il form invia, il server accetta il messaggio e la casella destinataria lo riceve senza errori evidenti.
  2. Verifica i log dopo la correzione. Se hai cambiato SMTP o impostazioni DNS, controlla che non compaiano nuovi errori in web server, PHP o mail log per almeno un paio di invii di prova.
  3. Rollback sicuro se il fix peggiora la situazione. Se dopo il passaggio a SMTP i messaggi peggiorano o il sito mostra errori, torna temporaneamente alla configurazione precedente solo per ristabilire il servizio e poi correggi un parametro alla volta. Conserva sempre una copia della vecchia configurazione prima di modificare plugin, record DNS o credenziali.

Se vuoi un risultato affidabile, il percorso migliore è questo: test minimo, log, SMTP autenticato, verifica DNS, poi controllo finale. In un form contatti, quasi mai la soluzione giusta è “toccare tutto”: di solito basta individuare il punto esatto in cui il messaggio si ferma e correggerlo con la modifica più piccola possibile.