mail.htm

E-mailem lze data formuláře poslat i lokálně, stačí u definice formuláře zadat action = "mailto:...". Takto to dělá ukázkový soubor odeslat0. Asi spolehlivější je posílat data e-mailem serveru. Pozor, na serverech bývá tato možnost zakázaná. Ukázkou jsou soubory odeslat.htm a odeslat.php (v prvním se zadávají data, druhý je posílá - funkční odkaz na webzdarma). Adresa je uvedena napevno v php-skriptu. Šla by zadávat formulářem, ale říkali bychom si o konflikt se správci serveru (umožnili bychom totiž anonymní odesílání). Přikládám tu část posledního souboru, která je v php:

<table>
<?php 
echo "<tr><td>Text 1:</td><td>".$_REQUEST["Text1"]."</td></tr>"; 
echo "<tr><td>Text 2:</td><td>".$_REQUEST["Text2"]."</td></tr>"; 
echo "<tr><td>E-mail:</td><td>".$_REQUEST["Email"]."</td></tr>"; 
$ip = getenv('REMOTE_ADDR');
echo "<tr><td>Posláno z:</td><td>".$ip."</td></tr>";
mail("hlavac@fs.cvut.cz", "Testovaci e-mail: odezva formulare", $_REQUEST["Email"]." - ".$ip." - ".$_REQUEST["Text1"]." - ".$_REQUEST["Text2"]); 
?> 
</table>

Prozatím si zbytek musíte prozkoumat sami. Na webzdarma mi mail chodí nespolehlivě, se značným zpožděním, ale chodí. Například jsem získal následující výsledek:

To: hlavac@fs.cvut.cz
Subject: Testovaci e-mail: odezva formulare
From: info@tem.wz.cz

muj-mail - 147.32.162.58 - hokus - pokus

Porovnejte s textem php a vidíte, co jsem asi vyplnil.

Celý text odesílaného dopisu je tedy v php v jediné proměnné typu řetězec. Pokud víte, kde mají končit řádky, napište na tato místa znak \n . Připomínám, že tento apůsob funguje jedině tehdy, když řetězec je uveden mezi uvozovkami, mezi apostrofy by se jako nový řádek nepřeložil. \t je tabulátor. Pokud vzniká extra dlouhý text a nevešel by se na řádku, lze jej přerušit uvedením samostatného obráceného lomítka na konci řádku a psát na další. Je nutné si dát pozor, aby za obráceným lomítkem nebylo již vůbec nic (ani mezera, natož komentář), a na další řádce se musí začínat zcela zleva a bez uvedení dalších uvozovek. Osobně raději doporučuji napsat uvozovky, tečku jako znak sčítání řetězců, a pokračovat na další řádce dalšími uvozovkami - to by mělo jít bez obráceného lomítka.

Na některých serverech to při editaci přímo na webu bohužel činí zápis "\n" problémy; v tom případě je nutno soubor vytvořit lokálně (pozor na zakončení řádků - doporučuji použít pspad) a přenést pomocí ftp nebo scp protokolu. Totéž by se týkalo následující ukázky, která pochází ze serveru java.tatousek.cz (klikněte na "Archiv skriúptů"). Jedná se o odesílání souborů.

Zasílání souborů v příloze dopisu (v php):

<?php 
if ($_SERVER['REQUEST_METHOD'] != 'POST') { 
  header('Refresh: 0; URL=/index.html'); 
  exit; 
} 
$mailto   = 'name@yourdomain.com'; 
$subject  = 'Feedback form'; 
$message  = 'Values submitted from web site form:'; 
$max_size = 1024*1024; 
$eol      = "\n"; 

# No edits beyond this line 
$pattern  = '/^([0-9a-z]([-.\w]*[0-9a-z])*@(([0-9a-z])+([-\w]*[0-9a-z])*\.)+[a-z]{2,6})$/i'; 
$boundary = md5(uniqid(time())); 
foreach ($_POST as $key => $value) { 
  if (!is_array($value)) { 
    $message .= $eol.$key.' : '.$value; 
  } 
  else { 
    foreach ($_POST[$key] as $itemvalue) { 
      $message .= $eol.$key.' : '.$itemvalue; 
    } 
  } 
} 
$email = isset($_POST['email']) ? $_POST['email'] : $mailto; 
$email = preg_match($pattern,$email) ? $email : $mailto; 
$headers  = 'From: '.$email.$eol; 
$headers .= 'Reply-To: '.$email.$eol; 
$headers .= 'MIME-Version: 1.0'.$eol; 
$headers .= 'Content-Type: multipart/mixed; boundary="'.$boundary.'"'.$eol; 
$body  = 'This is a multi-part message in MIME format.'.$eol.$eol; 
$body .= '--'.$boundary.$eol; 
$body .= 'Content-Type: text/plain; charset=iso-8859-1'.$eol; 
$body .= 'Content-Transfer-Encoding: 8bit'.$eol; 
$body .= $eol.stripslashes($message).$eol; 
foreach ($_FILES['userfile']['error'] as $i => $error) { 
  if ($error == 0 && $_FILES['userfile']['size'][$i] <= $max_size) { 
    $body .= '--'.$boundary.$eol; 
    $body .= 'Content-Type: '.$_FILES['userfile']['type'][$i].'; name='.$_FILES['userfile']['name'][$i].$eol; 
    $body .= 'Content-Transfer-Encoding: base64'.$eol; 
    $body .= 'Content-Disposition: attachment; filename='.$_FILES['userfile']['name'][$i].$eol; 
    $body .= $eol.chunk_split(base64_encode(file_get_contents($_FILES['userfile']['tmp_name'][$i]))).$eol; 
    $attached[] = $_FILES['userfile']['name'][$i]; 
  } 
} 
$body .= '--'.$boundary.'--'.$eol; 
mail($mailto,$subject,$body,$headers) or exit('Fatal Mail Error!'); 
?>

Budou doplněny komentáře, neověřeno.

V naší aplikaci je typické odeslání dopisu při registraci pro ověření identity nově registrovaného účastníka - uživatel dostane e-mailem stránku s odkazem s metodou GET, obsahující jako parametr náhodně vygenerované číslo, které je současně vyplněno do tabulky dočasných registrací.