Form di contatti in PHP con antispam

Vediamo come realizzare un form di contatti in php  con un potente filtro antispam di validazione in ajax, e stilizzandolo grazie alle potenti feature html5/css3.

[lightgrey_box]ATTENZIONE: Questa versione del form è la 1.5 è disponibile una nuova versione più recente e aggiornata. Clicca qui. [/lightgrey_box]

GUARDA LA DEMO >>

Continua a leggere per altre (demo).

01. Premessa e panoramica

Molto tempo fa avevo realizzato la precedente versione che possedeva però alcuni difetti (alcuni resi noti dai nostri lettori): non avevo tenuto conto infatti della “questione” internet explorer. Ero infatti quasi sicuro che il nuovo browser di casa Microsoft alla nona versione avesse (finalmente) supportato anche il controllo html5 per i form di contatti. Purtroppo sono stato smentito e ho dovuto ricorrere all’implementazione di un tool “esterno” per validare il form evitando la tecnica di spam dei “campi vuoti”. In questa nuova versione non ricorrerò a nessun tool o script esterno. Solo puro jQuery, ajax e un pizzico di sano PHP.

Scopri la precedente versione dello script (potrebbe essere didattico per qualcuno).

VERSIONE 1.0

02. Html form

        <form action="engine.php" method="post" name="contactform" id="contact">

        <label for="nome">Nome <span>(richiesto)</span></label><a name="nome"></a>

        <input  tabindex="1" type="text" name="nome" id="nome" value="" placeholder="Scrivi il tuo nome" required/>

        <label for="cognome">Cognome</label><a name="cognome"></a>

        <input  tabindex="2" type="text" name="cognome" id="cognome" value="" placeholder="Scrivi il tuo cognome"/>

         <label for="email">Email <span>(richiesto)</span></label><a name="email"></a>

        <input  tabindex="3" type="email" name="email" id="email" value="" placeholder="Digita la tua Email" required/>

        <label for="oggetto">Oggetto <span>(richiesto)</span></label><a name="oggetto"></a>

        <input  tabindex="4" type="oggetto" name="oggetto" id="oggetto" value="" placeholder="Oggetto della richiesta" required/>

        <label for="messaggio">Messaggio</label>

        <textarea  tabindex="5" cols="50" rows="10" name="messaggio" id="messaggio" placeholder="La tua richiesta"></textarea>

        <input type="text" id="fred" name="fred" style="visibility: hidden;"/> 

        <input type="button" id="bottone" value="Invia" />

        </form>

Come vedete la struttura di base è identica alla precedente versione. Piccolo appunto sull’input “fred” che per chi si fosse perso la puntata precendente, è un input “nascosto” all’occhio umano, pertanto se viene compilato da spammer il form restituirà un messaggio di errore (personalizzabile nel file engine.php).

03. Stile CSS

form#contact  { font-family:arial;font-size:100%; color:#000; font-family: 'Duru Sans', sans-serif; }

form#contact label  {float:left; display:block; margin:3px 0;clear:both;}
form#contact input  {color:#000;margin:0 0 7px 0;border:1px solid #d8d8d8;width:220px;float:right;-moz-border-radius:9px;-webkit-border-radius:9px;background:#f2f2f2; padding:3px 10px;}

form#contact select {color:#000;margin:0 0 7px 0;border:1px solid #d8d8d8;width:240px;float:right;-moz-border-radius:9px;-webkit-border-radius:9px;background:#f2f2f2; padding:3px 5px 3px 10px;}
form#contact option {display:block;color:#666;}

form#contact textarea {color:#666; float:right;font-size:110%;font-family:arial;height:80px;border:1px solid #d8d8d8;width:220px;-moz-border-radius:12px;-webkit-border-radius:12px;background:#f2f2f2; padding:2px 10px;margin-bottom:10px;}

#bottone {background:#a80329; clear:both; border-radius:10px; -moz-border-radius:10px;-webkit-border-radius:10px;border:0;cursor:pointer;color:#fff;margin-top:-20px;float:right;font-weight:bold;font-size:110%; }

