Formularz kontaktowy na stronie www

(uaktualnienie z 30.01.2010) Formularz, który tu opisuje potrafi sprawić sporo problemów. Od czasu napisania tego posta znalazłem kilka uciążliwych cech AJAXowego formularza i praktycznie przestałem go używać.
Jeśli nie znasz PHP i AJAXa, oszczędź sobie czasu i przejdź od razu do nowego artykułu w którym opisuje o wiele prostszy formularz kontaktowy.

Przydaje się na prawie każdej stronie, a każdy pisze go inaczej.
Czy nie ma idealnego rozwiązania?
Jaki powinien być formularz kontaktowy?

Pytanie pozostawiam otwarte. Chętnie przeczytam każdą wypowiedź :)

AJAXowy formularz, którego użyłem ostatnio na kilku stronach ma kilka wad ale spełnia swoją rolę. Może się komuś przyda?
Do obejrzenia i ściągnięcia tutaj: http://www.krywko.pl/formkont/

Ten artykuł znajduje się w kategoriach:

Komentarze

Cześć Adam,

Powiedz mi czy jest możliwe takie skonfigurowanie powyższego formularza aby Google Analytics zliczał konwersję ustawioną na np. "Wysłanie maila/zapytania" ?

Od razu powiem że nie zgłębiałem podanych przez Ciebie skryptów i na Ajaxie nie znam się kompletnie ;).

Podam jeszcze tylko linka - Google Analytics wprowadził nowe tagi umożliwiające mierzenie konwersji między innymi z Ajaxa... - muszę zgłębić to zagadnienie ;)
http://www.ittechnology.us/nowy-kod-google-analytics/

Cześć :)

Nie przeszedłem jeszcze na nową wersję ale z tego co widzę to bez problemu można to zrobić przy pomocy funkcji _trackVisit.

Dzięki za link, nie znałem tego bloga.

Witam! Ja używam prostego ale wystarczającego formularza w php którego kodem się podzielę oczywiście poniżej ;)

<?php
// sprawdzamy, czy zmienna $submit jest pusta
if (empty($_POST['submit'])) {
// wyswietlamy formularz
echo "Napisz maila do autora tej strony:<br>
<table border=\"0\"><form method=\"post\">
<tr>
<td>Treść wiadomości</td>
<td><textarea name=\"tresc\" style=\"width: 250px; height: 100px\"></textarea></td>
</tr>
<tr>
<td>Imię, nazwisko lub nick</td>
<td><input type=\"text\" name=\"imie\" style=\"width: 250px\"></td>
</tr>
<tr>
<td>Adres e-mail</td>
<td><input type=\"text\" name=\"email\" style=\"width: 250px\"></td>
</tr>
<tr>
<td> </td>
<td><input type=\"submit\" name=\"submit\" value=\"Wy¶lij\"> 
<input type=\"reset\" value=\"Wyczyść\"></td></form>
</tr>
</table>";
}
// sprawdzamy, czy zmienne przesłane z formularza nie są puste
elseif (!empty($_POST['tresc']) && !empty($_POST['imie']) && !empty($_POST['email'])) {
// jeżeli powyższy warunek jest spełniony tworzona jest wiadomosć
// zmienna $message zawiera tresć wiadomosci
$message = "Tresć wiadomosci:\n$_POST[tresc]\n\nWysłał: $_POST[imie]\ne-mail: $_POST[email]";
// zmienna $header zawiera przede wszystkim adres zwrotny
$header = "From: $_POST[imie] <$_POST[email]>";
// funkcja mail() za pomoca której wiadomosć zostanie wysłana
@mail("mail_admina@strona.pl","Wiadomosc ze strony www.STRONA.pl","$message","$header")
or die('Nie udało się wysłać wiadomosci');
// wy¶wietlenie komunikatu w przypadku powodzenia
echo "<div align=\"center\"><strong>Dziękujemy wiadomosć została wysłana poprawnie!</strong><br><br></div>";
}
// lub w przypadku nie wypełnienia formularza do końca
else echo "<span style=\"color: #FF0000; text-align: center;\">Wypełnij wszystkie pola formularza!<br><br><a href=\"index.php?id=kontakt\">Powrót</a></span>";
?>

