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í.