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:

<?php
//--- początek formularza ---
if(empty($_POST['submit'])) {
?>

Jeżeli zmienna $_POST['submit'] jest pusta, wyświetlamy formularz kontaktowy.

<table>
<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.

<?php
} 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.


if(checkMail($formEmail)) {
  //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$formTextnOd: $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?

Podgląd Pobierz
↑ Skocz do góry

Opublikowano: 18 maja 2010. Autor: Bartosz Stefanicki.
Tagi: , , , , , .

Dodaj komentarz

54 komentarzy do "Prosty formularz kontaktowy w PHP"

avatar
Sortuj wg:   najnowszy | najstarszy | oceniany
Eliza
Gość

a to skrypt do wysyłania pliku

[code lang="javascript"]
$target_path = "/identyfikacja-wizualna/uploads/";

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file ". basename( $_FILES['uploadedfile']['name']).
"Plik został wysłany";

} else{
echo "Wystąpił problem z przesłaniem pliku. Prosimy spróbowac ponownie.";
}

[/code]

Paweł
Gość

jak zrobić żeby po wyświetleniu komunikatu o poprawnym wysłaniu wiadomości automatycznie powrócił na stronę główną lub kontaktową?

Eliza
Gość
Zrobiłam formularz, chociaż nie jestem wybitną znawczynią php i mam taki oto kod: [code lang="php"]<?php } else { //twoje dane $email = 'kontakt@e-biznet.com.pl'; //dane z formularza $formName = $_POST['Zamówienie']; $formEmail = $_POST['formEmail']; $mailText = $_POST['mailText']; $business_name = $_POST['business_name']; $business_baseline = $_POST['business_baseline']; $business_description = $_POST['business_description']; $business_website = $_POST['business_website']; $business_sector = $_POST['business_sector']; $designs[] = $_POST['designs[]']; $colors = $_POST['colors']; $background_color = $_POST['background_color']; $uses[] = $_POST['uses[]']; $uploadedfile = $_POST['uploadedfile']; $other = $_POST['other']; if(!empty($formEmail) && !empty($business_name) && !empty($business_sector) && !empty($business_baseline) ) { //--- 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 {… Czytaj więcej »
leon
Gość

jak dodac pytanie antyspamowe? np 2+3? pięć

leon
Gość

juz naprawilem tak nalezy poprawic linijke php, ach to samouctwo :D

$mailText = "Treść wiadomości: $formText Od: $formName, $formEmail ($ip, $host)";

leon
Gość

maile dochodza tylko zamiast pokazać treść jest coś takiego w mailu:
Treść wiadomości:n:
i dalej w tej linijce jest adresat i mail ktore sa wyswietlane

leon
Gość

dodatkowym problemem jest to ze formularz mowi ze wyslano, ale mail do teraz nie doszedl na docelowa skrzynke

leon
Gość

oki juz poprawilem :)
a jak zrobic by po wyslaniu maila nie wyswietlala sie biala strona, tylko komunikat o wysylce pojawial sie na stronie skad poszedl mail,dobrze gdyby pola byly wtedy czyszczone.
czy mozna troche poszerzyc pola Imie i nazwisko oraz Temat i Email?

leon
Gość

witam
formularz wyrzuca mi blad:
Parse error: syntax error, unexpected '}' in [...] on line 3
o co moze chodzic, skopiowalem twoj kod do pliku php wraz z poprawkami adriana i commandera - pomoz..
warto dodac ze pierwszy kod z tabelki wklejami do szablonu strony a drugi kod - to juz formularz php do zapisu w notatniku z rozszerzeniem php

Bartosz Stefanicki
Gość

@Leon,

Spróbuj wstawić kod z porady bez żadnych poprawek i sprawdź czy działa, daj znać. Jeżeli pytasz o weryfikację, polecam captcha.

Jaason
Gość

A ja mam taki błąd, funkcja checkMail się sypie. Co prawda odpalone na localhoście ale kto wie czy to nie grubsza sprawa.
[code lang="html"]Strict Standards: Only variables should be passed by reference in C:xampphtdocstestformsend.php on line 39[/code]

miszcz
Gość

A ja mam zupelnie inny problem... Wiadomosci dochodza tylko jesli w polu nadawcy maila podam swoj email:D Jesli podam jakikolwiek inny poprawny adres, niby wiadomosc wyslana ale nic nie dochodzi. Jesli wpisze nieistniejacy lub bledny adres email, wtedy jest info o bledzie. Ale jakim cudem wiadomosci dochodza tylko jesli w polu email podam adres swojego meila ? I tylko na yahoo, jesli podam przyklamdowo o2 - lipa, nie ma info o bledzie ale nic nie dochodzi. Co jest grane ?