Dzięki za ten kawałek kodu.
Wbrew pozorom formularz kontaktowy to dość głęboki temat ;) Oczywiście proste rozwiązania działają ale jak długo byśmy nie dłubali to zawsze znajdzie się coś, co można zrobić lepiej. W tym przykładzie najbardziej brakuje mi sprawdzania poprawności adresu e-mail. Ludzie często robią literówki i nie ma im potem jak odpisać. Nawet proste sprawdzanie pozwala wyłapać sporo błędów.

Witam
Wrzuciłem Twój skrypt na serwer nazwa.pl, jednak nie działa poprawnie.
W pliku config.php zmieniam adres na adres serwera oraz docelowy adres email i wysylanie e-maili działa, jednak nie działa sprawdzanie danych w formularzu. Mogę np wyslac e-maila z pustymi wpisami w formularzu, co może być przyczyna?
Pozdrawiam

JS ładuje się poprawnie? Podrzuć adres..

Skrypt php mi nie dziala, wyswietla sie formularz ale zamiast przycisku sa wszedzie inputy tekstowe

ma ktos formularz ktory da sie uzyc na smtp?

Ja używam zawsze takiego i ewentualnych pochodnych w zależności od potrzeb:

<?php
if (count($_POST))
{

$email = 'xxxxxxx@xxxxx';
$subject = 'xxxxxxxxxxxxxx';
$message = 'Tutaj komunikat dostosowany do potrzeb';
$error = 'Wyst±pił bł±d podczas wysyłania formularza';
$charset = 'iso-8859-2';

$head =
"MIME-Version: 1.0\r\n" .
"Content-Type: text/plain; charset=$charset\r\n" .
"Content-Transfer-Encoding: 8bit";
$body = '';
foreach ($_POST as $name => $value)
{
if (is_array($value))
{
for ($i = 0; $i < count($value); $i++)
{
$body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value[$i]) : $value[$i]) . "\r\n";
}
}
else $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value) : $value) . "\r\n";
}
echo mail($email, "=?$charset?B?" . base64_encode($subject) . "?=", $body, $head) ? $message : $error;
}
else
{
?>

Imię i nazwiko lub nick:

Tytuł:

Tre¶ć:

e-mail (tylko do kontaktu – nieobowi±zkowe):

<?php
}
?>

Witam, podoba mi się ten formularz i chciałbym z niego skorzystać ale mam jeden problem. Wychodzi na to że mój serwer nie obsługuje funkcji mail(). Znalazłem skrypt, dzięki któremu można to obejść ale chciałem połączyć to z Twoim zmodyfikowanym skryptem, ale nie mam pojęcia jak. A tu daje skrypt bez funkcji mail():
<?php
$smtp_host="smtp.adres.pl"; // Adres smtp np. smtp.wp.pl
$email="nazwa@adres.pl"; // Adres od którego przychodzą maile

