Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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

Předmět Autor Datum
Také jsem zkoušel něco jednoduššího jako: html: <form method="post" action="mail.php"> <p>Váš e-ma…
blue 25.05.2009 20:43
blue
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ě p…
Kráťa 26.05.2009 01:13
Kráťa
Tyjo, ten je ale pěkný, děkuju moc, měl bych k němu jěště dotaz - kdybych chtěl, aby se mi potvrzova…
blue 26.05.2009 06:39
blue
Proč by se měl po odeslání zobrazovat formulář? Jako že by ti někdo odesílal jeden e-mail za druhým?…
Kráťa 26.05.2009 21:04
Kráťa
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…
blue 26.05.2009 21:26
blue
použil jsem display:none; na políčko spamu Nezkoušel jsem, ale mohlo by. Však si to vyskus, něco t…
Kráťa 26.05.2009 23:39
Kráťa
A jěště jeden problém, když aktualizuji stránku zprava_zpracovani.php, tak se mi odešle mejl, atd, a…
blue 26.05.2009 16:05
blue
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, ta…
Kráťa 26.05.2009 21:09
Kráťa
Taak, skoro všechno vyřešeno - teda všechno, jen by mě zajímala poslední věc, zda jde nějak udělat,…
blue 26.05.2009 20:39
blue
Také nevím. Až to někde bude, uka, testnem. Napiš mi to třeba do soukromé zprávy, aby ti tu 50 lidí…
Kráťa 26.05.2009 21:12
Kráťa
Celý kód vypadá teď takto: html: <form method="post" name="dotaznik" action="zprava_zpracovani.php…
blue 26.05.2009 21:38
blue
Může být? To musíš vědět ty, jestli to vypadá a chodí podle tvých představ.
Kráťa 27.05.2009 00:04
Kráťa
Já jen, abych tam neměl nějakou zbytečnou chybu, ale všechno jde, takže děkuju moc :). Poslední otáz…
blue 27.05.2009 06:18
blue
Presmerovani muzes udelat i takto <?php function relog($adresa_url) { header("Location: ".$adresa_u…
virus 27.05.2009 06:35
virus
tez je problem pri ulozeni souboru do Unicode Já mám uloženo vše jako Unicode, ale při přesměrování…
marekdrtic 27.05.2009 06:58
marekdrtic
Ne, zdrojové kody můžeš vidět pouze ty nebo kdokoli, kdo má přístup na tvoje FTP. Už z principu PHP…
marekdrtic 27.05.2009 06:59
marekdrtic
Uz jsem se stim setkal, ulozeni pod Unicode a najednou neslo presmerovani, problem byl prave vlozeny…
virus 27.05.2009 08:33
virus
Byte-order_mark poslední
Marvin 27.05.2009 08:36
Marvin

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ář

<form method="post" name="dotaznik" 
action="http://kochlear.cz/xxxl/zprava_zpracovani.php"
onSubmit="dotaznik.mujsubmit.value='Odesílá se...';">

<!--jmeno--> 	
<table>
<tr>
<td style="text-align: right; width: 243px"><b>Jméno:</b></td>
<td style="text-align: left">
<input type="text" name="jeho_jmeno" size="40"></td>
</tr>

<!--e-mail--> 	

<tr>
<td style="text-align: right; width: 243px"><b>e-mail na odpověď:</b></td>
<td style="text-align: left">
<input type="text" name="jeho_mejl" size="40"></td>
</tr>

<!--predmet--> 	

<tr>
<td style="text-align: right; width: 243px"><b>Předmět:</b></td>
<td style="text-align: left">
<input type="text" name="jeho_predmet" size="40"></td>
</tr>

<!--zprava-->

<tr>
<td style="text-align: right; width: 243px"><b>Zpráva:</b></td> 
<td style="text-align: left">
<textarea name="jeho_text" rows="9" cols="50"></textarea>
</td>
</tr>

<!--spampole-barva-rámečku-a-pozadí-stejná-jako-body-->
<tr>
<td style="text-align: right; width: 43px">&nbsp;</td>
<td style="text-align: center">
<input style="border: 1px solid #FFCC00; background-color: #FFCC00" type="text" name="spam" size="40">

</td>
</tr>


<tr>
<td style="text-align: right; width: 243px">&nbsp;</td> 
<td style="text-align: center">

<input class="tlacitko" type="submit" 
value="ODESLAT">
</tr>
</table></form>

2) zprava_zpracováni.php
kde je pouze kontrola na prázdné spampole )robot vždy vyplní a tím se nachytá)

