Cu acest script, care foloseste PHP si Ajax, poate fi introdus intr-o pagina web, .php sau .html (inclusiv blog) un formular de contact simplu prin care vizitatorii pot trimite mesaje prin e-mail administratorului site-ului direct din pagina.
- Formularul e valid XHTML si are cod de verificare anti-spamm, iar cu tehnologia Ajax este evitata retrimiterea datelor la refresh.
Scriptul functioneaza si daca utilizatorul are dezactivat JavaScript. Iar ca protectie suplimentara anti-spamm si re-trimitere la refresh, scriptul PHP blocheaza utilizatorul sa trimita alt e-mail in urmatoarele 5 minute.
Pentru cei inteesati de invatarea PHP si Ajax, gasiti in documentatia din cod explicatii ajutatoare.
Acest script e format din 2 fisiere:
<?php
session_start();
// http://www.marplo.net
$to = 'adresa_dv@de.mail'; // Aici inlocuiti cu adresa de e-mail unde va fi trimis mesajul
// Verifica sesiune ce limiteaza trimiterea de cel mult un mail la 5 minute (300 secunde), utila si anti-refresh
if(isset($_SESSION['limit_contact']) && $_SESSION['limit_contact']>(time()-300)) {
echo 'Se poate trimite cel mult un mesal la 5 minute.<br />Mai asteptati '.($_SESSION['limit_contact']-time()+300).' secunde';
exit;
}
// Verifica daca e primit si corect codul de verificare (in caz ca trece de scriptul JavaScript)
if(isset($_POST['anti_spam']) && isset($_POST['anti_spam1']) && $_POST['anti_spam']==$_POST['anti_spam1']) {
// Verifica dacca sunt primite prin post toate datele necesare
if (isset($_POST['nume']) && isset($_POST['email']) && isset($_POST['subiect']) && isset($_POST['mesaj'])) {
$_POST = array_map("trim", $_POST); // Sterge posibile spatii exterioare din date
$_POST = array_map("strip_tags", $_POST); // Elimina cu "strip_tags()" posibile taguri
// Preia datele din formularul HTML
$nume = $_POST['nume'];
$from = 'From: '. $_POST['email'];
$subiect = $_POST['subiect'];
$mesaj = $_POST['mesaj'];
$body = 'E-mail de pe site, trimis de: '.$nume. "\n Adresa lui /ei de e-mail: ". $email. "\n\n"
.'Mesaj: '.$mesaj;
// Trimite datele pt. email si afiseaza mesajul de confirmare sau eroare
if (mail($to, $subiect, $body, $from)) {
// Seteaza o sesiune prin care se blocheaza re-trimiterea mesajului la un eventual refresh sau mai curand de 5 minute
$_SESSION['limit_contact'] = time();
$re = '<p>Stimate/a <b>'.$name.'</b>, mesajul dv. a fost trimis cu succes, veti primi raspuns cat mai curand.</p>
<p>Va multumim pentru interesul acordat.</p>
<p>Daca doriti, vizitati: <a href="http://www.marplo.net">MarPlo.net</a></p>';
}
else $re = 'Eroare: Serverul nu a putut expedia mesajul prin e-mail';
}
else $re = 'Eroare: Campuri de formular netransmise.';
}
else $re = 'Eroare: Cod de verificare incorect';
echo $re;
?>
// http://www.marplo.net
// Functia care formeaza codul anti-spam, dintr-un numar preluat ca milisecunde din data curenta
function set_codas() {
var data = new Date();
var mili_s = (data.getMilliseconds()>10) ? data.getMilliseconds() : 12;
var re = mili_s.toString()+Math.ceil(mili_s/11);
// Adauga codul in campul ascuns din formular si in textul vizibil
document.mailer.anti_spam.value = re;
document.getElementById('codas').innerHTML = re;
return re;
}
var cod_as = set_codas(); // Executa functia pt. crearea codului anti-spam
document.getElementById('div_as').style.display = 'block'; // Face vizibila zona pt. cod de verificare
// Functia pentru preluarea si verificarea datelor din formular
function Validate() {
var formular = document.mailer;
// Preia datele din formular
var file_php = formular.action;
file_php = file_php.split('/').pop(); // Retine doar partea cu numele si extensia fisierului php
var numele = formular.nume.value;
var emailul = formular.email.value;
var subiectul = formular.subiect.value;
var mesajul = formular.mesaj.value;
var cod_as = formular.anti_spam.value;
var cod_as1 = formular.anti_spam1.value;
// Verifica completarea campurilor din formular
if (numele.length<2 || numele.length>40) {
alert('Numele trebuie sa contina intr 2 si 40 caractere');
formular.nume.focus();
}
else if (emailul.length<6 || emailul.indexOf("@")==-1 || emailul.indexOf('.')==-1) {
alert('Adaugati corect adresa dv. de e-mail');
formular.email.focus();
}
else if (subiectul.length<3 || subiectul.length>70) {
alert('Completati subiectul, minim 3 caractere si maxim 70');
formular.subiect.focus();
}
else if (mesajul.length<3 || mesajul.length>500) {
alert('Scrieti mesajul, minim 5 caractere si maxim 500');
formular.mesaj.focus();
}
else if(cod_as!=cod_as1) {
alert('Cod de verificare incorect');
formular.anti_spam1.focus();
}
else {
// Creaza datele care trebuie trimise la ajax (fisierul.php cu datele catre el)
var datele = 'nume='+numele+'&email='+emailul+'&subiect='+subiectul+'&mesaj='+mesajul+'&anti_spam='+cod_as+'&anti_spam1='+cod_as1;
ajaxrequest(file_php, datele); // Apeleaza ajaxrequest()
}
return false;
}
// Functia care verifica si creaza obiectul XMLHttpRequest in functie de browser
function get_XmlHttp() {
// Creaza variabila care va contine instanta la XMLHttpRequest, initial cu valoare nula
var xmlHttp = null;
if(window.XMLHttpRequest) { // Daca browser-ul e Forefox, Opera, Safari, ...
xmlHttp = new XMLHttpRequest();
}
else if(window.ActiveXObject) { // Daca browser-ul este Internet Explorer
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlHttp;
}
// Functia care trimite datele la un fisier PHP si returneaza raspunsul
function ajaxrequest(php_file, datele) {
var cerere_http = get_XmlHttp(); // Apeleaza functia pt. crearea instantei la obiectul XMLHttpRequest
set_codas(); // Executa functia pt. crearea (schimbarea) codului anti-spam
cerere_http.open("POST", php_file, true); // Creaza cererea
// Adauga un Header specific pentru ca datele sa fie recunoscute ca au fost trimise prin POST
cerere_http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
cerere_http.send(datele); // Efectueaza trimiterea cererii, impreuna cu valorile care trebuie transmise
// Verifica starea cererii
// Daca raspunsul e primit complet, il transfera in eticheta HTML cu id-ul din "tagID"
cerere_http.onreadystatechange = function() {
if (cerere_http.readyState == 4) {
// Daca raspunsul de la script contine 'Eroare:' il afiseaza in titlu din formular
// Altfel, il afiseaza in locul formularului
if(cerere_http.responseText.indexOf("Eroare:")!=-1) {
document.getElementById('fc_titlu').innerHTML = cerere_http.responseText;
}
else {
document.mailer.innerHTML = cerere_http.responseText;
}
}
}
return false;
}
<form style="width:350px; background:#e8e8fe; text-align:center;" name="mailer" method="post" onsubmit="return Validate()" action="contact_mail.php"> <h3 id="fc_titlu"><u>Trimiteti mesaj</u></h3> Numele dv.: <input type="text" name="nume" id="nume" size="18" maxlength="40" /><br /> Adresa dv. de e-mail: <input type="text" name="email" id="email" size="18" maxlength="58" /><br /> Subiect: <input type="text" name="subiect" id="subiect" size="28" maxlength="70" /><br /> Scrieti mesajul: (<i>maxim 500 caractere</i>)<br /> <textarea name="mesaj" id="mesaj" cols="35" rows="6"></textarea> <input type="hidden" name="anti_spam" value="" /> <div id="div_as" style="display:none;"> <i>Adaugati urmatorul cod:</i> <b id="codas"> </b><br /> Verificare: <input type="text" name="anti_spam1" value="" size="7" maxlength="7" /> </div> <input type="submit" value="Trimite" id="submit" /> </form> <script type="text/javascript" src="contact.js"> </script>
- Scriptul este gratuit, il puteti modifica si folosi dupa cum doriti. Fiind gratuit, nu se acorda suport, dar daca aveti sesizari, opinii sau intrebari legate de el, va rog sa postati pe Forum, la sectiunea PHP - JavaScript.