.faulty_field{background:#fff4f4 !important;color:#ff0000;border:1px solid #ff0000 !important;}
label span {color:#ff0000;font-size:85%; }

        #errori{ float:left; width:40%;  border:1px solid #F00; background:#efaf9e; clear:left; font-size:70%; margin: 0px 0px 0px -10px; padding:10px; }
	#errori span{ float:right; margin:5px 10px 0px 0px;}

	#risultato{ float:left;border:1px solid #060; background:#9fe4a1; clear:left; width:40%;  margin: 5px 0px 0px 25px; font-size:70%;}
	#risultato span{float:right; margin:10px 10px 0px 0px;}

 Anche questa sezione è molto simile alla precedente, potete personalizzare lo stile come meglio credete, in particolare gli id #errori e #risultato sono i box che conterranno le informazioni relative all’invio del form.

04. La novità: doppio engine!

Nel precedente form si faceva uso di un solo engine, quello php che aveva il compito di inviare la mail. In questa nuova versione ho predisposto  un secondo engine di invio in ajax, che passa i dati via POST al consueto file in php. In questo modo abbiamo la possibilità di rimanere dentro la stessa pagina, e di far visualizzare dei messaggi di errore/invio senza alcun refresh della pagina. Uno dei grossi difetti della precedente versione era infatti il semplice “redirect” finale in caso di successo senza nessun messaggio di feedback (era risolvibile solo usando iframe).

gestione-form.js

$(document).ready(function() {

  //al click sul bottone del form
  $("#bottone").click(function(){

   var timer = 2000;

    //associo variabili generali
    var nome = $("#nome").val();
	var cognome = $("#cognome").val();
	var email = $("#email").val();
	var oggetto = $("#oggetto").val();
	var messaggio = $("#messaggio").val();

       //inizio controllo campi obbligatori	
	if	(nome == "" || email == "" || oggetto == "")  {

			$("<div id='errori'></div>").appendTo("#contact").html("<img src='alert-icon.png' width='20' height='20' style='float:left;' /><span>Compila tutti i campi!</span>").delay(2000).fadeOut(timer);

		} //se ci sono campi vuoti

		else { //se sono stati compilati tutti i campi

  //chiamata ajax
    $.ajax({

      type: "POST",

      url: "engine.php",

	//il form invia i dati all'engine
      data: "nome=" + nome + "&cognome=" + cognome + "&email=" + email + "&oggetto=" + oggetto  + "&messaggio=" + messaggio,
      dataType: "html",

      success: function(msg)
      {
          $("<div id='risultato'></div>").appendTo("#contact").html("<img src='mail-inviata.png' style='float:left;'  /><span>Email inviata con successo</span>").delay(2000).fadeOut(timer);
      },

      error: function()
      {
        alert("Si e' verificato un errore imprevisto...");
      }
    });

		}//else

  });

});

Ecco alcune precisazioni/consigli:

– Nel ciclo if della sezione obbligatori indicate  i campi obbligatori che devono essere riempiti.

– success: specificate cosa fare/far apparire in caso di email inviata

– nel caso di campi non compilati, specificate dopo il primo if il messaggio di errore con relativa (eventuale) animazione.

– error: Specifica cosa far apparire nel caso la chiamata ajax non sia avvenuta (mail non inviata).

timer: indica il tempo di fadeout/in dei box

– Ricordatevi di inserire anche le librerie jQuery!

Ovviamente questa sezione è modificabile a vostro piacimento (vi sconsiglio di usare il metodo GET, lasciatelo POST altrimenti i dati potrebbero essere letti/intercettati in chiaro). Vuoi approfondire l’invio di dati via ajax? leggi questo mio articolo.

05. Motore php invio mail

Il motore di invio mail in php è rimasto pressochè identico alla precedente versione. Ho eliminato ovviamente il redirect finale in fondo al codice dato che è gestito tutto con ajax.

engine.php

//Creato da Mel Riccardo
//v 2.0
//http://www.targetweb.it
//riky.mel@gmail.com
//Vietata ogni tipo di riproduzione, distribuzione senza previa richiesta al programmatore

//Includo Variabili
include('config.php');

session_start();

$nome 		= 	$_POST['nome'];
$cognome 	= 	$_POST['cognome'];
$email 		= 	$_POST['email'];
$messaggio 	= 	$_POST['messaggio'];
$oggetto 	= 	$_POST['oggetto'];
$ip			=	$_SERVER['REMOTE_ADDR'];

//Verifica antispam 

if($_POST['fred'] != "") {
    echo('<p style="color: #000; font-size: 25px; font-weight: bold;">Sei uno spambot o stai usando tecniche di spam indesiderate, spiancenti ma ci siamo attrezzati per i furboni come te. La mail non e stata inviata</p>');
}

else {

//Invio la mail

$to 		= $tua_email;
$sbj 		= "Hai ricevuto una mail dal tuo sito internet - $sito_internet";
$msg 		= "
<html>
<head>
<style type='text/css'>
body{
	font-family:'Lucida Grande', Arial;
	color:#333;
	font-size:15px;
}
</style>
</head>
<body>
<table width='600' border='0' cellspacing='0' cellpadding='5'>
  <tr>
    <td width='121' align='right' valign='baseline'><strong>Nome:</strong></td>
    <td width='459'>$nome</td>
  </tr>

    <tr>
    <td width='121' align='right' valign='baseline'><strong>Cognome:</strong></td>
    <td width='459'>$cognome</td>
  </tr>

  <tr>
    <td align='right' valign='baseline'><strong>Email:</strong></td>
    <td>$email</td>
  </tr>
  <tr>
    <td align='right' valign='baseline'><strong>IP:</strong></td>
    <td>$ip</td>
  </tr>

  <tr>
    <td align='right' valign='baseline'><strong>Oggetto:</strong></td>
    <td>$oggetto</td>
  </tr>
  <tr>
    <td align='right' valign='baseline'><strong>Richiesta:</strong></td>
    <td>$messaggio</td>
  </tr>
   <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
    <tr>
    <td>&nbsp;</td>
    <td><small>Powered by targetweb.it | &copy; Copyright 2011 Riccardo Mel</small></td>
  </tr>

</table>
</body>
</html>
";

$from 		 = $email;
$headers	 = 'MIME-Version: 1.0' . "\n";
$headers	.= 'Content-type: text/html; charset=iso-8859-1' . "\n"; //In certi casi con aruba se non viene formattata eliminare il \r per i permessi come ho fatto in questo caso
$headers 	.= "From: $from";

mail($to,$sbj,$msg,$headers); //Invio mail principale.

//Fine mail inviata a me

//Inizio email di conferma

$toClient		 = $email;
$msgClient		 = "
<html>
<head>
<style type='text/css'>
body{
	font-family:'Lucida Grande', Arial;
	color:#333;
	font-size:15px;
}
</style>
</head>
<body>
<table width='600' border='0' cellspacing='0' cellpadding='5'>
  <tr>
    <td width='117' align='right' valign='baseline'><strong>Grazie,</strong></td>
    <td width='463'>$nome</td>
  </tr>
   <tr>
    <td>&nbsp; Grazie per averci contattato, $sito_internet</td>
    <td>Abbiamo ricevuto la tua mail e ti ricontattermo prima possibile.</td>
  </tr>
    <tr>
    <td>&nbsp;</td>
    <td><small> &copy; Copyright 2011 Riccardo Mel</small></td>
  </tr>

</table>
</body>
</html>
";
$fromClient 	 = $email;
$sbjClient		 = "Grazie, $nome ";
$headersClient	 = 'MIME-Version: 1.0' . "\r\n";
$headersClient	.= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headersClient 	.= "From: $fromClient";

mail($toClient,$sbjClient,$msgClient,$headersClient); //mail inviata al cliente

//Fine email di conferma

//Resetto errori

session_destroy();

echo"<img src='mail-inviata.png'  /><p>Messaggio inviato con successo!</p>";

exit;

} //fine else del controllo antispam

Et voilà! per un corretto uso dei file impostate nel file config.php il sito web e la mail a cui inviare tutte le richieste del form.

06. Demo e Download

form-php-ajax

DEMO V1| DEMO V2 | DOWNLOAD | AVANZATO

07. Licenza e informazioni

Il form è usabile da tutti, mi piacerebbe ricevere un feedback (mail o tramite commento) del suo uso con report di eventuali errori e consigli in vista della terza versione. Si impone di lasciare tutti i riferimenti di credito (sotto forma di commenti) a Targetweb e alla mia persona. Il form può essere usato per fini commerciali, ma non può essere per nessun motivo ridistribuito senza il mio consenso.

08. Supporto

Metti mi piace qui sotto e riceverai il supporto per il form direttamente nella nostra pagina di Facebook! (il supporto non sarà fornito nei commenti all’articolo).

0 0 voti
Valutazione dell'articolo
Iscriviti
Notificami
guest

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

48 Commenti
Vecchi
Più recenti Le più votate
Luca
Luca
14 anni fa

Ciao, mi piace molto questo form e in generale il tuo lavoro.
Solo che non riesco a farlo funzionare sul mio sito.

Ho messo tutto correttamente ma quando vado a provarlo, al momento dell’invio, Appare il messaggio “Si è verificato un errore imprevisto….”.

Io ho modificato il codice togliendo i campi Oggetto e Testo (che non mi servivano) forse potrebbe essere per quello?

Grazie 1000
Luca

silvia
silvia
14 anni fa

Ciao Riccardo, innanzitutto grazie per questo tuo lavoro che è proprio quello che serve a me! 🙂
ho caricato i file sul mio sito e funziona bene, ma vorrei che tutti i campi fossero obbligatori da compilare… come faccio?
nel fiel gestione-form ho trovato questa riga: //inizio controllo campi obbligatori
ed ho pensato di aggiungere lì gli altri campi per renderli obbligatori, ma non ha funzionato… 🙁
premetto che le mie conoscenze di programmazione sono basiche, sto imparando pian piano da sola facendo tanta pratica… e in questo caso mi serve un aiutino!

silvia
silvia
14 anni fa

ehm…. come ti ho scritto, ho già provato ma quello che ho fatto non ha cambiato nulla sul form… ho anche riaggiornato la pagina na nulla… i campi obbligatori son solo quei 3 e basta…. help! 🙁

silvia
silvia
14 anni fa

tu mi dici:
assicurati di aver scritto tutti gli ID anche (es. email –> id=”email” etc)

ma in quale file? sempre gestione-form.js o in un altro (quale allora?)?

scusa per le tante domande ma pare strano pure a me che modificando quella stringa non basti… ed io non ho le idee molto chiare su come fare…

silvia
silvia
14 anni fa

ho risolto! avevo dimenticato di scrivere ‘required’ ai 2 input del form che volevo rendere obbligatori…

roby
roby
14 anni fa

Ciao! grazie per questo form molto bello.
Per renderlo più completo potresti suggerirci come fare ad inserire un checkbox (obbligatorio) per accettazione delle condizioni sulla Privacy?
Ho provato in vari modi, ma ahimè… ;(
anch’io tristemente inesperta…

Luca
Luca
14 anni fa

Grazie della risposta.
Ho modificato tutto secondo i tuoi consigli e ora non mi da più quel messaggio.
Però non funziona. Probabilmente perché forse ho toccato qualcosa.
Non da nessun segno di vita. Se vedi questo sito di prova http://www.camping-elite.com/test ti renderai conto di cosa intendo.

Io ho soltanto tolto tutte le voci “messaggio” e “oggetto” da i vari file php e js.
Potrebbe essere dovuto al fatto che non ho compilato tutte le voci del file config.php? (ho messo solo la mia mail fra virgolette.

Grazie
Luca

Luca
Luca
14 anni fa

Perdonami se ti scoccio ancora Riccardo.
Il tuo form è veramente bello e vorrei farlo funzionare.
Ho iniziato da capo per capire se ho sbagliato da qualche parte.
Ho scaricato tutto il tuo pacchetto e sto provando a farlo funzionare senza nessuna modifica. Ho cambiato solo l’email destinatario sul java script, inserendo la mia. Sembra funzionare ma non ricevo nessuna email (ho controllato anche la casella antispam). Devo per caso cambiare qualcos’altro?

Grazie

andrea
andrea
Rispondi a  Riccardo Mel
14 anni fa

ciao Riccardo,
cosa intendi:
(richiede il modulo per l’invio di mail con php , in locale non invia)?

se lo carico su un dominio register.it funziona o devo avere un “modulo” particolare?

grazie

andrea
andrea
Rispondi a  Riccardo Mel
14 anni fa

Ovviamente in locale non funziona, ma allo stesso tempo il dominio sul quale viene posizionato il form mail deve essere abilitato agli script php. Per la maggior parte è ovvio, ma non per tutti.
Esattamente sul supporto register ho travato questa risposta per controllarne il funzionamento:
“Il supporto per gli script php e’ disponibile solo sulle soluzioni Hosting Developer e Hosting Business. Per prima cosa controlla la correttezza del codice; nel caso di errori nello script, il linguaggio PHP visualizza nella pagina in che punto e di che tipo è l’errore.

Per verificare il funzionamento degli script php puoi per esempio digitare il seguente testo:

in un file chiamato prova.php, trasferiscilo via FTP e richiamalo via browser.

Se il supporto php funziona correttamente visualizzerai una schermata con la lista delle impostazioni di php sui nostri server. Cliccando sul link ‘Informazioni tecniche’ nella sezione di Gestione hosting del tuo pannello di controllo potrai verificare le varie versioni di PHP o altro attivate.”

Ecco perché il modulo non funzionava……
grazie
ciao

Surface
Surface
14 anni fa

Perchè funziona tutto, ma quando premo invia mi arriva la mail ma non compare il messaggi”Email inviata con successo”…. Come mai??

Daniele
Daniele
14 anni fa

Salve Riccardo, il modulo di prenotazione avanzato mi piace molto e con qualche modifica si adatterebbe molto bene al mio sito per la prenotazione delle lezioni. Cosa chiedi per il form avanzato?
Grazie ciao

Nickol
Nickol
14 anni fa

Ciao, un bel lavoro. Io vorrei inserire anche il telefono ed altre info, che sono presenti in quello avanzato. Si potrebbe avere?

Beppe
Beppe
14 anni fa

Complimenti per quanto pubblichi,
appena il lavoro mi darà qualche ora di tregua proverò ad utilizzare il tuo
piacevolissimo Form.

Ancora tantissimi complimenti.

Yenn
Yenn
14 anni fa

ciao innanzitutto complimenti, nonostante abbia dovuto prendere pezzi di script per implementare tutto su un sito già attivo, fila tutto liscio.
solo un piccolo neo: i caratteri speciali vengono interpretati in maniera errata così mi ritrovo delle cose incomprensibili al posto delle è ì ù à etc… sai come si può ovviare a questo problema?

grazie in anticipo!

Marco Grazia
Marco Grazia
Rispondi a  Yenn
13 anni fa

Perché l’invio della email avviene in ISO 8859-1 che usa solo alcuni caratteri dell’alfabeto latino occidentale, se vuoi andare sul sicuro devi usare la codifica UTF-8 anche se poi bisognerebbe vedere se sul server di posta è abilitata, tu comunque prova al limite non funziona 🙂

Ciauz M.

Yenn
Yenn
14 anni fa

un altro problema:
se invio senza compilare i campi, mi restituisce il messaggio di errore ma il messaggio viene inviato lo stesso, vuoto, con solo l’indirizzo ip.

non ho modificato molto quindi non dovrebbe essere un problema di implementazione, in ogni caso ti posto il codice:

qui il form:
http://pastebin.com/TUrLr25d

qui il gestione-form:
http://pastebin.com/0KbT9vHd

qui l’engine:
http://pastebin.com/epL4wveq

ti ringrazio sempre se vorrai aiutarmi!

Serena
Serena
13 anni fa

Ciao, sto provando a sistemare il sito della mia scuola e vorrei inserire ill form contatti, vorrei poter aggiungere un checkbox obbligatorio e il controllo, serve per accettare l’informativa sul trattamento, saresti così gentile da aiutarmi?
Trovo il tuo form molto completo e ti ringrazio per averlo condiviso con noi.

Serena

Serena
Serena
13 anni fa

Ciao, sto provando a sistemare il sito della mia scuola e vorrei inserire il tuo form contatti, vorrei poter aggiungere un checkbox obbligatorio e il controllo, serve per accettare l’informativa sul trattamento, saresti così gentile da aiutarmi?
Trovo il tuo form molto completo e ti ringrazio per averlo condiviso con noi.

Serena

Serena
Serena
Rispondi a  Riccardo Mel
13 anni fa

Ciao Riccardo, scusami se ti posso sembrare sfacciata ma il form così com’è a me va più che bene, ne ho parlato già con il responsabile e devo consegnare la cartella completa lunedì, sto curando l’aspetto grafico e non riuscirei a trovare il tempo per ricrearlo da capo, ergo ti va dirmi via email quale codice inserire?
Se non ti va non è problema, garantito 🙂

Serena

Serena
Serena
13 anni fa

Mi puoi contattare su la fa ta nomemio@ libero .it
Grazie ancora.
Buona serata

claudia
claudia
13 anni fa

scusa in anticipo per la stupidità della domanda, ma non riesco a capire come faccio a collegare il form alla pagina del sito in cui lo voglio mettere. C’è un tag che devo mettere?
grazie

claudia
claudia
Rispondi a  claudia
13 anni fa

No, scusa…sono un po’ fusa io in questi giorni…fai finta che la domanda precedente non te l’abbia mai posta!grazie e scusa ancora…

Enrico
Enrico
13 anni fa

ciao Riccardo, complimenti per il lavoro ma haimè ho un problema…. uso lo stesso tuo form su un sito di altervista e tutto funziona alla perfezione; carico lo stesso sul sito di impresa semplice di telecom italia e non arriva ne la mail al mittente ne al destinatario anche se sulla pagina del form mi dice che la mail è stata inviata.

Alla super assistanza di telecom – impresa semplice mi han parlato di SMTP…. non so più dove sbattere la testa!!!

Enrico
Enrico
Rispondi a  Riccardo Mel
13 anni fa

l’assistenza mi ha risposto che è una piattaforma Microsoft e ha una versione PHP 5.3.6
A I U T O !!!

Marco Grazia
Marco Grazia
Rispondi a  Enrico
13 anni fa

Se ti dice che la mail è stata inviata vuol dire che comunque il php funziona, se no magari ti mostrava il codice come fosse semplice testo e non lo interpretava.
E’ possibile che Telecoma usa un sistema simile ad Aruba o Register.
Scrivigli chiedendo numi sul sistema per mandare un’email tramite PHP o leggiti la documentazione del tuo pannello di controllo, queste informazioni ci sono sempre ed è probabile che usino lo stesso script di Register.

Ciauz M.

Marco
Marco
12 anni fa

Ciao!

Ho provato a integrare il tuo lavoro nel sito che sto sviluppando.
Ho solo modificato i file css ma quando tento di inviare una mail di prova mi esce l’errore “Si e’ verificato un errore imprevisto…”
Sto utilizzando MAMP per il php.

Spero tu riesca a darmi una mano…

Maurizio
Maurizio
12 anni fa

CIao Riccardo, ho cercato nel forum ma nessuno ha riscontrato il mio problema… Il form invia correttamente la mail di conferma al cliente, ma gli arriva una mail da se stesso… come posso fare per evitare che ciò accada?

Delfo
Delfo
12 anni fa

Salve,
mi permetto di disturbarti perché proprio non vengo a capo del problema.
Il mio sito è in costruzione e devo mettere il checkbox per l’accettazione dell’informativa sulla privacy. Ho provato anche con Conctact Form 7 senza esito!
Ho visto che ne hai già parlato, ma non ho trovato nulla, evidentemente sono fuori fase.
Puoi aiutarmi?
Grazie in anticipo e complimenti davvero!.

Emanuele
Emanuele
11 anni fa

Ciao e complimenti per il tuo lavoro.
Sinceramente non capisco perchè mi va in “errore imprevisto” quando compilo il form e procedo all’invio. Ho analizzato il file gestione-form.js e la chiamata ajax che gestisce il passaggio dei dati al file engine.php, ma non so darmi una spiegazione. Preciso che l’errore si presenta senza modificare nulla nei file da te messi a disposizione.
Grazie

Valerio
Valerio
11 anni fa

Salve io ho configurato tutto alla perfezione messo anche la mia mail in config.php eppure provando il form non mi arriva nessuna mail anche se il campo dice mail inviata con successo

Rimani Aggiornato
Nuove idee, zero Spam
Ti invieremo solo le ultime novità di articoli o nostri progetti.
Iscrivendoti accetti la nostra privacy poliicy. Una volta iscritto, ricordati di attivare l'iscrizione cliccando sul link ricevuto via mail.
48
0
Esprimete la vostra opinione commentando.x