Jak poslat e-mail prostřednictvím PHP - část 1.

 2012-03-13 00:00:00
 Dmitry Burobin

Dnes napíšeme skript pro odesílaní e-mailů prostřednictvím PHP.

Série článků:
1) Jak poslat e-mail prostřednictvím PHP - část 1.
2) Posíláme obrázek a soubor prostřednictvím PHP - část 2.

První příklad - bez ověření vstupních dat.

<?php
// jestli tlačítko Odeslat bylo zmačknuté
if($_POST['submit']) {
        
// $_POST['title'] data z inputu Předmět, trim() - odstraňuje zbytečné 
        //mezery a řádky, htmlspecialchars() - převádí specifické symboly 
        //do HTML entit, proto, aby jsme zabránili nejjednoduššímu pokusu o 
        //hacknutí stránky a substr($_POST['title'], 0, 1000) - 
        //omezujeme text do 1000 znaků.  
        //Pro proměnnou $_POST['mess'] uděláme to samé.
        
$title substr(htmlspecialchars(trim($_POST['title'])), 01000);
        
$mess =  substr(htmlspecialchars(trim($_POST['mess'])), 01000000);
        
// $to - příjemce emailu
        
$to 'test@test.cz';
        
// $from - odesílatel
        
$from='test@test.cz';
        
// funkce, která odesíla email.
        
if(mail($to$title$mess'From:'.$from)){
        echo 
'Děkujeme! Váš dopis byl odeslán.';
    }else{
        echo 
'Dopis nebyl odeslán';
    }

?>
<form action="" method=post>

<
p>Nějaký text <p>
              <
div align="center">
              
Předmět:<br />
              <
input type="text" name="title" size="40"><br />
              
Zprava:<br />
              <
textarea name="mess" rows="10" cols="40"></textarea>
              <
br />
              <
input type="submit" value="Odeslat" name="submit"></div>
</
form

Jestli to zkoušite na lokálním serveru, tak bych Vám doporučoval nainstalovat Test Mail Server Tool, tento program je určen pro přijem emailů, konfigurace je velice jednoduchá, akorat ověřte zda je nastavený 25 port a ukažte cestu, kam se mají ukládát data. Pak otevřeme soubor php.ini a v bloce [mail function] ověřte, zda máte tyto řádky:

SMTP = localhost
smtp_port = 25
Když nejsou nebo jsou zakomentováný, tak je doplňte nebo aktivujte. Teď už by Vám všechno mělo fungovat.

Druhý příklad - s ověřením vstupních dat.

<?php
function show_form()
{
?>
<form action="" method=post>
<
div align="center">
              <
br />Jméno:*<br />
              <
input type="text" name="name" size="40">
              <
br />Telefonní číslo:<br />
              <
input type="text" name="tel" size="40">
              <
br />E-mail:*<br />
              <
input type="text" name="email" size="40">
              <
br />Téma:<br />
              <
input type="text" name="title" size="40">
              <
br />Text zprávy:*<br />
              <
textarea rows="10" name="mess" cols="30"></textarea>
              <
br /><input type="submit" value="Odeslat" name="submit">
</
div>
</
form>
Musíte vyplňit.
<?php
}

function 
complete_mail() {
        
// $_POST['title'] data z inputu Předmět, trim() - odstraňuje zbytečné 
        //mezery a řádky, htmlspecialchars() - převádí specifické symboly 
        //do HTML entit, proto, aby jsme zabránili nejjednoduššímu pokusu o 
        //hacknutí stránky a substr($_POST['title'], 0, 1000) - 
        //omezujeme text do 1000 znaků. Pro proměnné 
        //$_POST['mess'], $_POST['name'], $_POST['tel'], $_POST['email'] 
        //uděláme to samé.

        
$title =  substr(htmlspecialchars(trim($_POST['title'])), 01000);
        
$message =  substr(htmlspecialchars(trim($_POST['mess'])), 01000000);
        
$name =  substr(htmlspecialchars(trim($_POST['name'])), 030);
        
$tel =  substr(htmlspecialchars(trim($_POST['tel'])), 030);
        
$email =  substr(htmlspecialchars(trim($_POST['email'])), 050);
        
// Jestli není vyplněno pole "Jméno" - chyba 0
        
if (empty($name))
             
output_err(0);
        
// Jestli pole email vyplněno špatně - chyba 1
        
if(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i"$email))
             
output_err(1);
        
// Jestli není vyplněno pole "Text zprávy" - chyba 2
        
if(empty($message))
             
output_err(2);
        
// vytvoříme náš e-mail
        
$mess '
Jméno odesílatele: '
.$name.' <br>
Telefonní číslo: '
.$tel.' <br>
Email: '
.$email.' <br>
'
.$message;
        
// $to - příjemce emailu
        
$to $email;
        
// $from - odesílatel
        
$headers  'MIME-Version: 1.0' "\r\n";
        
$headers .= 'Content-type: text/html; charset=utf-8' "\r\n";
        
$headers .= 'From: Koding.cz<info@koding.cz>'"\r\n";
        
        if(
mail($to$title$mess$headers)){
        echo 
'Děkujeme! Váš dopis byl odeslán.';
    }else{
        echo 
'Dopis nebyl odeslán';
    }
}

function 
output_err($num)
{
    
$err[0] = 'Chyba! Zadejte jméno.';
    
$err[1] = 'Chyba! Špatný e-mail.';
    
$err[2] = 'Chyba! Zadejte zprávu.';
    echo 
'<p>'.$err[$num].'</p>';
    
show_form();
    exit();
}

if (!empty(
$_POST['submit'])) complete_mail();
else 
show_form();
?>

Ukázka

Děkuji za pozornost, v dalším článku Vám ještě ukážu, jak se da poslat nejenom textovou zprávu, ale obrázek či soubor.

Systém Orphus
Napište komentář.
Celkem komenrářů(21)
Petr Jouza - 2015-01-25  10:34:51
 Nějak nefunguje to vkládání PHP...

Pokud má někdo zájem o upravený funkční kód, tak napište Petr.jouza@outlook.com a pošlu.

Problém, který nemám vyřešen je akorát to, že pokud vyskočí chybová hláška, tak vyplněný formulář se smaže a uživatel musí začít s vyplňováním znovu.

Pokud má někdo TIP jak zajistit, aby formulář po vyskočení chybové hlášky zůstal vyplněný původně zadanými hodnotami, tak sem s tím :)

Pěkný den všem.

Petr
Petr Jouza - 2015-01-25  10:32:04
 Ahoj všichni,
moc se mi líbí druhé řešení mail formuláře. Dlouho jsem hledal něco podobného, akorát jsem řešil problém s tím, že po odeslání formuláře a vskočení chyby se mi ztratil pravý sloupec a patička. Nějak jsem to vyřešil, že to nyní funguje. Upravil jsem si akorát errory, rozložení formuláře. Doplnil jsem nějaké vychytávky pro nové prohlížeče a vyšlo mi toto:





Jméno:*





Telefonní číslo:





Email:*





Předmět:





Text zprávy:*






* Povinné položky
Petr Jouza - 2015-01-25  10:30:19
 Ahoj všichni,
moc se mi líbí druhé řešení mail formuláře. Dlouho jsem hledal něco podobného, akorát jsem řešil problém s tím, že po odeslání formuláře a vskočení chyby se mi ztratil pravý sloupec a patička. Nějak jsem to vyřešil, že to nyní funguje. Upravil jsem si akorát errory, rozložení formuláře. Doplnil jsem nějaké vychytávky pro nové prohlížeče a vyšlo mi toto:




Jméno:*





Telefonní číslo:





Email:*





Předmět:





Text zprávy:*






* Povinné položky
Kubo2 - 2015-01-21  20:17:08
 
<?phphtmlspecialchars(trim($_POST['email'])?>




Toto je celé zle. Ak zadám email napríklad Example User , vznikne tým invalidný formát emailu a teda sa ho nepodarí odoslať (avšak nie kvôli problému vytvoreného užívateľom, ale horlivosti programátora).

Okrem toho


<?phpsubstr(stringhardcoded literal number)?>




je v kontexte tvrdého orezávania údajov tiež úplne zle, radšej by si mohol zobraziť užívateľovi chybovú hlášku o tom, že prekročil povolenú dĺžku/veľkosť a ponúknuť mu možnosť opravy.

Taktiež nie je jasné, odkiaľ output_err(int) získava pole $err - pred použitím by sa hodila inicializácia $err = array();.

Napokon sa tiež prikláňam ku filter_var() aj napriek tomu, že ty "jsi zvyklý" používať regulá
e výrazy, pretože vo svojom regulá
om výraze neošetruješ všetky prípady ako hotové riešenie filter_var() napísané v Céčku.
Ejohny - 2014-01-08  08:27:38
 htmlspecialchars( - odstranuje znaky ako hačiky čiarky a ine prebytočne znaky, preto prijatu postu máte obyčajne prazdnu....
Filip - 2013-08-12  20:51:02
 Tak maká to dobře, PHP vůbec neovládám, ale pro moje použití bych spíše potřeboval, aby formulář s mailem nebyl a posilalo se to automaticky jen na jeden který si určím já. Poradil by mi s tím někdo?
Tom Pilař - 2013-02-27  02:04:00
 Tak už mi to funguje. Problém by zřejmě v nastavení e-mailu na mém webhostingu a doméně.
Tomáš Pilař - 2013-02-15  08:04:08
 Díky. Zatím nejlepší co jsem kde viděl a zkusil.

Ukázka funguje, odesílání vytvořeným souborem ovšem zatím nikoliv. V podstatě by mne zajímalo jak tento script řeší SMTP ochranu. Nikde není nic vidět.
- Odsud ukázka tedy funguje, jinak však nikoliv. Ještě vše vyzkouším.

Tomáš Pilař
Admin - 2013-01-29  15:08:23
 Pošli mi na email soubor s kódem.
E-mail: koding.burobin@gmail.com
Akio - 2013-01-28  13:14:06
 Mám jen lehce upravený errory a přidané ošetření maximálních délek údajů jinak to mám stejně ,, při smazání exitu se sice zobrazuje obsah za kódem emailu, ale ignorují se chybové ošetření = prázdnej formulář se odešle a zároveň se vypíše hláška nutno vyplnit údaje.. ale pod tím email byl odeslán a odešle se .. (smazal jsem exit a u errorů jsem místo if dopsal vždy elseif jinak to vyhodilo pět formulářů vždy s jiným errorem ) :( Takže lze smazat exit ale nevím jak to upravit aby se pak odesílal/neodesílal email
Admin - 2013-01-28  02:19:34
 Zdravím,
pokud to mate udělaný stejně jako já, pak se podívejte na funkci output_err ta vypiše chybné hlášení, zobrazi formulář a ukonči skript ( exit ). Zkuste smazát exit.
Aiky - 2013-01-27  19:27:10
 Mám problém s druhým příkladem,, za kódem týkajícím se emailu mám ještě text a přes include zápatí stránky a jakmile se ve formuláři něco nevyplní, dojde k výpisu chyby a zmíněný obsah zmizí .. tedy zápatí a další texty ,, vše funguje dokud nedojde k výpisu chyby ,, co s tím ?
Pavel Rauser - 2012-12-07  16:00:11
 jo jo bylo to presne tim kodovanim
zmenil jsem ho na windows-1250 a uz to maka jak ma
diky
Admin - 2012-11-28  11:18:57
 Zdravím,
bude to kódovánim, zkuste použit tu třidu co jsem popsal v dalším článku.
Pavel Raušer - 2012-11-24  21:04:59
 Jeden dotaz.
Proč mi maily vytvořené tímto formulářem přijdou bez písmenek, které obsahují háčky a čárky?
Místo DOBRÝ DEN mi na mail přijde jen zpráva DOBR DEN
Ale netýká se to jen zprávy, ale i popisu okýnek, jako třeba JMÉNO ODESÍLATELE: místo toho mi přijde Jmno odeslatele:
Admin - 2012-10-25  22:09:42
 Chápete to správně. E-mail přijde jenom do toho programku (do složky, kterou jste nastavil). Jinak ještě to můžete vyzkoušet na bezplatném webhostingu.
Akio - 2012-10-25  20:10:23
 Hojky,, chápu to dobře tak, že když používám pouze localhost pro test, tak emaily se mi budou posílat do toho prográmku co je tam doporučen a na email se posílají za předpokladu, že jsou stránky s kódem umístěny na netu ,, nebo jsem někde přehlédl nějakou úpravu .. Napsal jsem mail ,, a po odeslání se vyhodil nějaký error ale mail dorazil do prográmku ,, (na mail ne)
From Dmitry to Teki - 2012-08-09  18:59:28
 Děkuji, určitě budou Právě spolupráci několika věci mám v plánu, akorat jsem to nějak v červnu nestihl, ale určitě v nejbližší možné době napišu sérii článků o tom, jak se to da spojít dohromady. ( např. komentáře, registrace a td.).
From Dmitry to Bendik - 2012-08-09  18:54:38
 to můžete, ale já jsem zvyklý používat reguláry.
Teki - 2012-08-09  14:22:00
 Super návody, doufám, že budou přibývat další :) Možností je spousta (například zajímavé interaktivní menu, trochu složitější postup vytvoření registrace nebo loginu - kde lze ukázat přímo spolupráci několika věcí najednou, bylo by ještě víc super zmínit třeba další související jazyky, myslím že o javascryptu tu zatím nic není a rovněž tak CSS :)) Pokud se to bude dál rozvíjet tak to budou velmi nápomocné stránky :) Jen tak dál
[1] [2] 
*v komentářich nesmíte používat sprostá slova a odkazy!!!Děkuji za pochopeni.