Prosty formularz kontaktowy w PHP
Formularz kontaktowy to bardzo użyteczne narzędzie w rękach webmasterów. Dzięki niemu osoby odwiedzające daną stronę, mają możliwość kontaktu z właścicielem witryny. Zamiast uruchamiać osobny program pocztowy co jest niewygodne, wystarczy wypełnić kilka pól i zatwierdzić co spowoduje wysłanie e-maila.
#1: Szkielet formularza
Tworzymy plik kontakt.php, który będzie odpowiedzialny za wyświetlenie formularza, komunikatów oraz wysłanie go pod wskazany adres e-mail. Do tego pliku wklejamy poniższy kod:
Jeżeli zmienna $_POST['submit'] jest pusta, wyświetlamy formularz kontaktowy.
<form action="" method="post">
<tr>
<td>Imię i Nazwisko:</td>
<td><input type="text" name="formName"/></td>
</tr>
<tr>
<td>E-Mail:</td>
<td><input type="text" name="formEmail"/></td>
</tr>
<tr>
<td>Treść wiadomości:</td>
<td><textarea name="formText"></textarea></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="submit" value="Wyślij formularz"/></td>
</tr>
</form>
</table>
Powyższy kod wyświetli formularz zawierający pola takie jak: imię i nazwisko, e-mail, treść wiadomości.
#2: Skrypt obsługujący formularz
Część pierwsza jest już za nami, mamy szkielet prostego formularza kontaktowego który wysyła dane. Zobaczymy teraz, w jaki sposób je odebrać, przetworzyć i w przypadku powodzenia wysłać pod wskazany adres poczty elektronicznej.
} else {
//twoje dane
$email = 'twoj-mail@kontakt.demo';
//dane z formularza
$formName = $_POST['formName'];
$formEmail = $_POST['formEmail'];
$formText = $_POST['formText'];
if(!empty($formName) && !empty($formEmail) && !empty($formText)) {
//--- początek funkcji weryfikującej adres e-mail ---
function checkMail($checkmail) {
if(filter_var($checkmail, FILTER_VALIDATE_EMAIL)) {
if(checkdnsrr(array_pop(explode("@",$checkmail)),"MX")){
return true;
}else{
return false;
}
} else {
return false;
}
}
//--- koniec funkcji ---
Stawiamy warunek który sprawdza, czy wszystkie pola formularza zostały wypełnione. W przypadku wyniku negatywnego skrypt zwróci komunikat o błędzie, inaczej przechodzimy do funkcji która zweryfikuje wprowadzony adres e-mail.
//dodatkowe informacje: ip i host użytkownika
$ip = $_SERVER['REMOTE_ADDR'];
$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
//tworzymy szkielet wiadomości
//treść wiadomości
$mailText = "Treść wiadomości:\n$formText\nOd: $formName, $formEmail ($ip, $host)";
//adres zwrotny
$mailHeader = "From: $formName <$formEmail>";
//funkcja odpowiedzialna za wysłanie e-maila
@mail($email, 'Formularz kontaktowy', $mailText, $mailHeader) or die('Błąd: wiadomość nie została wysłana');
//komunikat o poprawnym wysłaniu wiadomości
echo 'Wiadomość została wysłana';
} else {
echo 'Adres e-mail jest niepoprawny';
}
} else {
//komunikat w przypadku nie powodzenia
echo 'Wypełnij wszystkie pola formularza';
}
//--- koniec formularza ---
}
?>
Ustalamy nadawcę wiadomości - pokaże się on w kliencie pocztowym adresata, a także "wyszumiamy" funkcję mail() która odpowiedzialna jest za wysłanie maila, by w razie niepowodzenia został wyświetlony jedynie zdefiniowany przez nas komunikat o błędzie.
Jeśli natomiast wszystko pójdzie zgodnie z planem, tj. dane wprowadzone przez użytkownika przejdą pomyślnie walidację i zostaną wysłane - to informujemy o wysłaniu wiadomości. Zaistnieć może również sytuacja, w której użytkownik nie wypełni wszystkich pól formularza, wówczas informujemy go o tym fakcie.
Na koniec zapisujemy plik kontakt.php i wysyłamy go na serwer z włączoną obsługą funkcji mail(), PHP. Zakończyliśmy w tym momencie prace nad formularzem.
Czy powyższy skrypt okazał się dla Was pomocny? Czy znalazł u kogoś zastosowanie?
Podobne porady
- Weryfikacja adresu e-mail
- Wyszukiwarka w PHP oparta na plikach tekstowych i tablicy
- Pobieranie poczty z Gmaila nie działa
Komentarze (26)
-
Sorry, mały błąd wkradł się do mojej funkcji checkMail. Oto poprawiona wersja:
function checkMail($checkmail) {
if(filter_var($checkmail, FILTER_VALIDATE_EMAIL))
return checkdnsrr(array_pop(explode("@",$checkmail)),"MX");
return false;
} -
dzień dobry czy nie da się zrobic takiego czegoś aby formularz był wysyłany na maila na na telefon była wysyłana wiadomośc ze takowy mail przyszedł?
-
Owszem, dałoby się. Zainteresuj się programem Gammu.
-
no niestety nic nie rozumiem z tego programu
A pan wie jak to zrobic bo bardzo by mi się taki coś przydało. -
Dawno się nie bawiłem Gammu, ale na phpclasses.org powinno być kilka prostych klas. Jednak używanie Gammu nie jest tanie, ponieważ program wysyła SMS-y z komórki podłączonej do kompa (czyli w tym przypadku musiałbyś mieć 2 komórki - jedną, z której wysyłasz i jedną, z której odbierasz). Wydaje mi się, że rozwiązanie przedstawione przez barteksa w tym przypadku jest lepsze.
-
...a na najlepsze z tego wszystkiego jest to, że funkcja mail nie działa na wszystkich serwerach lub ma ograniczoną ilość wywołań (głównie na darmowych serwerach). Lepiej pobawić się z SMPT
-
nie wiem czy to wina cba.pl czy coś innego ale od jakiegoś czasu nie działa mik ten fantastyczny formularz, a zawsze działał. Nie wiecie co się stało. ?
-
Witam, szybkie pytanie jak sprawic by po weryfikacji poprawnosci danych strona z informacjami o bledach i powodzeniach automatycznie (po 5 sekundach) wracala do formularza. Z gory dzieki.
-
Jak dodać jeszcze jedno pole (telefon) do formularza
-
Dzięki, działa. Wcześniej robiłem podobnie tylko użyłem innej nazwy pola(tel) i nie działało.
-
Witam,
chciałem podpiąc pod to recaptche, lecz mam jakiś problem z weryfikacja kodu bo cokolwiek bym nie wpisal to wyskakuje że źle captcha wpisana. Jakiś pomysł ?
-
Rozbudowałem formularz. Dodałem kilka dodatkowych pół,
input type="radio"oraz listę rozwijaną
select name. Co zmienić aby sprawdzał wypełnienie wszystkich także pola wyboru radio i select? Drugie pytanie - jak zrobić aby w otrzymanym e-mailu wysłanym z tego formularza dane z poszczególnych pół były oddzielone wolnym wierszem (pustą linią, jak )
-
Może mi ktoś powiedzieć jak dodać inne pola do formularza? Dodałem telefon, tak jak tu było pokazane i działa, ale chciałem analogicznie dodać kilka innych i pojawia się wiadomość Wypełnij wszystkie pola formularza...
Wielkie dzięki za pomoc. -
Witam wszystkich!
A co jeśli formularz poprawnie podpięty wyświetla takie info jak chce się wysłać wiadomość:
"Fatal error: Call to undefined function filter_var().... "
a na localhoscie jest "Błąd: wiadomość nie została wysłana" -
Mam pytanie, w którym miejscu w formularzu wstawić kod?


Ja bym nie korzystał z checkdnsrr - a co jak serwer padł na 2 sekundy? Odrzucimy poprawnego maila. Zawsze lepiej przepuścić 5% błędnych niż odrzucić 0.5% poprawnych.
Funkcję sprawdzającą mail można zapisać prościej:
function checkMail($checkmail) {
if(filter_var($checkmail, FILTER_VALIDATE_EMAIL))
return checkdnsrr(array_pop(explode("@",$checkmail)),"MX")
}
Tak, wiem - jestem minimalistą...
Poza tym, formularz do wymiany. Tabelki i brak label. daje więcej możliwości niźli