Univerzální PHP skript pro odesílání formulářů

16. listopadu 2000

Skoro každý tvůrce stránek se dostane do situace, kdy potřebuje odeslat vyplněný formulář z nějaké stránky na určitou e-mailovou adresu. Dnes si ukážeme PHP skript, který umí vygenerovat email, v jehož těle bude celý obsah odesílaného formuláře a dokonce něco navíc.

Vše lze udělat velice jednoduše použitím action="mailto:moje@adresa.cz" v tagu <FORM>. Řešení je to sice jednoduché, ale už méně elegantní a funkční. Pro odeslání formuláře s action "mailto:" musí mít návštěvníci vašich stránek nainstalovaný program Outlook Expres od firmy Microsoft, což rozhodně nemá každý. Záleží-li vám tedy jejich pohodlí, vytvořte si PHP skript, který zpracuje data z formuláře, vygeneruje e-mailovou zprávu a pošle ji na vámi určenou adresu.

Na začátku si popíšeme funkce, které jsou použity ve skriptu. K vygenerování a odeslání e-mailové zprávy slouží funkce mail(). Zadává se ve tvaru:

If (odpoved = 4)
bool mail(string KOMU, string PŘEDMĚT, string ZPRÁVA, string [HLAVIČKY]);     //parametr HLAVIČKY není povinný
Příklad: mail("nejaka@adresa.cz","Pokus","Toto je cvičná zpráva…","from: ctenar@interval.cz");

Pokud chcete odeslat zprávu více lidem, stačí e-mailové adresy v parametru KOMU oddělovat mezerou.

Dále si musíme zjistit, které údaje nám to vlastně z formuláře přišly. Pokud známe názvy formulářových polí napřed, máme vyhráno. Když totiž PHP skript dostane data z formuláře, automaticky vytvoří proměnné, jejichž název odpovídá názvům prvků ve formuláři. Pak už jen stačí vypsat tyto proměnné do těla e-mailu.

Trochu složitější situace nastane, chceme-li vytvořit univerzální skript. Nevíme tedy jaké prvky měl odesílaný formulář. K vypsání všech proměnných a jejich hodnot slouží tato část kódu:

If (odpoved = 4)
while (list($promenna, $hodnota) = each($HTTP_POST_VARS)) {
       echo ("$promena: $hodnota\n"); }

Jde o smyčku, která postupně prochází všechny přijaté data $HTTP_POST_VARS a vypisuje je. Po mírné úpravě lze docílit toho, že smyčka bude přidávat přijatá data do proměnné $telo:

If (odpoved = 4)
while (list($promenna, $hodnota) = each($HTTP_POST_VARS)) {
       $telo .= "$promenna: $hodnota\n"; }

Teď máme v proměnné $telo vypsány všechny informace z odeslaného formuláře. Někteří návštěvníci stránek však odešlou formulář několikrát, čímž by se (pokud se jedná např. o anketu) výsledky zkreslovaly.

Existují však globální proměnné $HTTP_USER_AGENT (je v ní uložena informace o browseru, ze kterého přišel požadavek) a $REMOTE_ADDR (obsahuje IP adresu identifikující počítač, ze kterého přišel požadavek), které jednoznačně odhalí "pachatele". Dostaneme-li např. 10 odpovědí ze stejné IP adresy, můžeme s klidným svědomím 9 zbylých smazat.
Do skriptu pak stačí přidat tyto dva řádky:

If (odpoved = 4)
$telo .= "Uzivateluv browser: $HTTP_USER_AGENT\n";
$telo .= "IP adresa, z ktere prisel pozadavek: $REMOTE_ADDR\n";

Návštěvník vašich stránek však stále nic nevidí, protože jsme nevypsali žádnou zprávu o tom, co se děje. Ve skutečnosti mohou nastat 3 situace, které musíme ošetřit:

První možností je, že se mail odešle v pořádku. Občas se stane, že se někde něco pokazí a tím pádem se mail neodešle. Třetí situace (a někdy se na ni zapomíná) je ta, že je formulář volán, ale nejsou žádné data, které by mohl skript přijmout. Tato situace nastane např. když někdo objeví URL na stránku skriptu a chce se na něj podívat. Protože není skript volán z formuláře, nemohou se poslat ani žádná data.

Při kontrole, která ze situací nastala využijeme faktu, že funkce mail() vrací hodnotu true, pokud se podařilo poslat mail bez problémů. Následující kód informuje návštěvníka vašich stránek která z prvních dvou situací nastala:

