Witam wszystkich. Stworzyłem dla kolegi formularz który umożliwia wysyłanie e-maila na jego skrzynkę pocztową.
Najpierw sprawdzam za pomocą js czy wprowadzone dane są poprawne i czy podano wszystko co trzeba. W momencie uruchomienia strony formularza skrypt php losuje jedno z antyspamowych pytań kontrolnych i przechowuje odpowiedź w zmiennych sesji. Po sprawdzeniu JS'em i wysłaniu za pomocą metody POST do osobnego pliku sprawdzam czy udzielono poprawnej odpowiedzi na pytanie kontrolne oraz czy wypełnienie formularza zajęło co najmniej 20 sekund.
Formularz znajduje się na stronie http://sh194765.website.pl/kontakt.php
Kod walidacji JS
$("#contact-form").submit(function()
{
var Email = $("#user-e-mail-in-message").val(); //pobieram wartości z pól formularza
var TelephoneNumber = $("#user-telephone").val();
var Message = $("#message").val();
var ErrorMessage = "Wykryto następujące problemy : ";
var MessageSubject = $("#subject").val();
var Answear = $("#answear").val();
function ValidateEmail(Email)
{
if(Email.indexOf("@") < 0) //każdy adres e-mail ma @ więc na początek to sprawdzam
return false;
var EmailPart = Email.split("@"); //adres musi mieć dwa człony, przed małpą i po
if(EmailPart.length < 2)
return false;
if(EmailPart[1].indexOf(".") < 0) //kropka też musi być
return false;
return true;
}
function ValidateTelephoneNumber(Number)
{
if(Number.indexOf("+") > 0) //pozwalamy na plusik na początku, ale nie więcej
return false;
if(Number.length < 7 ) //numer nie może być za krótki, wiadomo
return false;
return !isNaN(Number.replace(/[ -]/g,'')); //dopuszczam jedynie spacje i myślniki
}
if((Email === "")&&(TelephoneNumber === ""))
ErrorMessage += "Należy podać numer telefonu albo adres e-mail. "; //jakieś namiary trzeba podać więc sprawdzamy czy podano albo jedno albo drugie
if(Email != "") //reszta raczej oczywista
{
if(!ValidateEmail(Email))
ErrorMessage += "Niepoprawny adres e-mail, ";
}
if(TelephoneNumber != "")
{
if(!ValidateTelephoneNumber(TelephoneNumber))
ErrorMessage += "Niepoprawny numer telefonu - można używać jedynie cyfr, 1 znaku + na początku , - oraz spacji. Numer musi mieć co najmniej 7 cyfr. Można nie podawać numeru jeżeli podano e-mail. ";
}
if(MessageSubject.length > 40)
ErrorMessage += "Temat wiadomości jest za długi. Max 40 znaków."
if(Answear == "")
{
ErrorMessage += "Nie wprowadzono żadnej odpowiedzi na pytanie kontrolne";
}
if(Message === "")
{
ErrorMessage += "Wiadomość nie może być pusta...:/"
}
if(ErrorMessage === "Wykryto następujące problemy : ")
return true
else
{
alert(ErrorMessage);
return false;
}
});
W momencie gdy otwierana jest strona formularza(kontakt.php) odpalam skrypt php
$Questions = array( //pytania kontrolne
"Jak nazywa się drugi miesiąc roku",
"Ile jest trzy razy cztery",
"Jak nazywa się stolica Polski",
//itd w sumie pytań jest 30 specjalnie nie pokazałem wszystkich
);
$Answears = array( //odpowiedzi na pytania kontrolne
"luty",
"12",
"warszawa",
//itd
);
$QuestionIndex = rand(0,29); //przypisanie odpowiedzi do pytania kontrolnego do zmiennych sesji jak również czasu gdy formularz powstał
$Question = $Questions[$QuestionIndex];
session_start();
$_SESSION['form-start-time'] = time();
$_SESSION['answear'] = $Answears[$QuestionIndex];
Z kolei po wysłaniu wiadomości poprzez POST do innego pliku, następuje wysłanie maila gdy wszystko gra.
$Raport = "";
$Info = "";
$CustomerData = "";
$Message="";
$Subject = "";
if(isset($_POST['message']) && isset($_POST['anti-spam-answear']) && (isset($_POST['user-telephone-number']) || isset($_POST['user-e-mail-in-message']))) //sprawdzam czy podano wszystkie dane
{
session_start();
$CorrectAnswear = $_SESSION['answear']; //pobieram prawidłową odpowiedź
$UserAnswear = strtolower($_POST['anti-spam-answear']); //zamieniam wszystko na małe literki
$TimePassed = time() - $_SESSION['form-start-time']; //obliczam ile czasu minęło od momentu otworzenia formularza
$_SESSION['form-start-time'] = time(); //czyszczę zmienne sesji
$_SESSION['answear'] = "xA789xxzznM";
if(($CorrectAnswear == $UserAnswear)&&($TimePassed > 20)) //jeżeli odpowiedź jest prawidłowa to wysyłamy
{
//przygotowanie do wysłania
if(isset($_POST['user-telephone-number']))
$CustomerData = "Numer telefonu : ".$_POST['user-telephone-number'].' ';
if(isset($_POST['user-telephone-number']))
$CustomerData .= "EMail : ".$_POST['user-e-mail-in-message'];
$Message = wordwrap($_POST['message'],70,PHP_EOL);
$Message .= PHP_EOL.PHP_EOL.$CustomerData;
$Subject = $_POST['message-subject'];
if(mail("jakiś[email protected]",$Subject,$Message)) //jeśli wszystko git to informujemy o tym
{
$Raport = "Wiadomość wysłana";
$Info = "Dziękujemy za wysłanie wiadomości. W miarę możliwości postaramy się odpowiedzieć jak najszybciej wykorzystując podane przez Pana/Panią namiary. Aby wysłać kolejną wiadomość należy odświeżyć stronę formularza.";
}
else //gdy coś poszło nie tak również informujemy
{
$Raport = "Błąd podczas wysyłania";
$Info = "Wprowadzone dane są poprawne, jednak coś poszło nie tak podczas wysyłania wiadomości. Prosimy poczekać i spróbować ponownie za jakiś czas.";
}
}
else
{
$Raport = "Zatrzymano wysyłanie wiadomości"; //ktoś podał błędną odpowiedź albo wysyła za szybko
$Info = "Filtr antyspamowy zatrzymał wysyłanie z co najmniej jednego powodu. Odpowiedź na pytanie kontrolne była niepoprawna lub też wiadomość została wysłana szybciej niż 20 sekund po pojawieniu się formularza. Aby wysłać drugą wiadomość należy odświeżyć stronę formularza. Niestety takie zabezpieczenia są konieczne ze względu na roboty grasujące w sieci rozsyłające spam. Za utrudnienia przepraszamy.";
}
}
else
{
header('Location: index.html');
exit;
}
Będę bardzo wdzięczny za każdą nawet najbardziej surową krytykę, ale pod warunkiem, że będzie konstruktywna. Zgłaszając zastrzeżenia proszę o szczegółowe uzasadnienie zgłoszonych wątpliwości. Bardzo chętnie poczytam opinie o całości strony chociaż póki co działa tylko "kontakt" i "firma".