Prosty formularz kontaktowy w PHP

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:

<?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>&nbsp;</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$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?

Zobacz podglądPobierz plik

Podobne porady

Komentarze (26)

  1. Comandeer pisze:

    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

  2. Comandeer pisze:

    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;
    }

  3. Bartek pisze:

    @Comandeer, jest to małe ryzyko aczkolwiek możliwe, rozwiązanie podane przez Ciebie jest również jak najbardziej poprawne.

  4. rychu pisze:

    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ł?

  5. Comandeer pisze:

    Owszem, dałoby się. Zainteresuj się programem Gammu.

  6. rychu pisze:

    no niestety nic nie rozumiem z tego programu
    A pan wie jak to zrobic bo bardzo by mi się taki coś przydało.

  7. Bartek pisze:

    @rychu,
    Możesz zainstalować prostą i bezpłatną aplikację Gmail na telefon komórkowy. Dzięki niej sprawdzisz nowe wiadomości na swojej poczcie.

    Jeśli masz tam konto to wystarczy, że się zalogujesz. W innym przypadku możesz założyć konto Gmail i tam przekierowywać nowe wiadomości z formularza.

  8. Comandeer pisze:

    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.

  9. Suchy pisze:

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

  10. rychu pisze:

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

  11. Bartek pisze:

    Suchy, jeśli kogoś nie stać na płatny serwer to nie poradzę. Poza tym, większość darmowych hostingów posiada włączoną funkcję mail().

    Rychu, skoro funkcjonował wcześniej to dziwne, żeby nagle się obraził i odmówił sam z siebie posłuszeństwa. Na hostingu cba.pl pewnie zmienili ustawienia, lub ograniczyli jakąś funkcję.

  12. alek pisze:

    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.

  13. Bartek pisze:

    Przekierowanie w PHP:

    header('refresh: 5; url=http://nazwa-strony.pl');
  14. Shadow pisze:

    Jak dodać jeszcze jedno pole (telefon) do formularza

  15. Bartek pisze:

    @shadow

    1) W kodzie formularza dodajemy pole dla telefonu:

    <tr>
      <td>E-Mail:</td>
      <td><input type="text" name="formEmail"/></td>
    </tr>
    <tr>
      <td>Telefon:</td>
      <td><input type="text" name="formPhone"/></td>
    </tr>
    <tr>
      <td>Treść wiadomości:</td>
      <td><textarea name="formText"></textarea></td>
    </tr>

    2) W skrypcie na początku, tworzymy wartość $formPhone i przypisujemy jej dane otrzymane z formularza:

    //dane z formularza
    $formName = $_POST['formName'];
    $formEmail = $_POST['formEmail'];
    $formText = $_POST['formText'];
    $formPhone = $_POST['formPhone'];
    if(!empty($formName) && !empty($formEmail) && !empty($formPhone) && !empty($formText)) {

    3) W skrypcie pod koniec, dodajemy wartość telefonu do treści wiadomości:

    //treść wiadomości
      $mailText = "Treść wiadomości:\n$formText\nOd: $formName, $formEmail, $formPhone ($ip, $host)";
  16. Shadow pisze:

    Dzięki, działa. Wcześniej robiłem podobnie tylko użyłem innej nazwy pola(tel) i nie działało.

  17. someone pisze:

    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ł ?

  18. Bartek pisze:

    someone,
    nie jest to wina formularza z itporady.pl, postępuj zgodnie z dokumentacją reCaptcha: http://code.google.com/intl/pl-PL/apis/recaptcha/docs/php.html

  19. Adam pisze:

    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 )

  20. wieszczu pisze:

    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.

  21. Bartek pisze:

    @Adam,

    W tym miejscu musisz dodać nowe wartości:

    if(!empty($formName) && !empty($formEmail) && !empty($formText))

    Nowy wiersz dodaje się w ten sposób:

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

    Mowa tu o: \n.

  22. Bartek pisze:

    @Wieszczu,

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

    if(!empty($formName) && !empty($formEmail) && !empty($formText))
  23. mati pisze:

    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"

  24. Bartek pisze:

    @mati,

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

  25. asia pisze:

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

    header('refresh: 5; url=http://nazwa-strony.pl');
  26. Bartek pisze:

    @asia,

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

Dodaj komentarz

Pola w formularzu oznaczone * gwiazdką są wymagane. Jeśli chcesz załączyć kod, wstaw go do odpowiedniego znacznika (do wyboru: php, html, css):
[code lang="php"]<?php ?>[/code]

Imię *
Email * Adres strony
Treść *