Rozesílání e-mailů (aktualizovaná verze)

Napsal O webu (») 14. 10. 2004 v kategorii PHP/HTML, přečteno: 2251×

Systém pro rozesílání e-mailů využijeme všichni!!

*toto je druhá verze článku, původní byl pro nedostatky smazán*

Pokud máte na svém hostingu povolenou funkci mail (), můžete se pustit do formulářů pro odesílání e-mailů. Tato možnost je celkem praktická; pro odeslání e-mailu se nemusí opouštět webový prohlížeč, o tom, že spousta lidí neumí mailový klient ani použít, nemluvím. Nic vám nebrání takto jednoduše tvořit objednávkové e-maily např. pro obchodníky apod.

Chci:

- se naučit kreslit formuláře
- se naučit formátovat formuláře
- se naučit funkci PHP pro odesílání e-mailů
- se naučit ověřovat hodnoty proměnných
- se naučit pár triků s formuláři
- si zkopírovat celý kód

Rozesílání e-mailů - kreslíme formulář

další kapitola | menu

V prvé řadě je třeba se naučit formulář "nakreslit". Skládá se z:
- jednořádkového pole
- pole s více řádky
- zaškrtávátka
- přepínačů mezi možnostmi
- seznamy
- tlačítka

formuláře - obecné

<form action="akce" method="metoda">
...položky formuláře...
</form>

Atribut action určuje, co s vyplněným formulářem provedete. Nejlepší je poslat formulář jiné PHP stránce. Method určuje metodu zpracování formuláře. V našem případě to jsou metody post a get. Rozdíl mezi nimi je, že get posílá proměnné přes adresní řádku. Já ale volím post. Mezi tagy vložte položky formuláře.

jednořádkové pole

<input type="text" size="XX" value="predvyplnena_hodnota" />

Size určuje velikost pole v písmenech, takže záleží na velikosti fontu. Value je hodnota, která je předvyplněná, pro inspiraci - v poli pro vložení e-mailu bude předvyplněn zavináč, v poli pro vložení telefonu "+420" atd.

pole s více řádky

<textarea rows="YY" cols="XX">predvyplnena_hodnota</textarea>

Rows je počet řádků, cols je počet sloupců v písmenech. O předvyplněné hodnotě platí to samé, co pro jednořádkové pole.

zaškrtávátka

<input type="checkbox" checked value="hodnota" />

Slovíčko checked znamená, že je zaškrtávátko skutečně zaškrtlé. :) Pokud ho neuvedete, zaškrtlé nebude. Value je hodnota, která se předává v případě dalšího zpracování, pokud je zaškrtávátko zaškrtlé.

Zaškrtávátek je možno zaškrtnout kolik chcete.

přepínače mezi možnostmi

<input type="radio" checked value="hodnota" />

Platí totéž, co pro zaškrtávátka, jen checked se uvádí jen u jedné položky... Pokud chcete použít více "skupin" přepínačů, vložte je do <form> (takže bude tento tag vložený v jiném).

Pokud potřebujete vybrat jednu z více možností, tak právě pro vás jsou určeny přepínače. Příklad: "Jste: a) muž, b) žena, c) nevím."

seznamy

<select>
<option selected value="hodnota">jmeno_hodnoty</option>
</select>

Mezi tagy select vepište tolik option, kolik potřebujete. Do hodnoty value napište hodnotu, která se předá ke zpracování. Selected je položka, která je zobrazena jako první. Jmeno_hodnoty je jméno, které se zobrazí při listování seznamem. Zdůrazňuji, že jméno položky se zadává do tagu <select> (viz. níže - atribut name).

tlačítka

<input type="submit" value="hodnota" />
<input type="reset" value="hodnota" />

Typ submit je pro tlačítko, které formulář odešle dle parametru action v tagu form. Typ reset vrátí formulář do původních hodnot. Value určuje nápis, který je na tlačítku napsán. Existuje ještě tlačítko, které odkazuje na skripty, ale to my nepotřebujeme.

položky formuláře - obecné

Každá položka formuláře musí (pro správné fungování) obsahovat atribut name. Jeho hodnota je v podstatě jméno proměnné, přes kterou se informace předají. Proto bychom neměli pojmenovávat dvě položky stejně. Kromě toho se držme zásady, že nepoužíváme mezery (řešením jsou podtržítka nebo jednoslovné názvy) ani diakritiku. Můj osobní tip je název začít "form_", v dalším zpracování mi to přijde přehlednější. Potom je tu atribut tabindex. Jeho hodnotou jsou celá čísla. K čemu slouží? Pokud se uživatel mezi položkami přesouvá tabulátorem, tyto čísla určují, kolikátá má být položka v pořadí. Pokud chceme položku vyřadit z pořadí, zadáme "-1". To doporučuji u tlačítka pro smazání, mám s tím určité zkušenosti: "Enter! Sakra, já si to vymazal... Tak znova." :)

Rozesílání e-mailů - formátování formulářových polí

další kapitola | menu

Formulářové položky se samozřejmě dají formátovat přes CSS. Ještě před syntaxí zdůrazňuji fakt, že zaškrtávátko, přepínač a jednořádkové pole je jen jeden tag: input. To nám ztěžuje formátování těchto prvků jednotlivě. Proto je dobré si každý typ prvku označit třídou. (Prohlížeče zatím nepodporují formátování dle atributu, popř. jeho hodnoty, i když CSS tuto možnost nabízí.)

tag_formuláře.trida
{border: barva_okraje tloušťka_okraje typ_čáry;
background: barva_pozadí;
color: barva_písma;
font-family: nazev_pisma;
font-size: velikost_pisma;
padding: mezera_mezi_okrajem_a_textem;}

konkrétní příklad:

input.jednoradkove_pole
{border: #ff0000 2px solid;
background: #000000;
color: #ffffff;
font-family: courier new;
font-size: 12pt
padding: 1px;}

Rozesílání e-mailů - odesíláme

další kapitola | menu

přebíráme proměnné

S každou položkou formuláře (tzn. všechny položky, kterým jsme zadali name) provedeme toto:

$novy_nazev_polozky = $_POST["stary_nazev_polozky"]

Pokud jsme použili metodu get, $_post nahradíme $_get. Obojí značí kolekci, z které přebíráme hodnoty. To je dobré k zabránění podvrhnutí proměnných, což by nám sice v případě e-mailu zas tak nevadilo, ale zvykněme si na přebírání z datových kolekcí, potom nám to ulehčí život. Samosebou "novy_nazev_polozky" nahradíme nějakým názvem, který se k položce hodí. V našem případě to je stejný název jako předtím, jen bez "form_".

odesíláme

K odeslání nám slouží jediná funkce - mail. Pokud před ni uvedeme zavináč, zabráníme případné chybové PHP hlášce, která je nevzhledná. Parametry funkce mail jsou: příjemce, předmět, zpráva a nepovinně hlavičky. Tedy:

@mail ($to, $subject, $message, $headers)

Nemusíte vkládat jen přes proměnné, můžete napevno stanovit kteroukoliv z těchto položek - tedy napsat místo proměnných řetězce. Tyto řetězce uvádějte v uvozovkách.

- příjemce

$to = "jmeno1 <jmeno1@server.cz>, jmeno2 <jmeno2@server.cz>"

Pokud je více příjemců, oddělujeme čárkami. Povinný je jen e-mail, jméno uvedené před ním se uvádět nemusí.

- předmět

$subject = "zpráva z WWW - $novy_nazev_polozky"

Doplním, že můžete zadat jen název proměnné; nemusíte psát nějaký další text. O jménu před e-mailovou adresou platí totéž, co u příjemce.

- zpráva

$message = $novy_nazev_polozky

- hlavičky

Hlavičky nejsou povinné. Ale jsou užitečné. Zahrnují např. e-mail odesilatele, kopii e-mailu, slepou kopii, prioritu, kódování atp. Obecná syntaxe je:

$hlavicky = "hlavička1 "
$hlavicky .= "hlavička2 "

Všimněte si tečky před rovnítkem druhé hlavičky. Ta udělá ze dvou (a více) proměnných jednu. Píšeme ji vždy u druhé a víceré proměnné, ze které se má stát jedna. Každou hlavičku musíme odřádkovat, slouží k tomu . Odřádkovat musíme každou hlavičku, ne jen druhou a další!! V syntaxi budu používat proměnné, které jsme si označili jako $novy_nazev_polozky.

odesílatel
From: $jmeno_odesilatele <$email_odesilatele>

kopie
CC: jmeno1 <jmeno1@server.cz>, jmeno2 <jmeno2@server.cz>

slepá kopie
BCC: jmeno1 <jmeno1@server.cz>, jmeno2 <jmeno2@server.cz>

priorita
X-PRIORITY: $priorita

Hodnota $priorita je 1 - 4, přičemž čím NIŽŠÍ číslo, tím vyšší priorita. Myslím ale, že prioritu moc nevyužijete.Nejlepší je prioritu získávat pomocí seznamu, kde value jsou čísla 1 - 4.

chybová zpráva
RETURN-PATH: jmeno1 <jmeno1@server.cz>, jmeno2 <jmeno2@server.cz>

Chybová zpráva se odešle v případě nějaké chyby (jak jinak). Chyba nastává, pokud např. e-mailová adresa neexistuje. Nikdy jsem tuto možnost moc nevyužil, ale je dobré chybovou zprávu ošetřit. Jako adresa pro chybovou zprávu je vhodná adresa administrátora.

kódování a typ dokumentu
CONTENT-TYPE: text/plain; CHARSET=iso-8859-2

Na kódování a typ bychom neměli zapomínat. Tato hlavička určí čtení kódu v prohlížeči. Text/plain určuje typ obsahu, což je v našem případě text (čistý text). Předpokládám, že budete používat kódování ISO nebo WINDOWS, podle toho upravte CHARSET, samozřejmě vám nic nebrání v jiném kódování. Pokud kódování neuvedete a tómu, kdo zprávu přijme, se může stát to, že místo zprávy uvidí "rozsypaný čaj". (Tímto zdravím Honxe.)

zprávy včetně HTML
CONTENT-TYPE: text/html; CHARSET=iso-8859-2

Stejně jako u kódování a typu, typ je HTML, kódování je vámi určené. Zpráva přijde v HTML formátu, v tomto případě musí mít příjemce v pošt. klientu zapnutou možnost zprávy v HTML nebo tak něco. Pokud se takto nestane, zpráva přijde jako text (ve většině případů; snad). Nezapomeňte, že typ e-mailu (text/HTML) by měl být jen jeden. (Samozřejmě jdou udělat i vícetypové zprávy, ale tím vás nebudu zatěžovat.)

odeslání e-mailu

Funkci MAIL zkombinujeme s funkcí IF, protože potom máme pod kontrolou hlášky při (ne)odeslání zprávy. Viz. následující kód:

IF (@MAIL($to, $subject, $message, $headers))
{ECHO "<p>zpráva odeslána, mám se rád</p>";}
ELSE
{ECHO "<p>zpráva nebyla odeslána, je to špatný</p>&quot;;}

Pokud chceme celý e-mail zobrazit, použijeme ECHO v kombinaci s (X)HTML kódem.

Rozesílání e-mailů - ověřujeme hodnoty

další kapitola | menu

Určitě by nám nebylo příjemné, kdyby nám někdo posílal prázdné zprávy. Nejenže mazání zpráv z vašeho pošt. klienta zabírá čas, ale na webhostingu můžeme mít omezený počet odeslání zpráv za 1 hodinu... Proto ošetříme prázdné proměnné. Mohli bychom využít JavaScript, ale ne každý ho má v prohlížeči zapnutý, takže to není optimální. Použijeme opět PHP.

IF ($novy_nazev_promenne == "")
{DIE ("<chyba");}

Takto můžeme ošetřit všechny proměnné, já však doporučuji ošetřit jen zprávu. Pokud chceme ošetřit více jak jednu položku, dále nepoužíváme IF, ale ELSEIF, což píšeme pod předchozí příkaz s normálními parametry IFu. DIE znamená, že se celý skript zastaví a prohlížeč napíše hlášku, kterou jsme zadali. JavaScript nás odkáže zpět, přičemž proměnné zůstanou vyplněné, uživatel je nemusí psát znova. Kdo tentokrát nemá zapnuté JS, musí použít Zpět v prohlížeči nebo má smůlu :).

Kdo má chuť být ještě ráznější, může povolit uživateli povolit jen X e-mailů za např. týden. Řešením by byly COOKIES, ale ani ty nemusí mít uživatel zapnuté. Dalším řešením by bylo zapsání IP uživatele do databáze, což by ale bylo pracné a (relativně - při velkém počtu uživatelů) namáhavé pro server. Poslední věc, která mě napadla, je aktivování nějaké SESSION, takže po zapnutí prohlížeče by bylo možno odeslat např. jen jeden e-mail. Pochybuji, že by byl někdo tak škodolibý, že by kvůli e-mailu otevíral prohlížeč několikrát. Poslední postup je asi nejoptimálnější. Tyto postupy zde ale nebudu podrobně popisovat.

Rozesílání e-mailů - triky

další kapitola | menu

automatické vyplňování polí

Kdo počítá s nějakou častou poštou, může uživateli nabídnout automatické vyplňování formulářových polí. Je to praktické - po nějaké registraci už uživatel nemusí psát jméno ani třeba e-mail. Pokud registrován není, musí tyto položky vyplnit sám.

Ty nejvhodnější řešení jsou dvě. Tím prvním jsou COOKIES. Kdo je nemá zapnuté, nebudou mu fungovat. Ale jak říkám: "někomu pomůžou, nikomu neublíží" :). Druhým řešením je databáze, v našem případě asi SQL. Postup s databází je náročnější pro zpracování na serveru, ale zato bude fungovat všem. Obecná syntaxe:

... value="<?php skript,_který_načte_proměnné; ?>"

hromadná pošta

Hromadná pošta se hodí především vám, ne uživatelům. Využití je např. tam, kde chcete informovat všechny své zákazníky o novinkách atp. Nezapomeňme na možnost zrušit zasílání těchto zpráv.

Řešením je SQL databáze, kde máte e-maily uživatelů. Otevřeme databázi, vybereme potřebná data (= e-maily), která vypíšeme do proměnné, která značí adresáta. Můj tip je nepsat tyto e-maily do hlavního adresáta, ale do slepé kopie. Zajistí to jakousi neznámou identitu uživatelů před ostatními.

Nespamujte, ani k tomu nedejte příležitost návštěvníkům vašeho webu.

celý kód

menu

* * * soubor formular.php * * *

<p>E-mail přes poštovního klienta <a href="mailto:kdosi@cosi.kdesi">zde</a>.</p>

<form action="zpracovani.php" method="post">

<p>jméno: <input type="text" name="form_jmeno" size="20" tabindex="1"/></p>
<p>e-mail: <input type="text" name="form_email" size="20" tabindex="2"/></p>
<p>Priorita: <select name="form_priorita">
<option value="4">nízká</option>
<option value="3" selected>normální</option>
<option value="2">vysoká</option>
<option value="1">nejvyšší</option>
</select></p>
<p>předmět: <input type="text" name="form_predmet" size="20" tabindex="3" /></p>
<p><textarea cols="20" rows="5" name="form_zprava" tabindex="4"></textarea></p>
<p><input type="checkbox" name="kopieemailusobe" value="ano" checked />odeslat kopii tohoto e-mailu sobě (pokud jste vyplnili e-mail)</p>
<p><input type="submit" value="odeslat" tabindex="5" /> <input type="reset"value="smazat" tabindex="-1" /></p>

</form>

