
PHP - formulář na e-mail
Dobrý den,
už dva dny dělám na php formuláři, který by mě ze stránky odeslal zprávu na můj e-mail, ale nedaří se a nedaří se. Jednou je problém s kódováním češtiny, podruhé zase s funkcí else, že mě hláška 'Váš e-mail byl úspěšně odeslán' vyskočí někde na jiné stránce, atd, atd...
Neměl by tedy někdo jednoduchý PHP skript, který vše vyřeší, už jsem četl diskuze, články, ale asi jsem úplně blbej.
Zdroj html:
<form method="post" action="skript.php">
<p>Vaše jméno:</p>
<p><input name="jmeno" /></p>
<p>Zpráva:</p>
<p><textarea name="zprava"></textarea></p>
<p><input type="submit" value="Odeslat" /></p>
Neměl by teda někdo jednoduchej skript, stačí mi dvě položky, jméno a zpráva, taky jsem zkoušel něco jako:
<?
function vypisForm($jmeno,$predmet,$text) {
echo "
<form method=post action=\"mail.php\">
Jméno:<br>
<input name=jmeno value=\"".$jmeno."\"><br>
Předmět:<br>
<input name=predmet value=\"".$predmet."\"><br>
Text zprávy<br>
<textarea style=\"width:200px; height:150px;\" name=text>".$text."</textarea><br><br>
<input type=submit value=Odeslat>
</form>
<br><br>
";
}
if (empty($_POST))
vypisForm("","","");
else {
if ($_POST["jmeno"]=="" || ereg("^ +$",$_POST["jmeno"])) {
echo "Zadejte prosím své jméno.";
vypisForm($_POST["jmeno"],$_POST["predmet"],$_POST ["text"]);
}
elseif ($_POST["predmet"]=="" || ereg("^ +$",$_POST["predmet"])) {
echo "Zadejte prosím předmět.";
vypisForm($_POST["jmeno"],$_POST["predmet"],$_POST ["text"]);
}
elseif ($_POST["text"]=="" || ereg("^ +$",$_POST["text"]) || strlen($_POST["text"]) > 500) {
echo "Text e-mailu by měl být v rozmezí 1-500 znaků.";
vypisForm($_POST["jmeno"],$_POST["predmet"],$_POST ["text"]);
}
else //nyní následuje samotné odesílání mailu {
if ($_SERVER["SERVER_ADDR"]!="127.0.0.1")
Mail ("vaseadresa@server.cz",$_POST["predmet"],$_POST[" text"],"From:".$_POST["jmeno"]);
echo "E-mail byl úspěšně odeslán.";
}
}
?>
Tento skript jsem sem skopíroval z jednoho článku, je volně šiřitelný, také jsem ho upravil dle mých názvů, atd...ale e-maily byly bez kódování čsštiny a chodily na mou adresu tak nějak divně - nebyla vyplněna adresa, předmět a v e-mailu bylo hodně zbytečných věcí - každopádně jsem byl nejvíce spokojen, echo se vypisovalo hnedka po odeslání pod formulář a má to i kontroly proti spamu, takže tak.
Děkuji
Také jsem zkoušel něco jednoduššího jako:
html:
<form method="post" action="mail.php">
<p>Váš e-mail:</p>
<p><input name="mail_odesilatele" /></p>
<p>Zpráva:</p>
<p><textarea name="zprava" cols="50" rows="6"></textarea></p>
<p><input type="submit" value="Odeslat" /></p>
</form>
php:
<? if ( Mail("vaseadresa@server.cz", $predmet, $zprava, "From:" . $mail_odesilatele . "\r\nContent-Type: text/plain; charset=utf-8") )
{ require "presmerovani.html";}
else {echo "Zprávu se nepodařilo odeslat";}
Ale to asi nebude nejideálnější řešení - i když kódování zde šlo, ale to přesměrování je tady takové neprofesionální a není tady taky kontrola.
Já to mám na 3 soubory. Různě jsem si to kdysi poslepil ze snad pěti zdrojů a byl jsem na to děsně pyšný
1) formulář
2) zprava_zpracováni.php
kde je pouze kontrola na prázdné spampole )robot vždy vyplní a tím se nachytá)
3) zprava.pokracovani.php (vlastní e-mail)
Tyjo, ten je ale pěkný, děkuju moc, měl bych k němu jěště dotaz - kdybych chtěl, aby se mi potvrzovací zpráva, že to bylo odesláno objevovala pod formulářem, tak vložím místo tohodle kódu celý kód stránky s formulářem + někde písnu větu:
<center>
<p> </p>
<p> </p>
<h3>Zpráva byla úspěšně odeslána</h3>
<p> </p>
děkujeme za meljlík, přejeme hezký den a plnou lednici
<p> </p>
<b>klub XXXL Praha (klub lidiček kuliček)</b>
<a class='tlacitko' href='klubxxxlpraha.net'> Zpět </a>
</center>
Nebo by to šlo udělat lépe, abych nemusel mít celý html kód zde?
Taky je to zajímavé, že to veme tu zprávu ohraničenou jen do <? ?>, heh, ale asi jo no, avšak netuším proč, by tam možná měla jěště logicky být if nebo else nebo tak něco, ale funguje to, toť vše.
Moc děkuju :)
Proč by se měl po odeslání zobrazovat formulář? Jako že by ti někdo odesílal jeden e-mail za druhým?
Ty kecy si tam dáš vlastní a ono <a class='tlacitko' href=... také.
Aha, díky za všechny odpovědi! Jdu vyzkoušet to přesměrování, já to mezitím vyřešil jako:
{
require "presmerovaci_adresa.html";
}
Tohle jsem tam dal místo té potvrzovací zprávy, a tu jsem napsal zvlášť do presmerovaci_adresa.html, na které byl celý html kód formuláře + ta potvrzovací věta třeba pod ním, takže to pěkně vypadá.
Btw. použil jsem display:none; na políčko spamu, myslíš, že to funguje i potom? Já myslím, že ano.
Nezkoušel jsem, ale mohlo by. Však si to vyskus, něco tam písni (jestli to však vůbec půjde) a zkus odeslat.
A jěště jeden problém, když aktualizuji stránku zprava_zpracovani.php, tak se mi odešle mejl, atd, atd, takže kdyby někdo pořád aktualizoval, tak mi chodí pořád e-maily.
To by asi šlo ošetřit nějakým vymazáním proměnných po odeslání. Mě nikdy vícero e-mailů nepřišlo, tak jsem to neřešil.
Řešil jsem ale odesílání příhoh. Dospěl jsem k názoru, že nechci aby mi kdekdo z webu posílal ptákoviny typu "4 svíčky" a tak jsem to nedělal. Jen by to zatěžovalo server hostingu a to nechci
Taak, skoro všechno vyřešeno - teda všechno, jen by mě zajímala poslední věc, zda jde nějak udělat, aby se výsledná .php adresa v adresním řádku nezobrazovala, aby se zobrazila jen adresa stránky, to je podle mě docela lehké, ale nevím jak na to, no. Něco jako skrytí adresy, nebo tak něco asi.
Také nevím. Až to někde bude, uka, testnem. Napiš mi to třeba do soukromé zprávy, aby ti tu 50 lidí neposílalo mejl.
Celý kód vypadá teď takto:
html:
<form method="post" name="dotaznik" action="zprava_zpracovani.php" onSubmit="dotaznik.mujsubmit.value='Odesílá se...';">
<p>e-mail:</p>
<p><input type="text" name="jeho_mejl" size="40" /></p>
<p>text:</p>
<p><textarea name="jeho_text" rows="9" cols="50"></textarea></p>
<!-- spam -->
<p><input style="display: none; border: 1px solid green; background-color: green" type="text" name="spam" size="40" /></p>
<p><input class="tlacitko" type="submit" value="Odeslat" /></p>
</form>
zprava_zpracovani:
<?php
if (!empty($_POST['spam']))
{
echo "<center><h3>Do toho místa na SPAM píší pouze hloupí roboti a nejde jim to odeslat</h3></center>";
echo "<center><a href='mejl.html'> Zpět </a></center>";
}
else {
if (!empty($_POST['jeho_text']))
{
include "zprava_pokracovani.php";}
else
echo "<center><h3>Nebyly vyplněny povinné položky.</h3><a href='mejl.html'> Zpět </a></center>";
}
?>
zprava_pokracovani:
<?php
$ref = $_SERVER['REMOTE_ADDR'];
?>
<?php
$hlavicka="From:$jeho_mejl\n";
$hlavicka.="Content-Type: text/html; charset=utf-8\n";
$emailadr = "mojeadresa@server.cz"; //Vaše e-mailová adresa
$predmet = "vzkaz"; //Předmět zprávy
$zprava = "<html>
<head>
<title></title>
</head>
<body>";
$zprava .= "<b>IP: </b>".$ref."\r\n<br>\r\n<br>";
$zprava .= "<b>Vzkaz:</b> \r\n<br>".$_POST['jeho_text']."\r\n<br>";
?>
<?php if (Mail("$emailadr", "$predmet", "$zprava", $hlavicka)) { ?>
<?php
{
require "mejl_s_potvrzenim.html";
}
?>
<?php //==================== Zde končí potvrzení odeslání ================?>
<?php }
else
{
echo "Zprávu se nepodařilo odeslat";
}
?>
Může být?
To musíš vědět ty, jestli to vypadá a chodí podle tvých představ.
Já jen, abych tam neměl nějakou zbytečnou chybu, ale všechno jde, takže děkuju moc :). Poslední otázka, kterou řeším ohledně php, jestli jdou zobrazit zdrojové kódy těch souborů jako u html? Asi ne, jelikož se to mění na serveru na to html, no.
Presmerovani muzes udelat i takto
Samozrejme HEADER musi byt uplne nazacatku stranky, to znamena ze nesmi byt ani pred nim zadny include souboru ktere vypisuje naky text, tez je problem pri ulozeni souboru do Unicode, vlozi se na zacatek 3 znaky jako hidden.
Já mám uloženo vše jako Unicode, ale při přesměrování PHPčkem problémy nemám žádný. I tak ale mám všude takovouto funkci:
pak už stačí jenom napsat do skriptu
a je to třikrát (vlastně čtyřikrát) posichrované, že to opravdu přesměruje, nevím, jaká by musela být konstalace hvězd, aby se to nepřesměrovalo a musel se zobrazit odkaz. Zatím neznám nikoho.
Ne, zdrojové kody můžeš vidět pouze ty nebo kdokoli, kdo má přístup na tvoje FTP. Už z principu PHP je to jazyk zpracovávaný na straně serveru, takže uživatel vidí jenom hotové HTML (+ CSS a Javascript, pokud tam vůbec je).
Uz jsem se stim setkal, ulozeni pod Unicode a najednou neslo presmerovani, problem byl prave vlozeny paznak uplne na samem zacatku = 
previt jeden.
Byte-order_mark