/* Funkcja do wysyłania maili bez użycia funkcji mail(), znaleziona w forum phpBB... */
function smtpmail($mail_to, $subject, $message) {
global $smtp_host, $email; // Pobieramy zmienne do funkcji

// Sprawdzamy czy wypełniono poprawnie formularz
if($mail_to=="") $error="Nie podałeś adresu odbiorcy!";
if(trim($subject)=="") $error="Nie podałeś tematu wiadomości!";
if(trim($message)=="") $error="Wiadomość jest pusta!";
if(!$socket=pfsockopen($smtp_host, 25, $errno, $errstr, 20)) $error="Nie mogę się połączyć z serwerem SMTP!";
// Jeśli nie, wywalamy błąd i kończymy działanie funkcji
if(!empty($error)){
echo "Błąd: $error\n";
return FALSE;
}
// Wysyłamy adres smtp i email nadawcy
server_parse($socket, "220");
fputs($socket, "HELO " . $smtp_host . "\r\n");
server_parse($socket, "250");
fputs($socket, "MAIL FROM: <" . $email . ">\r\n");
server_parse($socket, "250");

// Uzykujemy tablicę z emailami odbiorców
$mail_to_array = explode(",", $mail_to);

// Wysyłamy adresy odbiorców naszej wiadomości :]
$to_header = "To: ";
@reset($mail_to_array);
while(list( ,$mail_to_address) = each($mail_to_array)) {
$mail_to_address = trim($mail_to_address);
if (preg_match('/[^ ]+\@[^ ]+/', $mail_to_address)) {
fputs( $socket, "RCPT TO: <$mail_to_address>\r\n" );
server_parse( $socket, "250" );
}
$to_header.=(($mail_to_address!='') ? ', ' : '')."<$mail_to_address>";
}

// Zamieniamy znaki nowej lini na \r\n w treści wiadomości
$message = preg_replace("/(?

Skrypt testowałem na serwerze i działa, maile dochodzą. Pozdrawiam.

A tu reszta bo widzę że coś ucięło:
// Zamieniamy znaki nowej lini na \r\n w treści wiadomości
$message = preg_replace("/(?

grrr, znowu, ech...

Witam,
czy mógłby mi ktoś przerobić ten skrypt tak aby była sprawdzana poprawność adresu e-mail?

Chodzi mi o ten kod co podał "Jacek".

<?php
// sprawdzamy, czy zmienna $submit jest pusta
if (empty($_POST['submit'])) {
// wyswietlamy formularz
echo "Napisz maila do autora tej strony:

Treść wiadomości

Imię, nazwisko lub nick

Adres e-mail

";
}
// sprawdzamy, czy zmienne przesłane z formularza nie są puste
elseif (!empty($_POST['tresc']) && !empty($_POST['imie']) && !empty($_POST['email'])) {
// jeżeli powyższy warunek jest spełniony tworzona jest wiadomosć
// zmienna $message zawiera tresć wiadomosci
$message = "Tresć wiadomosci:\n$_POST[tresc]\n\nWysłał: $_POST[imie]\ne-mail: $_POST[email]";
// zmienna $header zawiera przede wszystkim adres zwrotny
$header = "From: $_POST[imie] <$_POST[email]>";
// funkcja mail() za pomoca której wiadomosć zostanie wysłana
@mail("mail_admina@strona.pl","Wiadomosc ze strony www.STRONA.pl","$message","$header")
or die('Nie udało się wysłać wiadomosci');
// wy¶wietlenie komunikatu w przypadku powodzenia
echo "Dziękujemy wiadomosć została wysłana poprawnie!";
}
// lub w przypadku nie wypełnienia formularza do końca
else echo "Wypełnij wszystkie pola formularza!Powrót";
?>

Czesc. Mam problem bo potrzebuje do mojej strony intermetowej formularz, ale nie orientuję sie bardzo w php, a koniecznie musze miec formularz, ale nie dla klientów pocztowych tylko dla każdego...

Czy mogłbym prosić o jakiś skrypt i objaśnienie jak i z czym go użyć, bo nie robiłem wcześniej takich rzeczy, ale dużo bawiłem sie w html'u. Ale kiedyś trzeba sie rozwinąć ;))
Moj mail to: sebo91@poczta.fm lub gg: 5450969

Proszę o pomoc.

Witam. Cos ten skrypt niebardzo dziala. Probowalem na dwoch serwerach i niesty pisze, ze wyslalo, a nic nie dochodzi.

Witam,
pojawił mi się problem z IE, w firefoxie i operze wszystko działa elegancko (komunikaty o pustych polach, status wysyłąnia itp) natomiast w IE pomimo ze maile dochodzą to pozwala np wysłać całkowicie pusty mail
strona z formularzem http://zzppm.pl/index.php?PAGE=17
poza zmianą w config.php skasowałem w index.php style bo kolidowały z układem strony oraz przeredagowałem komunikaty.. wiecej zmian brak.
będę wdzięczny za wszelką pomoc
Pozdrawiam
P.S. po napisaniu tego sprawdziłem na tej stronie.. na IE tez nie wyskakują komunikaty i mozna wysłać pusty mail, więc rodzi się pytanie czy to coś skopane w moim IE czy jakiś ogólny błąd?? nie używam IE więc nie wiem nawet czy wszystko w nim działa, ale że stronę odwiedzają też ludzie z IE więc miło by było żeby nie zasyłali mnie pustymi mailami co sie zdarzało przy wcześniejszym formularzu


Witam. Cos ten skrypt
Anonim (niezweryfikowany), wt., 04/11/2008 - 20:02


Witam. Cos ten skrypt niebardzo dziala. Probowalem na dwoch serwerach i niesty pisze, ze wyslalo, a nic nie dochodzi.

Sprawdź czy nie namieszałeś z położeniem katalogów, miałem ten sam problem, niby poprawnie zmieniałem w plikach adres folderu z konfiguracją ale okazało się że w jednym miejscu zgubiłem "/" i miałem takie same objawy, teraz folder jest w katalogu głównym i moze powoduje troche wiecej bałaganu ale działa bezproblemowo.

Sprostowanko.. dorwałem sie do innego kompa i na IE też działa.. to na moim jest cos skopane, moze coś z uprawnieniami dla js'u...
w każdym razie skrypcik elegancki, umiałby ktoś dodać do niego weryfikacje poprzez kod z obrazka albo inne tego typu? to by się bardzo przydało, mój serwer teoretycznie obsługuje GD (teoretycznie bo robiłem proste próby i mi nic nie wychodziło, ale forum phpbb wykrywa GD i używa więc pewnie wszystko wynika z mojej nieznajomości tematu)
Pozdrawiam

witam korzystając z Twojego formularza chciałem dostosować go do swoich potrzeb lecz mam pewien problem mianowicie potrzebuje wykonać formularz gdzie osoba musi podać numer telefonu, oraz wyrazić zgodę na przetwarzanie danych. Chciałem spytać czy jest to możliwe bo teraz mogę już wysłać formularz po podaniu tylko adresu mail.

Formularz wygląda tak:

Trwa wysyłanie wiadomości. Zaczekaj chwilkę…
Wysyłanie...

Twój E-mail został wysłany.

Imię i Nazwisko:

Email:

Nr telefonu kontaktowego:

Wyrażam zgodę na przetwarzanie moich danych osobowych przez xxxxxxxxx.

Wyrażam zgodę na otrzymywanie informacji handlowych drogą elektroniczną od xxxxxxxx.

A to zmodyfikowany przeze mnie lekko contact.js:

function sprawdz(adres) {
if (adres != "") {
var re = new RegExp("[^@]{1,}[@]{1}[^@.]{1,}[.]{1}[^@]{1,}","gi");
var wynik = re.test(adres);
if (wynik == true) { return true; }
if (wynik == false) { return false; }
}
else { return false; }
}

function validateFields() {
var frmEl = document.getElementById('cForm');
var posName = document.getElementById('posName');
var posEmail = document.getElementById('posEmail');
var posRegard = document.getElementById('posRegard');
var posText = document.getElementById('posText');
var posText1 = document.getElementById('posText1');
// var strCC = document.getElementById('selfCC');
var whiteSpace = /^[\s]+$/;
if ( posText.value == '' || whiteSpace.test(posText.value) ) {
alert("Próbujesz wysłać pusty Email. Napisz coś i spróbuj jeszcze raz.");
}
else if ( sprawdz(posEmail.value) == false ) {
alert("Podaj poprawny adres Email aby otrzymać odpowiedź.");
posEmail.focus();
}
else {
sendPosEmail();
}
}

function sendPosEmail () {
var success = document.getElementById('emailSuccess');
var posName = document.getElementById('posName');
var posEmail = document.getElementById('posEmail');
var posRegard = document.getElementById('posRegard');
var posRegard = document.getElementById('posRegard1');
var posText = document.getElementById('posText');
var posText = document.getElementById('posText1');
// var strCC = document.getElementById('selfCC').value;
var page = "form-kontakt/xmlHttpRequest.php?contact=true&xml=true";

showContactTimer(); // quickly begin the load bar
success.style.display = 'none'; // hide the success bar (incase this is a multi-email

// convert (&, +, =) to string equivs. Needed so URL encoded POST won't choke.
var str1 = posName.value;
str1 = str1.replace(/&/g,"**am**");
str1 = str1.replace(/=/g,"**eq**");
str1 = str1.replace(/\+/g,"**pl**");
var str2 = posEmail.value;
str2 = str2.replace(/&/g,"**am**");
str2 = str2.replace(/=/g,"**eq**");
str2 = str2.replace(/\+/g,"**pl**");
var str3 = posRegard.value;
str3 = str3.replace(/&/g,"**am**");
str3 = str3.replace(/=/g,"**eq**");
str3 = str3.replace(/\+/g,"**pl**");
var str4 = posRegard1.value;
str4 = str4.replace(/&/g,"**am**");
str4 = str4.replace(/=/g,"**eq**");
str4 = str4.replace(/\+/g,"**pl**");
var str5 = posText.value;
str5 = str5.replace(/&/g,"**am**");
str5 = str5.replace(/=/g,"**eq**");
str5 = str5.replace(/\+/g,"**pl**");
var str6 = posText1.value;
str6 = str6.replace(/&/g,"**am**");
str6 = str6.replace(/=/g,"**eq**");
str6 = str6.replace(/\+/g,"**pl**");

// var stuff = "selfCC="+strCC+"&posName="+str1+"&posEmail="+str2+"&posRegard="+str3+"&posText="+str4;
var stuff = "posName="+str1+"&posEmail="+str2+"&posRegard="+str3+"&posRegard1="+str4+"&posText="+str5+"&posText1="+str6;
loadXMLPosDoc(page,stuff)
}
function showContactTimer () {
var loader = document.getElementById('loadBar');
loader.style.display = 'block';
sentTimer = setTimeout("hideContactTimer()",6000);
}

function hideContactTimer () {
var loader = document.getElementById('loadBar');
var success = document.getElementById('emailSuccess');
var fieldArea = document.getElementById('contactFormArea');
var inputs = fieldArea.getElementsByTagName('input');
var inputsLen = inputs.length;
var tAreas = fieldArea.getElementsByTagName('textarea');
var tAreasLen = tAreas.length;
// Hide the load bar alas! Done Loading
loader.style.display = "none";
success.style.display = "block";
success.innerHTML = ''+grabPosXML("confirmation")+'';
// Now Hijack the form elements
for ( i=0;i

Tylko czy ja to dobrze robię...

Mam taki problem, po wpisaniu danych i kliknieciu wyslij, wyswietla sie ze wiadomosc wyslana, jednak na emaila nic nie dochodzi, co moze byc tego przyczyna?

Witam! Mam problem, mam skrypt wysyłania wiadomości z captcha i chcę mieć funkcje wysyłania kopii na adres adresata. Udało stworzyć się skrypt tylko ze wiadomość dochodzi na jeden adres email na email adresata lub email mój. adres formularza: www.token.lafra.pl/formularz23.php Ponizej podaje kody:

formularz23.php

A:link{color: #4444ec; text-decoration: none;}
A:visited{color: #3232af; text-decoration: none;}
A:hover{color: #ff0000; text-decoration: underline;}

 SKRYPT - token.php

Przetestuj dzialanie Formularza kontaktowego

Treść wiadomości:

Imię, nazwisko lub nick:

Adres e-mail:

Wyślij kopię na swój adres

 


Kod z obrazka:

Odswiez obrazek

Wyślij

sprawdz1.php
ďťż<?
//start sesji
session_start();

//pobranie tokena
$token_post = strtolower($_POST['token_text']);
$session_token = $_SESSION['token'];

if( ($token_post == $session_token) && ($session_token != '') )
{
$prawidlowy_token = true;
}else {
$prawidlowy_token = false;
}
?>

Token

A:link{color: #4444ec; text-decoration: none;}
A:visited{color: #3232af; text-decoration: none;}
A:hover{color: #ff0000; text-decoration: underline;}

<?
echo "TOKEN przekazany metod� post \$_POST['token_text']: $token_post ";
echo "TOKEN pobrany ze zmiennej sesyjnej \$_SESSION['token']: $session_token";
?>

<?php
if (count($_POST))
{
////////// USTAWIENIA //////////
$email = 'becom@o2.pl'; // Adres e-mail adresata
$send_to_me=$_POST['send_to_me'];
$email=$_POST['email'];
$subject = 'Demo wiadomości'; // Temat listu
$message = 'Wiadomosc zostala wyslana!

Dziekuje za zainteresowanie moja oferta.
Doloze wszelkich starañ, aby jak najszybciej odpowiedziec na Pañstwa zapytanie (na ogól w ciagu pierwszych 48 h). '; // Komunikat
$error = 'Wystšpił błšd podczas wysyłania formularza'; // Komunikat błędu
$charset = 'iso-8859-2'; // Strona kodowa
//////////////////////////////

$head =
"MIME-Version: 1.0\r\n" .
"Content-Type: text/plain; charset=$charset\r\n" .
"Content-Transfer-Encoding: 8bit";
$body = '';
foreach ($_POST as $name => $value)
{
if (is_array($value))
{
for ($i = 0; $i < count($value); $i++)
{
$body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value[$i]) : $value[$i]) . "\r\n";
}
}
else $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value) : $value) . "\r\n";
}
echo mail($email, "=?$charset?B?" . base64_encode($subject) . "?=", $body, $head) ? $message : $error;
}
else
{
?>

Tutaj umie�ć wszystkie pola formularza

<?php
}
?>

<?
if ($prawidlowy_token == true) {
echo "Wpisany TOKEN jest prawidlowy !!!";
}else {
echo "Wpisany TOKEN jest b��dny !!!";
}
?>

>> powrot do strony z formularzem

<?
unset($_POST['token_text']);
session_unset();
?>

<?php exit; ?>
Nie dziala skrypt - cos jest nie tak z obsluga PHP :(

Proszę o pomoc.
Email: becom@o2.pl
GaduGadu: 2002083

Pozdrawiam Mateusz

Zmienilem co trzeba i wywala mi taki blad
Wiadomość: Wymagany jest obiekt
Wiersz: 23
Znak: 1
Kod: 0
Identyfikator URI: http://newdomains.pl/form-kontakt/xmlHttp.js

Nie mozna wyslac wiadomosci

Co z tym zrobic? Najlepiej prosilbym o kontakt na maila

Ej no naprawdę zarąbisty formularz mnie się podoba... użyję go na stronie firmowej... tylko trochę go dostosuję do moich wymagań ;)

Gratki przydał mi się ten artykuł :)

Co i gdzie mam wpisać ,żeby ten skrypt działał ?

Zdecydowanie bardziej spodobał mi się skrypt Adas z małymi modyfikacjami ;)... dziękuję Adas za kod przydał mi się :-)

witam,
jak wrzucic dodatkowe pole formularza adama?

Temat zamknięty. Wyjaśnienie na górze. Zapraszam do artykułu "Dobry formularz kontaktowy".

Fajny kod, ale czy działa komuś w ogóle?

skrypt dziala w 100% wystarczy wrzucic go na serwer ktory obsluguje funkcje mail np. na darmowy serwer cba.pl :)

Wystarczy mieć nową przeglądarkę, nie odświeżyć strony za szybko, nie mieć przeszkadzających pluginów itp. Da się ale czasami idzie jak po gruzie.

Naprawdę polecam ten: http://www.adam.krywko.pl/dobry-formularz-kontaktowy

Dokładnie, mowa wlasnie o tym. Dobry skrypcik. Mam 3 przeglądarki aktualizowane na bierząco (Firefoxa, Chrome i IE8) i wrzuciłem skrypcik na płatny serwer i nic. Kombinowałem usuwałem cookies, dokładnie przeglądałem wszystkie pliki tego skryptu, sprawdzałem nazwy linijka po linijce i nic. Do głowy mi nie przyszło że na płatnym serwerze na którym umieściłem skrypt nie mam obsługi mail. Wreszcie wrzuciłem na cba.pl i wszystko poszło w ułamku sekundy na wszystkich przeglądarkach bezproblemowo :)

Formularz z linka dwa posty wyżej nie wymaga obsługi funkcji mail na serwerze. Konfiguruje się w nim zewnętrzny serwer SMTP - jak w programie pocztowym.

Dodaj nowy komentarz

Zawartość pola nie będzie udostępniana publicznie.
CAPTCHA
Muszę sprawdzić czy nie jesteś złym botem...
pięćdzies_ęciogroszówka: