Prosty formularz kontaktowy w PHP

Data aktualizacji: 22.04.2024r. Autor: Bartosz Stefanicki.

Prosty formularz kontaktowy w PHP

Dzięki formularzowi wysłanie wiadomości będzie dla klienta szybsze, a strona w odbiorze bardziej profesjonalna.

Pierwsza wersja tej porady została opublikowana 18 maja 2010 roku. Poniższy artykuł został zaktualizowany.

1. Tworzymy plik

Na początek tworzymy plik o nazwie kontakt.php. Po wrzuceniu go na serwer będzie dostępny pod adresem np. www.nazwa-strony.pl/kontakt.php. Pierwszy będzie szkic, a więc podstawowe tagi z języka HTML.

<html lang="pl">
<head>
    <title>Formularz kontaktowy</title>
    <!-- CSS Bootstrapa -->
</head>
<body>

</body>
</html>

Formularz będzie wykorzystywał style Bootstrapa (getbootstrap.com). Wyżej zdefiniowaliśmy dokument HTML z tytułem "Formularz kontaktowy".

2. Dodajemy kod PHP

Na początku BODY wkleimy kod PHP, który obsłuży walidację otrzymanych danych i wysłanie formularza na wskazany przez nas adres e-mail.

<?php
$errorMessage = null;
$successMessage = null;

if ($_POST) {
    $name = isset($_POST['name']) ? filter_var($_POST['name'], FILTER_SANITIZE_STRING) : null;
    $email = isset($_POST['email']) ? filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) : null;
    $message = htmlspecialchars($_POST['message']);

    if (empty($name) || empty($email) || empty($message)) {
        $errorMessage = 'Wypełnij wszystkie pola!';
    }

    if (is_null($errorMessage)) {
        mail(
            'twoj-adres@email.pl',
            'Formularz kontaktowy',
            "Treść wiadomości: $message \n\n Imię: $name \n\n Adres e-mail: $email",
            "From: $name <$email>"
        );

        $successMessage = 'Wiadomość została wysłana';
    }
}
?>

Definiujemy dwie zmienne $errorMessage i $successMessage, do których będziemy przypisywać komunikaty o błędach i sukcesie. Następnie warunek if ($_POST) sprawia, że kod w jego ramach wykona się tylko podczas akcji POST (czyli po wysłaniu formularza przez klienta).

Formularz kontaktowy będzie zawierał trzy pola do wypełnienia: Imię, Adres e-mail i Treść wiadomości. Dlatego definiujemy trzy zmienne $name, $email i $message. Każda z nich odbiera dane z formularza i je waliduje.

Jeśli któreś z pól formularza jest puste (warunki z empty()), to zwrócimy komunikat z błędem "Wypełnij wszystkie pola!".

Jeśli wszystkie pola są wypełnione, to korzystamy z funkcji PHPowej mail().

Pierwszy argument to adres e-mail, na który formularz kontaktowy zostanie wysłany. Drugi to tytuł wiadomości jaki otrzymamy. Trzeci argument to treść wiadomości, czyli wklejamy do niej pola z formularza klienta. Ostatni argument to nagłówek From, czyli podstawiamy Imię klienta i jego adres e-mail (po otrzymaniu wiadomości będziemy mogli wówczas bezpośrednio klientowi odpisać).

Na koniec zwracamy komunikat w zmiennej $successMessage o tym, że wiadomość została wysłana.

3. Kod HTML

Pozostał już tylko kod HTML, który odpowiada za wyświetlenie formularza. Pod kodem jego wyjaśnienie.

<div class="container">
    <div class="row">
        <div class="col col-md-6 offset-md-3">

            <h3 class="my-5">Formularz kontaktowy</h3>

            <?php if ($errorMessage) : ?>
                <div class="alert alert-danger"><?php echo $errorMessage; ?></div>
            <?php endif; ?>

            <?php if ($successMessage) : ?>
                <div class="alert alert-success"><?php echo $successMessage; ?></div>
            <?php endif; ?>

            <form method="POST">
                <div class="mb-3">
                    <label for="name" class="form-label">Imię</label>
                    <input type="text" class="form-control" id="name" name="name">
                </div>

                <div class="mb-3">
                    <label for="email" class="form-label">Adres e-mail</label>
                    <input type="email" class="form-control" id="email" name="email">
                </div>

                <div class="mb-3">
                    <label for="message" class="form-label">Treść wiadomości</label>
                    <textarea class="form-control" id="message" name="message" rows="3"></textarea>
                </div>

                <div class="mb-3">
                    <input class="btn btn-primary" type="submit" value="Wyślij formularz">
                </div>
            </form>

        </div>
    </div>
</div>

Na początku korzystamy z Bootstrapowych klas, dzięki którym formularz kontaktowy będzie wyświetlony na środku strony, będzie zawierał odstępy etc.

Dzięki sprawdzamy czy zmienna z PHP $errorMessage nie jest pusta. Jeśli zawiera wiadomość to wyświetlamy alert z klasą alert-danger, dzięki czemu komunikat będzie w kolorze czerwonym.

Analogicznie z $successMessage. Jeśli będzie zdefiniowany komunikat o powodzeniu, to wyświetlamy komunikat w kolorze zielonym.

Następnie dodajemy ramę formularza i jego kolejne pola: name, email i message. Na końcu znajduje się przycisk do wysłania formularza.

Zobacz także

79 komentarzy

LAIK
07.06.2023, 22:12
FORMULARZ PROSTY I SPRAWNY!!! :) pozdrawiam
Grzegorz
24.02.2023, 12:01
A ja mam takie pytanie, bo mam całą stronę w html i chciałbym aby był odnośnik do pliku php gdzie zostaną przesłane dane, ale aby użytkownik został na tej stronie gdzie znajduje się formularz, tylko z dopiskiem, że wysłano?
Bartosz Stefanicki
24.02.2023, 14:04
Autor
Grzegorz, poczytaj o przesyłaniu danych za pomocą np. Ajax.
Arek
20.02.2023, 22:43
Pięknie strona wykonana . Ale to widać na pierwszy rzut oka iż niema szansy zadziałać. <form action="nazwa pliku z kodem php wysyłającym dane..php" method="post"> A nie formularz method="post">
Bartosz Stefanicki
24.02.2023, 14:09
Autor
Arek, co masz na myśli?
s
10.01.2023, 17:32
ciąg dalszy by się przydał bo własnie te czynnosci na serwer nie wiem jak się zabrac
Tadeusz
05.01.2023, 12:04
Witam, od dłuższego czasu próbuję uporać się z formularzem kontaktowym, ale niestety cały czas mi nie wychodzi. Po skopiowaniu powyższego kodu i zmiany adresu mail, na który ma przychodzić widomość pojawia mi się błąd: "Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()"
Bartosz Stefanicki
09.01.2023, 15:28
Autor
Tadeusz, uruchomiłeś na swoim komputerze (localhost) serwer pocztowy? Czy na pewno działa na protokole 25?
bogdan
07.11.2022, 21:05
Co oznacza # w adresie strony .pl/kontakt.php#
Bartosz Stefanicki
07.11.2022, 21:44
Autor
Bogdan, # to tak zwana kotwica, czyli odnośnik do np. paragrafu, bloku div z danym identyfikatorem.
Kurs
02.11.2022, 12:23
Bardzo dobry opis. Właśnie pracuję nad formularzem
Jurek
26.01.2022, 18:50
Dziala To Wam dalej ? Mam skopiowany caly kod i niestety mail nie przychdozi. PHP obslguiwany przez serwer. https://megawrzuta.pl/schowek/THGub
Bartosz Stefanicki
27.01.2022, 14:01
Autor
Jurek, pokazuje się jakiś błąd? Co się dzieje po wysłaniu formularza?
Paweł
21.12.2021, 14:42
Mi coś nie wychodzi.Proszę uprzejmie kogoś o wysłanie na maila (pm.epoczta@gmail.com) gotowego działającego kodu(nie mogę tego zrobić,spradzę wtedy sobie gdzie popełniłem błąd.Z góry Bardzo Dziękuję
Bartosz Stefanicki
21.12.2021, 14:46
Autor
Paweł, napisz jaki błąd się pokazuje? Jaki jest problem?
Slowok
04.05.2021, 17:54
Super. Działa. A jak np zrobić, aby odbiorców wiadomości było dwóch? Np robię formularz dla grupy i chce aby mail przychodził do mnie i do kolegi. W sensie coś jak DW z maila.
Bartosz Stefanicki
04.05.2021, 18:31
Autor
Slowok, odpowiedź na Twoje pytanie umieściłem w nowej poradzie, zajrzyj na stronę główną :-)
Tomasz
24.04.2021, 20:48
W jaki sposób mogę dodać do formularza możliwość dodawania załącznika?
Bartosz Stefanicki
25.04.2021, 16:00
Autor
Najpierw formularz powinien zapisać plik na serwerze, potem można załączyć go do wiadomości.
Dominik
30.12.2020, 16:24
A jak wysłać jeden formularz do Kilku PhP?
Bogusław
17.01.2021, 23:30
Już sprawdzam, zaraz do Ciebie wrócę.
Bartosz Stefanicki
30.03.2021, 16:28
Autor
Nie wiem jaki cel chcesz osiągnąć, ale można to zrobić na kilka sposobów. Między innymi wysłanie formularza za pomocą ajaksa do kilku plików. Można także wysłać dane do bazy, następnie je porozsyłać...
Patryk
03.08.2020, 17:11
mod_fcgid: stderr: PHP Notice: Undefined variable: formEmail Mam taki oto błąd, jak go naprawić?
Bartosz Stefanicki
04.08.2020, 15:24
Autor
Zamiast $formEmail podaj $email.
Bartosz Stefanicki
30.03.2021, 16:29
Autor
Zaktualizowałem dość mocno formularz :-)
Eliza
25.11.2012, 14:40
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ł
17.02.2016, 11:18
jak zrobić żeby po wyświetleniu komunikatu o poprawnym wysłaniu wiadomości automatycznie powrócił na stronę główną lub kontaktową?
Bartosz Stefanicki
17.02.2016, 11:51
Autor
Można to zrobic za pomocą PHP: [code lang="PHP"]header("Location: index.php")[/code]
Eliza
25.11.2012, 14:37
Zrobiłam formularz, chociaż nie jestem wybitną znawczynią php i mam taki oto kod: [code lang="php"]&lt;?php } else { //twoje dane $email = &#039;kontakt@e-biznet.com.pl&#039;; //dane z formularza $formName = $_POST[&#039;Zamówienie&#039;]; $formEmail = $_POST[&#039;formEmail&#039;]; $mailText = $_POST[&#039;mailText&#039;]; $business_name = $_POST[&#039;business_name&#039;]; $business_baseline = $_POST[&#039;business_baseline&#039;]; $business_description = $_POST[&#039;business_description&#039;]; $business_website = $_POST[&#039;business_website&#039;]; $business_sector = $_POST[&#039;business_sector&#039;]; $designs[] = $_POST[&#039;designs[]&#039;]; $colors = $_POST[&#039;colors&#039;]; $background_color = $_POST[&#039;background_color&#039;]; $uses[] = $_POST[&#039;uses[]&#039;]; $uploadedfile = $_POST[&#039;uploadedfile&#039;]; $other = $_POST[&#039;other&#039;]; if(!empty($formEmail) &amp;&amp; !empty($business_name) &amp;&amp; !empty($business_sector) &amp;&amp; !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(&quot;@&quot;,$checkmail)),&quot;MX&quot;)){ return true; }else{ return false; } } else { return false; } } //--- koniec funkcji --- if(checkMail($formEmail)) { //dodatkowe informacje: ip i host użytkownika $ip = $_SERVER[&#039;REMOTE_ADDR&#039;]; $host = gethostbyaddr($_SERVER[&#039;REMOTE_ADDR&#039;]); $protocol = strpos(strtolower($_SERVER[&#039;SERVER_PROTOCOL&#039;]),&#039;https&#039;) === FALSE ? &#039;http&#039; : &#039;https&#039;; $host = $_SERVER[&#039;HTTP_HOST&#039;]; $script = $_SERVER[&#039;SCRIPT_NAME&#039;]; $params = $_SERVER[&#039;QUERY_STRING&#039;]; $currentUrl = $protocol . &#039;://&#039; . $host . $script . &#039;?&#039; . $params; //treść wiadomości $mailText = &#039;Treść wiadomości:n $formText n Od: n $formName $formEmail n $business_name, $business_baseline, $business_description, $business_website, $business_sector, $designs[], $colors, $background_color, $uses[], $uploadedfile, $other, $formName, $formEmail, ($ip, $host) $currentUrl ($ip, $host)&#039;; //adres zwrotny $mailHeader = &#039;From: $formName '; $mailHeader .= "Content-type: text/plain; charset=utf-8rn"; $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óbować ponownie."; } //funkcja odpowiedzialna za wysłanie e-maila @mail($email, '[Zamówienie]', $mailText, $mailHeader) or die('Błąd: Zamówienie nie zostało wysłane'); //komunikat o poprawnym wysłaniu wiadomości echo 'Dziękujemy! Zamówienie zostało wysłane :) '; } else { echo 'Adres e-mail jest niepoprawny'; } } else { //komunikat w przypadku niepowodzenia echo 'Podaj adres e-mail'; } } ?&gt;[/code] Niestety, ani załączony plik nie pojawia się w określonym folderze na serwerze, ani też nie otrzymuję poprawnej wiadomości: Treść wiadomoÅ›ci:n $formText n Od: n $formName $formEmail n $business_name, $business_baseline, $business_description, $business_website, $business_sector, $designs[], $colors, $background_color, $uses[], $uploadedfile, $other, $formName, $formEmail, ($ip, $host) $currentUrl ($ip, $host) Czy ktoś ma pomysł, jak to poprawić?
leon
12.10.2012, 00:14
jak dodac pytanie antyspamowe? np 2+3? pięć
leon
11.10.2012, 23:36
juz naprawilem tak nalezy poprawic linijke php, ach to samouctwo :D $mailText = "Treść wiadomości: $formText Od: $formName, $formEmail ($ip, $host)";
leon
11.10.2012, 23:29
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
11.10.2012, 23:09
dodatkowym problemem jest to ze formularz mowi ze wyslano, ale mail do teraz nie doszedl na docelowa skrzynke
leon
11.10.2012, 22:34
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?