<p>Vyplňte prosím Váš e-mail a zprávu, ostatní položky jsou nepovinné.</p>

* * * soubor zpracovani.php * * *

<?php
IF ($form_email == "")
{DIE ("chyba");}
// pokud není proměnná pro e-mail vyplněna, objeví se chybová hláška

ELSEIF ($form_zprava == "")
{DIE ("CHYBA: Je nutno vyplnit zprávu!");}
// pokud není proměnná pro zprávu vyplněna, objeví se chybová hláška

$jmeno = $_POST["form_jmeno"];
$email = $_POST["form_email"];
$predmet = $_POST["form_predmet"];
$priorita = $_POST["form_priorita"];
$zprava = $_POST["form_zprava"];
// proměnné přebereme z kolekcí $_POST a nově je označíme

$to = "kdosi <kdosi@cosi.kdesi>";
// označíme příjemce zprávy (napevno stanoveného)

$subject = "$predmet";
$message = "$zprava";
// předmět a zprávu zvova přebereme jen kvůli přehlednosti

$headers = "From: $jmeno <$email> ";
// hlavička odesílatele

$headers .= "RETURN-PATH: kdosi <kdosi@cosi.kdesi> ";
// e-mail, kam se odešle případná chybová hláška

$headers .= "X-PRIORITY: $priorita ";
// priorita e-mailu

$headers .= "CONTENT-TYPE: text/plain; CHARSET=iso-8859-2 ";
// typ a kódování e-mailu; v našem případě text v kódování ISO

IF ($kopieemailusobe == "ano" && ISSET ($form_email))
$HEADERS .= "CC: <$email> ";
// pokud si uživatel přál kopii sobě, připojíme pro tento účel další hlavičku

IF (@MAIL ($to, $subject, $message, $headers))
// zkompletujeme celý e-mail

{ECHO "<p>zpráva byla odeslána, mám se rád</p>";}
// pokud se e-mail odešle, zobrazí se tato zpráva
ELSE
{ECHO "<p>zpráva nebyla odeslána, je to špatný</p>";}
// pokud se zpráva neodešle, zobrazí se tato hláška
ECHO "Děkuji za e-mail. Do 3 let odpovíme";
// můžeme zobrazit poděkování, je to slušnost, stejně jako přibližná doba, za kterou odpovíme

ECHO "<h2>odeslaný e-mail</h2>
<p>Vaše jméno: $jmeno<br />
Váš e-mail: $email<br />
předmět: $predmet<br />
priorita: $priorita (čím nižší číslo, tím vyšší)<br />
<p>zpráva: $zprava</p> "
// zobrazíme odeslaný e-mail v prohlížeči
?>

Můžete snížit počet předávání proměnných, ale takhle se mi to zdá přehlednější, zpracování to až tak moc nezpomalí.

popis celého mechanismu

Z vyplněné stránky s formulářem se aktivují proměnné, které mají názvy stejné, jako name. jejich hodnotami jsou hodnoty položek formulářů. Toto se přenese na druhou stránku. Nejdříve se ověří,zda-li nejsou proměnné prázdné. Pokud ne, pokračuje se ve zpracování.

Proměnné z formuláře se načtou do nových proměnných, ovšem z úpravami: převzetí z datové kolekce, případně zalamovaní řádků. Skript jede dál.

Naposledy se načtou proměnné. Tentokrát do proměnných, které budou definitivně vloženy do funkce mail. Upraví se o různý text atp.

Aktivuje se funkce mail. Pokud odeslání proběhlo OK, zobrazí se hláška, v opačném případě jiná hláška. A na závěr se zpráva vypíše na obrazovku.

Není to těžké!! :) Jistě přijdete na způsoby, jak kombinovat formulářová pole, jak ověřovat jiné hodnoty, než prázdné, jak udělat z více polí jednu zprávu, jak... Bylo toho moc, ale zkoušejte, ono to půjde.

Slunce v duši a lidi v zadku.

menu


Autor: mone
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
Článek ještě nebyl okomentován.


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel čtyři a pět