miszcz
Gość

....ok miszcz PHP rozwiazal juz swoj problem. Ale oszczegam, jesli jeszcze raz mi cos nie zadziala to bede scigal autora postu :D

Ernesto
Gość

[code lang="php"][/code]

Oto sposób na panowanie nad wymiarami pól.

as
Gość

pokazuje mi taki komunikat ;[[:

Fatal error: Call to undefined function: filter_var() in /homez.323/gniazdo/www/kurier24/proba.php on line 44

o co tu chodzi:

linia 44 to: if(filter_var($checkmail, FILTER_VALIDATE_EMAIL)) {

Bartosz Stefanicki
Gość

@As,

http://itporady.pl/html-css/prosty-formularz-kontaktowy-w-php/#comment-202

Sprawdź czy masz włączone filter_var() na serwerze.

Bartosz Stefanicki
Gość

@Tomasz,

Sprawdź czy wszystkie funkcje masz włączone, plik musi mieć rozszerzenie .php

Tomasz
Gość

Jak ten skrypt wstawić w plik html? index.
Jak wchodze na ten skrypt wypełniam dane klikam "OK" i wiadomości ma maila nei otrzymuje. Używam XAMPP 1.7.7

Tomasz
Gość

Wprowadziłem wszystko ponownie i teraz wyskakuje mi błąd w 44 lini..
tj.: if(checkdnsrr(array_pop(explode("@",$checkmail)),"MX")){

Paweł
Gość

jeszcze jedno w kturym miejscu dokładnie wstawić ten header ?

Paweł
Gość

Witam mam takie pytanie jak w tym formularzu zrobić swój przycisk (obrazek z napisem wyślij )

Adrian
Gość

Po dwóch dniach męki doszedłem do błedu a mianowicie wystarczy zmienić w tym miejscu
//adres zwrotny
$mailHeader = "From: $formName "; na

//adres zwrotny
$mailHeader = "Content-type: text/plain; charset=utf-8";

Grzegorz
Gość

Niestety dalej to samo... Z funkcją kodującą znaki - maile nie przechodzą. Bez funkcji - maile przechodzą. Kodowanie zmieniłem na "utf-8". Jest jeszcze jakaś możliwość?

Bartosz Stefanicki
Gość

@Grzegorz,

Windowsowego kodowania nie używa się już. Pozmieniaj na uniwersalne UTF-8.

Grzegorz
Gość

Zrobiłem tak jak napisałeś. Zmieniłem tylko "utf-8" na "Windows-1250" bo cała strona chodzi na tych kodach. Funkcje się chyba wykonują bo nie wyskakują błędy. Otwiera się strona że Wiadomość została wysłana, lecz na pocztę maile nie dochodzą. Jak usuwam funkcję to przechodzą bez problemu. Co może być tego przyczyną?

Bartosz Stefanicki
Gość

@Grzegorz,

dodaj do kodu:

[code lang="php"]//adres zwrotny
$mailHeader = "From: $formName ";
$mailHeader .= "Content-type: text/plain; charset=utf-8rn";[/code]

Grzegorz
Gość

Jest jeszcze jeden problem. Formularz na pocztę dochodzi bez polskich znaków. Gdzie wstawić funkcję "charset" i jak poprawnie powinna wyglądać?

Bartosz Stefanicki
Gość

@asia,

Header to nagłówek, czyli na początku kodu.

asia
Gość

Mam pytanie, w którym miejscu w formularzu wstawić kod?

[code lang="php"]header('refresh: 5; url=http://nazwa-strony.pl');[/code]

Bartosz Stefanicki
Gość

@mati,

Sprawdź czy masz włączone filter_var() na serwerze.

mati
Gość

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"

Bartosz Stefanicki
Gość

@Wieszczu,

Nie zapomnij o weryfikacji danych które sprawdzane są przy przetwarzaniu formularza, w tym miejscu:

[code lang="php"]if(!empty($formName) && !empty($formEmail) && !empty($formText))[/code]

Bartosz Stefanicki
Gość

@Adam,

W tym miejscu musisz dodać nowe wartości:
[code lang="php"]if(!empty($formName) && !empty($formEmail) && !empty($formText))[/code]

Nowy wiersz dodaje się w ten sposób:
[code lang="php"]$mailText = "Treść wiadomości:n$formTextnOd: $formName, $formEmail ($ip, $host)";[/code]

Mowa tu o: n.

wieszczu
Gość

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.

Adam
Gość

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 )

wpDiscuz