If (odpoved = 4)
if(mail($komu, $predmet, $telo, $od)) {
  echo("<BR><BR><H3><P align=’center‘>Děkujeme. Váš příspěvek zpracujeme do 24 hodin.</P></H3><BR><BR>");
  echo("<H2 align=’center‘><A href=’javascript:history.go(-1)‘>Z P Ě T</A></H2>");
} else {
  echo("<BR><BR><H3><P align=’center‘>Některá ze služeb selhala. Zkuste to prosím později.<BR>");
  echo("V případě potíží kontaktuje <A href=’mailto:moje@adresa.cz‘>moje@adresa.cz</A></P></H3><BR><BR>");
  echo("<H2 align=’center‘><A href=’javascript:history.go(-1)‘>Z P Ě T</A></H2>");
}

Třetí situaci ošetříme jednoduchou podmínkou:

If (odpoved = 4)
if(count($HTTP_POST_VARS)>0)(    // je-li počet proměnných přijmutých skriptem větší jak 0, provede se skript
  ….zde se provede skript…
} else {
  echo("<BR><BR><H3><P align=’center‘>Toto je skript, kterým se odesílají zprávy z formulářů.</P></H3>");
  echo("<H3 align=’center‘>Nechat být muset :-)</H3><BR><BR><H2 align=’center‘>");
  echo("<A href=’javascript:history.go(-1)‘>Z P Ě T</A></H2>");
}

Teď když jsem vysvětlil jak vše funguje a co která část kódu dělá, uvádím skript v celé své kráse:

If (odpoved = 4)
<HTML>
<HEAD>
  <META HTTP-EQUIV=’Content-Type‘ content=’text/html; charset=windows-1250′>
  <TITLE>Odeslání formuláře</TITLE>
</HEAD>
<BODY>
<?php
if(count($HTTP_POST_VARS)>0) {
  $komu = "nejaka@adresa.cz";
  $predmet = "Formular odeslany skriptem z mojich stranek"
  $od = "from: ctenar@intervalu.cz";
  $telo = "";
  while (list($promenna, $hodnota) = each($HTTP_POST_VARS)) {
    $telo .= "$promenna: $hodnota\n";
  }
  $telo .= "\nUzivateluv browser: $HTTP_USER_AGENT\n";
  $telo .= "IP adresa, z ktere prisel pozadavek: $REMOTE_ADDR\n";
  if(mail($komu, $predmet, $telo, $od)) {
    echo("<BR><BR><H3><P align=’center‘>Děkujeme. Váš příspěvek zpracujeme do 24 hodin.</P></H3><BR><BR>");
    echo("<H2 align=’center‘><A href=’javascript:history.go(-1)‘>Z P Ě T</A></H2>");
  } else {
    echo("<BR><BR><H3><P align=’center‘>Některá ze služeb selhala. Zkuste to prosím později.<BR>");
    echo("V případě potíží kontaktuje <A href=’mailto:moje@adresa.cz‘>moje@adresa.cz</A></P></H3><BR><BR>");
    echo("<H2 align=’center‘><A href=’javascript:history.go(-1)‘>Z P Ě T</A></H2>");
  }
} else {
  echo("<BR><BR><H3><P align=’center‘>Toto je skript, kterým se odesílají zprávy z formulářů.</P></H3>");
  echo("<H3 align=’center‘>Nechat být muset :-)</H3><BR><BR><H2 align=’center‘>");
  echo("<A href=’javascript:history.go(-1)‘>Z P Ě T</A></H2>");
}
?>
</BODY>
</HTML>

Samozřejmě lze tento skript stále vylepšovat. Já mám například na svých stránkách v každém formuláři skryté pole s názvem "redirect", kam zadávám URL, na které se skript po odeslání emailu přesměruje.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

2 komentářů

  1. Petr

    Led 24, 2010 v 16:47

    :) a co to kódování? …k českým znakům v mailu jsem jsem vážně ještě nedošel :(

    Odpovědět
  2. Lukáš Liska

    Bře 26, 2013 v 17:59

    Zdravím vás,
    mám problém, vyzkoušel jsem váš zdrojový kód a když to zkusím a vyplním si ty požadované políčka tak a stisknu tlačítko tak se akorát zobrazí ten zdrojový php kód a nic se nestana…
    Můžete mi někdo poradit co bych s tím mohl udělat nebo co dělám špatně??
    Děkuji za odpověď…

    Odpovědět

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *