Autor Zpráva
kiklop
Profil
Zdravím, rád bych poprosil někoho chytřejšího nebo zkušenějšího než jsem já s tvorbou formuláře, který odesílá text na email.

Strávil jsem celou neděli tím, abych zjistil, že jsem nejspíš pomalejší :). Snažím se o jednoduchý formulář na obyčejné HTML stránky, který by odeslal na email údaje jako subject, jméno, město a samotnou zprávu včetně jednoduché antispamové ochrany.
V aktuálním formuláři mohu odeslat pouze 3 údaje a pokud přidám chybějící položku "město" vyskytne se chyba s odesláním.
Kromě toho neumím nastavit php tak, aby se v případě chyby s odesláním objevila chybová hláška (případ kdy nejsou vyplněny některé údaje nebo je chybně spam kontrola).

Stávající formulář: kód

<form action="mail.php" method="post">
<table width="200" border="0">
<tr>
<td width="60">Jméno:</td>
<td><input name="jmeno" type="text"></td>
</tr>
<tr>
<td width="60">Město:</td>
<td><input name="mesto" type="text"></td>
</tr>
<tr>
<td width="60">Zpráva:</td>
<td><input name="zprava" type="text"></td>
</tr>
<tr>
<td width="60">1 + 1= </td>
<td><input name="spam" type="text"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" class="button" value="Odeslat"><input type="reset" value="Vymazat"></td>
</tr>
</table>
</form>


php script:

<?php

$subject = "Formular A1";
$jmeno = $_POST['jmeno'];
$mesto = $_POST['mesto'];
$zprava = $_POST['zprava'];
$spam = $_POST['spam'];

if ($jmeno!="" and $zprava!="" and $spam=="2")

mail ("jmeno@domena.cz", $subject, $jmeno, $zprava);

Header( "Location: odeslano.htm" );

?>


Vše je pak odesíláno na email seznamu.

Na internetu, ale i zde v diskusích je mnoho dostupných řešení a příkladů, ale žádné nesplňovalo moje požadavky a pokud ano, samotné emaily nechodily nebo přišly vždy prázdné případně byl problém s češtinou. Já jsem se s php setkal poprvé u tohoto případu a proto omluvte mojí zcela totální neznalost.

Děkuji všem za případnou pomoc.
Ben
Profil *
Vylovil jsem někde svoje začátečnické řešení. Vcetne jednoduche antispam kontroly, ktera bezneho cloveka nijak neobtezuje matematickymi priklady a jinymi nesmysly
<h2>Kontakt</h2>
<p class="box">
Nejaky text na strance...
</p> 

<br>

<h2>Kontaktní formulář</h2>
<script type="text/javascript">
<!--

function checkForm() {

  if(document.kontakt.odesilatel.value == ""){
	 	alert("Zadejte emailovou adresu!");
	 	document.kontakt.odesilatel.focus();
	return false;
	}
 
	if(document.kontakt.zprava.value == ""){
  	alert("Zadejte obsah zprávy!");
	  document.kontakt.zprava.focus();
	return false;
	}
	
}
// -->
</script>

<script type="text/javascript">
    <!-- <![CDATA[
 
    function __formIsSending()
    {
      alert('Strpení prosím, požadavek se již odesílá...');
      return false;
    }
 
    function __formDisMultipleClick(formObj)
    {
      for (var i=0; i<formObj.length; i++ )
      {
        if (formObj.elements[i].type == 'submit' || formObj.elements[i].type == 'image')
        {
          formObj.elements[i].onclick = __formIsSending;
        }
      }
    }
 
    //]]> -->
</script>	


<?php
if ($_POST['ok'] && $_POST['mail']=="" && $_POST['email']==""){

                    function autoUTF($s){
                                         // detekce UTF-8
                                         if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s))
                                         return $s;
                                         
                                         // detekce WINDOWS-1250
                                         if (preg_match('#[\x7F-\x9F\xBC]#', $s))
                                         return iconv('WINDOWS-1250', 'UTF-8', $s);
                                         
                                         // předpoklad 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));
                                                                          return mail ($to, $predmet, $zprava, $head); 
                                                                         }

                  $mail = "nejaky@email.com";
                  $predmet = "Predmet";
                  $zprava = $_POST['zprava'];
                  $kon = cs_mail ($mail, $predmet, $zprava, "From: $_POST[odesilatel] \n");

                  if ($kon)
                    echo "<p class=\"box\"><strong>Zpráva byla odeslána.</strong></p>";
                 
                  else
                    echo "<p class=\"error\"><strong>Zprávu se nepodařilo odeslat.</strong></p>";
                 }
?>
<p>
<em class="kon">Všechny údaje jsou povinné.</em>
</p>

<form name="kontakt" action="<?php echo $PHP_SELF ?>" method="post" onSubmit="return checkForm()"; onsubmit="__formDisMultipleClick(this)"; id="__aspnetForm">

<div style="visibility:hidden;">
 <input type="text" name="mail" value="" />
</div>

<div style="visibility:hidden;">
 <input type="text" name="email" value="" />
</div>

<table>
<tr>
 <td align="right">Váš email:</td> <td><input name="odesilatel" size="40"></td>
</tr>
<tr> 
 <td align="right">Zpráva:</td> <td><textarea name="zprava" rows="10" cols="55" style="overflow:hidden;"></textarea></td>
</tr>
<tr>
 <td></td> <td><input type="Submit" name="ok" value="Poslat zprávu" class="tlacitko"></td>
</tr>
</table>
</form>

kiklop
Profil
Děkuji, otestuji toto řešení.
kiklop
Profil
Bohužel, navržené řešení mi nefunguje a navíc jde zcela jinou cestou než jsem zamýšlel / případně mě omezuje moje neznalost.

Uvítal bych úpravu mého jednoduchého a stávajícího řešení, které je na polovině cesty k úspěchu.
Děkuji.
Ben
Profil *
kiklop:
Bohužel, navržené řešení mi nefunguje a navíc jde zcela jinou cestou než jsem zamýšlel / případně mě omezuje moje neznalost.
A co nefunguje?

Uvítal bych úpravu mého jednoduchého a stávajícího řešení, které je na polovině cesty k úspěchu.
Tady máš tři možnosti:
1. Někdo ti to udělá zadarmo.
2. Někdo ti to udělá za peníze nebo barter.
3. Přečteš si porozně návody a manuál a uděláš si to sám. Či zajdeš na nějaké školení pro začátečníky.

O první možnosti spíš pochybuji. Druhá možnost je, pokud s tím nechceš ztrácet čas a máš peníze nebo něco jiného k nabídnutí. A poslední možnost je pro tebe vhodná, pokud se chceš posunout dál a věnovat se tomuto.
kiklop
Profil
2 Ben:
Rozumím, myslel jsem naivně, že se jedná o triviální záležitost a že zde v diskusi najdu pomoc, že si zde uživatelé pomáhají. Sám jsem na webu zaregistrován teprve dnes, ale pasivním čtenářem jsem již několik let).

Ale v pořádku, pokud někdo navrhne funkční řešení v podobě rozšíření již stávajícího kódu, tak, aby na email došla informace o subjectu, jména, města a samotné zprávy. Společně s možnosti univerzální textové informace o chybě pokud nebudou vybrané formuláře vyplněny nebo chybně vyplněná spam ochrana včetně toho, že zpráva na email seznamu dorazí se správnou češtinou...

...nemám problém zaslat na bankovní účet předem domluvenou částku.


Myšlenka, že se vlastním rozvojem posunu dál, je sice krásná, ale pokud se můj rozvoj ubírá zcela jiným směrem raději za jednorázovou informaci zaplatím.
Přesto děkuji za nakopnutí.
Ben
Profil *
kiklop:
...že si zde uživatelé pomáhají...“ Pomáhat nebo udělat je rozdíl. Ale to co ccheš, ti jsem schopný udělat za lahvinku něčeho dobrého nebo balení žvýkacího tabáku. Pokud ti to nikdo nenapíše, dej mi vědět na benda.tomas@gmail.com
T.Thomas
Profil *
Jeden narychlo upravený starší script. Tu PHP část zpracování jsem nezkoušel, protože bych ji musel natáhnout na server, ale měla by být funkční.
odesílací formulář s JavaScriptem:
  <script type="text/javascript">
    <!-- <![CDATA[
    function kontrola() {
      kod="2"
    if (document.dopis.jmeno.value == ""){
          alert ("Haló pane ANONYM\nco se tkhle podepsat !!!!");
          document.dopis.jmeno.focus();
          document.dopis.jmeno.select();
          return false;
        }
    if (document.dopis.mesto.value == ""){
          alert ("A odkud pak jste?\nVyplňte kolonku jméno.");
          document.dopis.mesto.focus();
          document.dopis.mesto.select();
          return false;
        }
      if (document.dopis.zprava.value == ""){
          alert ("Napište něco hezkého ...");
          document.dopis.zprava.focus();
          document.dopis.zprava.select();
          return false;
        }
      if (document.dopis.spam.value == ""){
          alert ("Tuto protispamovou kolonku\nje opravdu nutné vyplnit!!!");
          document.dopis.spam.focus();
          document.dopis.spam.select();
          return false;
        }
      if (document.dopis.spam.value != kod){
          alert ("Tak to opravdu není ono\n zkus to ještě jednou.");
          document.dopis.spam.focus();
          document.dopis.spam.select();
          return false;
        }
        
    else {
          return true;
      }  
      
   }   
    //]]> -->
</script>

  <form action="mail.php" method="post" name="dopis" onsubmit="return kontrola();">
<table width="200" border="0">
<tr>
<td width="60">Jméno:</td>
<td><input name="jmeno" type="text"></td>
</tr>
<tr>
<td width="60">Město:</td>
<td><input name="mesto" type="text"></td>
</tr>
<tr>
<td width="60">Zpráva:</td>
<td><input name="zprava" type="text"></td>
</tr>
<tr>
<td width="60">1 + 1= </td>
<td><input name="spam" type="text"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" class="button" value="Odeslat"><input type="reset" value="Vymazat"></td>
</tr>
</table>
</form>

mail.php:
<?php
$jmeno = $_POST['jmeno'];
$mesto = $_POST['mesto'];
$zprava = $_POST['zprava'];
$spam = $_POST['spam'];
$dnes = Date("d.m.");
$ip = "ip adresa odesilatele:". $_SERVER['REMOTE_ADDR']."<br>";
$komu = "adresa@seznam.cz"; // Zaměnit za Vaší e-adresu
$headers = "From:"." adresaodesilatele@nekde.cz\n"; // ta chybí už v odesílacím formuláři ...
$headers .= "Content-Type: text/html; charset=windows-1250\n";  // !!! Případně změnit za používané kódování !!!
$predmet = "Posláno z webu XXY";  // Zaměnit text za vlastní. NEPOUŽÍVAT DIAKRITIKU
$subject = "Formular A1";

if (($spam == "") or ($spam != "2")){ 
echo "S spamovacími roboty se nebavíme ...";
}
elseif(($jmeno =="") or ($mesto =="") or ($zprava == "")){ 
 echo "nebyly vyplněny všechny povinné údaje";
 echo "<INPUT onclick=\"javascript:self.history.back();\" type=button value=\"Zpět\">";
}
else {
$zprava = str_replace("\n"," <br> ", $zprava);
$celek = $ip."Dnes (".$dnes.") poslal(a) <b>".$jmeno."</b> e-mail tohoto znění:<br><hr><br><b>"
.$jmeno."<br>".$mesto."<br>".$zprava."</b>"; 
@mail($komu, $predmet, $celek, $headers);
echo "E-mail byl úspěšně odeslán na adresu:<br>".$komu."<br>";
echo "<INPUT onclick=\"javascript:self.history.back();\" type=button value=\"Zpět\">";
// Místo toho JavaScriptu na návrat by bylo lepší dát adresu kam se přesměrovat.
}

?>


Pozor na kódování v hlavičce mailu já tam používá windows-1250. Tak případně zaměnit za UTF-8.
Jde to samozřejmě předělat, zkrátit a jiné.
kiklop
Profil
2 T.Thomas

Děkuji za navržené řešení, které dokonce nabízí více než jsem sám potřeboval. Aktuálně jsem otestoval a je plně funkční.
Večer si udělám čas poučím se z kódu. Ještě jednou děkuji.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0