Autor Zpráva
PI
Profil *
Zdravím,
týden se pokouším zprovoznit skript, který mi posbírá data z libovolného formuláře a odešle mi je na mail. Na intervalu jsem našel tenhle univerzální skript a pokouším se do něj dostat spamovou kontrolu a hlavně češtinu (našel jsem cosi o $headers, ale nevím jak to do toho zakomponovat). Vždycky mi nějaká část nefunguje. Poradíte, jak by to mělo vypadat?


Originální skript z intervalu (nechodí čeština a chybí spamová kontrola):
<?php

if(count($HTTP_POST_VARS)>0) {

$komu = "nejaka@adresa.cz";
$predmet = "Formular odeslany skriptem z mojich stranek"
$od = "from: ctenar@intervalu.cz"; // PI poznámka: sem potřebuji doplnit, aby si to nalízlo adresu z políčka mail ve formuláři
$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>");
}

?>
Str4wberry
Profil
Češtinou ve funkci mail se zabývá část zdejšího FAQ.
PI
Profil *
Děkuji, z Vámi uvedeného odkazu jsem se dostal na tohle:

http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=9&topic=89656

a tam se řešilo přesně to co potřebuji. Nechci chválit dne před večerem, protože se tím ještě prokousávám, ale vypadá to velmi nadějně...
Podám zprávu jak to pokračuje, zatím ještě jednou děkuji.
AM_
Profil
mimochodem, ten skript bude dost zastaralý, $HTTP_POST_VARS je již od PHP4 nahrazeno $_POST a věci jako $HTTP_USER_AGENT a $REMOTE_ADDR jsou v poli $_SERVER['HTTP_USER_AGENT'] příp.$_SERVER['REMOTE_ADDR'].
Na vypnutých register_globals (což má již spousta hostingů) to ani nepoběží.
PI
Profil *
Dotaz: nechal by se níže uvedený skript upravit tak, aby se text položky $predmet2 (předmět_mailu2) měnil v závislosti na volané stránce?
Myslím něco jako:
jestliže volám page "stranka1" vlož do $predmet2 text: "predmet_mailu1",
jestliže volám page "stranka2" vlož do $predmet2 text: "predmet_mailu2",
jestliže volám page "strankaX" vlož do $predmet2 text: "predmet_mailuX" atd.

Napadá mě, že by to mohlo jít přes:
$page=$_GET["page"];
if ($page=='stranka1') a dál nevím jsem v koncích. Taky netuším jak to zakomponovat do níže uvedeného, aby to šlapalo. Jinak mi níže uvedené plně vyhovuje. Poradíte?

<?php
$mail = "mojmail@seznam.cz";
$predmet = "predmet_mailu";
$email = $_POST['email'];
$spam = $_POST['spam'];
$predmet2 = "predmet_mailu2";
$zprava =
" \r\nNiečo 1: ".$_POST['nieco1'].
" \r\nNiečo 2: ".$_POST['nieco2'].
" \r\nNiečo 3: ".$_POST['nieco3'].
" \r\nNiečo 4: ".$_POST['nieco4'].
" \r\nNiečo 5: ".$_POST['nieco5'].
" \r\nNiečo 6: ".$_POST['nieco6'].
" \r\nNiečo 7: ".$_POST['nieco7'].
" \r\nPředmět2: ".$predmet2.
" \r\nEmail: ".$_POST['email'].
" \r\nSpráva: ".$_POST['zprava'];
$kon = cs_mail ($mail, $predmet, $zprava, "From: $email\n");

if ($email!="" and $zprava!="" and $spam!="2" )
{

if ($kon)
echo "E-mail byl úspěšně odeslán.<br>";
}
else
echo "E-mail se bohužel nepodařilo odeslat.<br>";
?>

<?php

function autoUTF($s)
{
// detect UTF-8
if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s))
return $s;
// detect WINDOWS-1250
if (preg_match('#[\x7F-\x9F\xBC]#', $s))
return iconv('WINDOWS-1250', 'UTF-8', $s);
// assume ISO-8859-2
return iconv('ISO-8859-2', 'UTF-8', $s);
}