<?php
if (!empty($_POST['spam']))
{
echo "<center><br><br><h3>Do toho místa na SPAM píší pouze hloupí roboti a nejde jim to odeslat</h3><br><br>";
echo "<a class='tlacitko' href='zprava.htm'> Zpět </a></center>";
}
else {
if (!empty($_POST['jeho_text']))
{
include "zprava_pokracovani.php";}
else
echo "<center><br><br><center><h3>Nebyly vyplněny povinné položky.</h3><br><br><a class='tlacitko' href='zprava.htm'> Zpět </a></center>";
}
?>

3) zprava.pokracovani.php (vlastní e-mail)

<?php 
$ref = $_SERVER['REMOTE_ADDR']; 
?> 
<?php
$datum = date ("j. m. Y G:i");
?>
<?php
$hlavicka="From:$jeho_mejl\n";
$hlavicka.="Content-Type: text/html; charset=windows-1250\n";



$emailadr = "kamto@maprijit.cz";      //Vaše e-mailová adresa
$predmet = "ze_stranky_www";          //Předmět zprávy
$zprava = "<html>
<head>
<title>z_www</title>
</head>
<body bgcolor=#ffcc00 text=black>";
$zprava .= "\r\n<br>;".$datum.";\r\n<br>";
$zprava .= "<font color=navy><b>IP </b></font>;".$ref.";\r\n<br>\r\n<br>\r\n<br>";
$zprava .= "<font size=+1 color=navy><b>Zpráva ze stránky XXXL</b></font>\r\n<br>\r\n<br>";
$zprava .= "<font color=navy><b>Jméno:</b>   </font>\r\n<br>".$_POST['jeho_jmeno']."\r\n<br>\r\n<br>";
$zprava .= "<font color=navy><b>e-mail:</b>   </font>\r\n<br>".$_POST['jeho_mejl']."\r\n<br>\r\n<br>";
$zprava .= "<font color=navy><b>Předmět:</b>   </font>\r\n<br>".$_POST['jeho_predmet']."\r\n<br>\r\n<br>";
$zprava .= "<font color=navy><b>Text:</b>   </font>\r\n<br>".$_POST['jeho_text']."\r\n<br>\r\n<br>";
?>



<?php if (Mail("$emailadr", "$predmet", "$zprava", $hlavicka)) { ?>


<?php //== Zde si můžete napsat text, který se zobrazí pro potvrzení odeslání == ?>

<center>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>Zpráva byla úspěšně odeslána</h3>
<p>&nbsp;</p>
děkujeme za meljlík, přejeme hezký den a plnou lednici
<p>&nbsp;</p>
<b>klub XXXL Praha (klub lidiček kuliček)</b>



<a class='tlacitko' href='http://klubxxxlpraha.net'> Zpět </a>
</center> 


<?php //==================== Zde končí potvrzení odeslání ================?>
<?php }
else
{
echo "Zprávu se nepodařilo odeslat";
}
?>

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>&nbsp;</p>
<p>&nbsp;</p>
<h3>Zpráva byla úspěšně odeslána</h3>
<p>&nbsp;</p>
děkujeme za meljlík, přejeme hezký den a plnou lednici
<p>&nbsp;</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 :)

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.

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.

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?

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

<?php
function relog($adresa_url) {
header("Location: ".$adresa_url."");
}
?>

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. 8-)

tez je problem pri ulozeni souboru do Unicode

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:

function reload($path)
{
header('location:'.$path);
print "<script type='text/javascript'>location.href='$path';</script>".
"<meta http-equiv='refresh' content='0;url=$path'>".
"<a href='$path'>Návrat</a>";
}

pak už stačí jenom napsat do skriptu

reload('hotovo.php');

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.

Zpět do poradny Odpovědět na původní otázku Nahoru