function cs_mail ($to, $predmet, $zprava, $head = "")
{ $predmet = "=?utf-8?B?".base64_encode(autoUTF ($predmet))."?=";
$head .= "MIME-Version: 1.0\n";
$head .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$head .= "Content-Transfer-Encoding: base64\n";
$zprava = base64_encode (autoUTF ($zprava));
$stav = mail ($to, $predmet, $zprava, $head);
return $stav ? TRUE : FALSE; }
?>
PI
Profil *
Sorry, nemyslím a píšu nesmysly. Mělo by to být asi tak, že se obsah položky $predmet2 změní v závislosti na tom z jaké stránky je tento skript volán. Tedy mám formulář na stránce "stranka1" zmáčknu tlačítko odeslat, zavolá se výše uvedený skript, který bude v souboru třeba "send.php" a protože byl skript volán ze "stranka1" vloží se do $predmet2 text: "predmet_mailu1". Analogicky "stranka2", "strankaX".

??? :-(
PI
Profil *
Ke dvěma výše uvedeným bodům. Nedalo by se to řešit přes jméno formuláře? Při odeslání (zavolání "send.php") by se identifikovalo jméno formuláře a přiřadil obsah $predmet2.
PI
Profil *
Nedaří se mi...
Zane
Profil *
Takže jestli to dobře chápu, tak chceš mít např. nějaký takový formulář s přiděleným ID:

<form action="send.php" method="post" id="formular1">
<input name="neco1" size="25" value="">
<input name="neco3" size="25" value="">
<input name="neco3" size="25" value="">
<input type="submit" value="Odeslat">
</form>

a chceš, aby když zavoláš skript:

(send.php):
<?php
$mail = "mojmail@seznam.cz";
$predmet = "predmet_mailu";
$email = $_POST['email'];
$spam = $_POST['spam'];
$predmet2 = "predmet_mailu2";
$zprava =
" \r\nNiečo 1: ".$_POST['nieco1'].
" \r\nNiečo 2: ".$_POST['nieco2'].
" \r\nNiečo 3: ".$_POST['nieco3'].
" \r\nNiečo 4: ".$_POST['nieco4'].
" \r\nNiečo 5: ".$_POST['nieco5'].
" \r\nNiečo 6: ".$_POST['nieco6'].
" \r\nNiečo 7: ".$_POST['nieco7'].
" \r\nPředmět2: ".$predmet2.
" \r\nEmail: ".$_POST['email'].
" \r\nSpráva: ".$_POST['zprava'];
$kon = cs_mail ($mail, $predmet, $zprava, "From: $email\n");

if ($email!="" and $zprava!="" and $spam!="2" )
{

if ($kon)
echo "E-mail byl úspěšně odeslán.<br>";
}
else
echo "E-mail se bohužel nepodařilo odeslat.<br>";
?>

<?php

function autoUTF($s)
{
// detect UTF-8
if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s))
return $s;
// detect WINDOWS-1250
if (preg_match('#[\x7F-\x9F\xBC]#', $s))
return iconv('WINDOWS-1250', 'UTF-8', $s);
// assume ISO-8859-2
return iconv('ISO-8859-2', 'UTF-8', $s);
}

function cs_mail ($to, $predmet, $zprava, $head = "")
{ $predmet = "=?utf-8?B?".base64_encode(autoUTF ($predmet))."?=";
$head .= "MIME-Version: 1.0\n";
$head .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$head .= "Content-Transfer-Encoding: base64\n";
$zprava = base64_encode (autoUTF ($zprava));
$stav = mail ($to, $predmet, $zprava, $head);
return $stav ? TRUE : FALSE; }
?>

se ověřilo jméno formuláře a podle toho se měnil $predmet2 - např. :

<form action="send.php" method="post" id="formular1"> --> $predmet2 = "predmet_mailu1";
<form action="send.php" method="post" id="formular2"> --> $predmet2 = "predmet_mailu2";
<form action="send.php" method="post" id="formular3"> --> $predmet2 = "predmet_mailu3";

Je to tak? Na to chceš upravit výše uvedený skript?
PI
Profil *
Jo, přesně takhle bych to chtěl, ale nedří se mi... :-(
Zane
Profil *
Upřímně nevím kudy do toho. Konzultoval jsem to se známým, který se v tom trošku hrabe a tvrdí, že toto udělat nelze, ale mě se to moc nezdá. Co některý ze zdejších moderátorů, něděl by jak do toho?
PI
Profil *
Nakonec jsem to pořešil následovně a vypadá to, že to funguje: do formuláře vložím skrytý <input> ve kterém je value="<?php
if(IsSet($_GET['page'])):
switch($page) {
case "stranka1": echo "odesláno ze stránka 1"; break;
case "stranka2": echo "odesláno ze stránka 2"; break;
case "stranka3": echo "odesláno ze stránka 3"; break;
default: echo "nejaky text treba bla bla bla"; break;
}
endif;?>"

Celý formulář:
<form action="?page=send" method="post" id="petr">
<table>
<tr>
<td>Niečo1:**</td>
<td><input name="nieco1" size="25" value=""></td>
</tr>
<tr>
<td>Niečo2:**</td>
<td><input name="nieco2" size="25" value=""></td>
</tr>
<tr>
<td>Niečo3:</td>
<td><input name="nieco3" size="25" value=""></td>
</tr>
<tr>
<td>Email:**</td>
<td><input name="email" size="25" value=""></td>
</tr>
<tr>
<td>Niečo4:</td>
<td><input name="nieco4" size="25" value=""></td>
</tr>
<tr>
<td>Niečo 5:</td>
<td><input name="nieco5" size="25" value=""></td>
</tr>
<tr>
<td>Niečo 6:**</td>
<td><input name="nieco6" size="25" value=""></td>
</tr>
<tr>
<td>Niečo 7:**</td>
<td><input name="stranka" size="25" value="<?php
if(IsSet($_GET['page'])):
switch($page) {
case "stranka1": echo "odesláno ze stránka 1"; break;
case "stranka2": echo "odesláno ze stránka 2"; break;
case "stranka3": echo "odesláno ze stránka 3"; break;
default: echo "nejaky text treba bla bla bla"; break;
}
endif;?>" type="hidden"></td>
</tr>
<tr>
<td>Antispam** 1+1=</td>
<td><input name="spam" size="10"></td>
</tr>
<tr>
<td valign="top">Správa:</td>
<td>
<textarea name="zprava" rows="5" cols="30"></textarea><br>
<input type="submit" value="Odoslať">
</td>
</table>
</form>


soubor "send.php":
<?php
$mail = "mail1@email.cz, mail2@email.cz, mailx@email.cz";
$predmet = "predmet_mailu";
$email = $_POST['email'];
$spam = $_POST['spam'];
$zprava =
" \r\nNiečo 1: ".$_POST['nieco1'].
" \r\nNiečo 2: ".$_POST['nieco2'].
" \r\nNiečo 3: ".$_POST['nieco3'].
" \r\nNiečo 4: ".$_POST['nieco4'].
" \r\nNiečo 5: ".$_POST['nieco5'].
" \r\nNiečo 6: ".$_POST['nieco6'].
" \r\nStránka: ".$_POST['stranka']. //toto si přebere tu hodnotu z formuláře, která bude přiřazena při načtení každého formuláře podle volané stránky
" \r\nEmail: ".$_POST['email'].
" \r\nSpráva: ".$_POST['zprava'];
$kon = cs_mail ($mail, $predmet, $zprava, "From: $email\n");
if ($email!="" and $zprava!="" and $spam=="2" )// určuje povinné položky
{
$kon = cs_mail ($mail, $predmet, $zprava, "From: $email\n");
if ($kon)
echo "E-mail byl úspěšně odeslán.<br>";
}
else
echo "E-mail se bohužel nepodařilo odeslat.<br>";
?>

<?php
function autoUTF($s)
{
// detect UTF-8
if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s))
return $s;
// detect WINDOWS-1250
if (preg_match('#[\x7F-\x9F\xBC]#', $s))
return iconv('WINDOWS-1250', 'UTF-8', $s);
// assume ISO-8859-2
return iconv('ISO-8859-2', 'UTF-8', $s);
}

function cs_mail ($to, $predmet, $zprava, $head = "")
{ $predmet = "=?utf-8?B?".base64_encode(autoUTF ($predmet))."?=";
$head .= "MIME-Version: 1.0\n";
$head .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$head .= "Content-Transfer-Encoding: base64\n";
$zprava = base64_encode (autoUTF ($zprava));
$stav = mail ($to, $predmet, $zprava, $head);
return $stav ? TRUE : FALSE; }
?>

Na závěr: tváří se to funkčně, ale ještě jsem nezkoušel, jestli to projde validátorem. Splňuje to vše co jsem pořeboval: Odeslat libovolný formulář na e-mail(y) včetně češtiny, má to antispam a vybrano položku formuláře můžu nastavit tak, aby identifikovala stránku ze které byl formulář odeslán.
Máte někdo lepší řešení? Vidíte nějaký problém? Rád se přiučím - proto jsem tu.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: