Putkassa on jo ennestään pari formmaileria, mutta kun ne eivät olleet tarpeisiini sopivia, niin väsäsin oman. :-)
Lyhyesti kerrottuna ohjelma välittää www-lomakkeella lähetetyt tiedot haluttuun sähköpostiosoitteeseen. Www-lomakkeen kentät voi nimetä vapaasti lukuunottamatta seuraavia:
- email = viestin lähettäjän s-postiosoite
- subject = lähetettävän sähköpostin otsikko
- recipient = viestin vastaanottajan sähköpostiosoite
- redirect = osoite, johon mennään viestin lähettämisen jälkeen
Spämmääjien ja muiden kiusanhenkien takia tehdään muutamia tarkistuksia:
- Vastaanottajan s-postiosoitteen on oltava sallittujen joukossa ($allowed_emails)
- Vain yhden viestin voi lähettää kymmenessä minuutissa
- Viesti ei saa olla tyhjä
- Viestin pituus ei saa olla yli 50000 merkkiä
Lisäksi lomakkeen hidden-kenttään laitettavan sähköpostiosoitteen voi sotkea spämmiestoilla kuten "EIROSKAA", "NOSPAM" tms, katso $spam_blocks. Paras suoja vastaanotto-osoitteelle saadaan kuitenkin laittamalla se php-koodiin $myemail-muuttujaan. Tällöin jos lomakedata ei sisällä vastaanottajan s-postiosoitetta, käytetäään $myemail:ia.
Jos skriptiä haluaa vielä parantaa, niin aikatiedon voisi tallentaa tiedostoon sessionin sijasta. Sessionit kun voi helposti ottaa selaimesta pois käytöstä.
Alla kommentoitu ja kommentoimaton versio. Jos tuon ottaa käyttöön, kannattaa tietysti käyttää kommentoimatonta versiota, niin ohjelma toimii silmänräpäyksen nopeammin... ;-)
lomake.php / kommentoitu
<?php session_start(); // Vastaanottajan s-posti, jos osoitetta ei määritellä lomakkeessa $myemail = "nimi@domain.fi"; // Sallitut sähköpostiosoitteet, jos vastaanottajan s-posti määritelläään lomakkeessa $allowed_emails = array("@domain.fi","@domain.net"); // Spämmiestot, joita voidaan käyttää, jos osoite annetaan lomakkeessa $spam_blocks = array("EIROSKAA","NOSPAM"); // Tarkistetaan, että mahdollisesta edellisestä lähetyksestä on kulunut vaadittu aika if (isset($_SESSION["form_time"]) and $_SESSION["form_time"] > time()) die ("Virhe: Roskapostittamisen estämiseksi on sallittua lähettää vain yksi viesti per 10 minuuttia."); // Jos lomakedataa löytyy, otetaan se talteen if (isset($_POST)) $data = $_POST; elseif (isset($HTTP_POST_VARS)) $data = $HTTP_POST_VARS; // Jos lomakedataa ei löydy, annetaan huutia if ((!isset($_POST) and !isset($HTTP_POST_VARS)) or count($data) == 0) die ("Virhe: Lomakedataa ei löytynyt."); // Käydään lomakedatan sisältävä taulukko läpi foreach($data as $key => $value) { // Vastaanottajan email if($key == "recipient") { $recipient = $value; // Poistetaan spämmiestot foreach ($spam_blocks as $array) $recipient = str_replace($array, "", $recipient); // Tarkistetaan että osoite on sallittujen joukossa if (!in_array(strchr($recipient,"@"),$allowed_emails)) die ("Virhe: Vastaanottajan sähköpostiosoite ei ole sallittujen osoitteiden joukossa."); } // Lähettäjän email elseif($key == "email") $email = $value; // Viestin otsikko elseif($key == "subject") $subject= $value; // Uudelleenohjauksen (esim. kiitos-sivun) osoite elseif($key == "redirect") $redirect = $value; // Otetaan muut lomakkeessa määritellyt kentät yhteen pötköön elseif ($value != "") $msg .= "$key: ". chr(13). chr(10) ."$value\n\n"; // Tarkistetaan, ettei viestistä tule liian pitkä if (strlen($msg) > 50000) die ("Virhe: Viesti on liian pitkä (yli 50000 merkkiä)."); } // Tarkistetaan, että viestissä on jotain sisältöä if ($msg == "") die ("Virhe: Lähetit tyhjän lomakkeen."); // Laitetaan tekstiä viestin alkuun ja lähettäjän ip-numero loppuun else $msg = "WWW-LOMAKKEELLA LÄHETETYT TIEDOT: \n\n" . $msg . "Lähettäjän IP-numero: " . getenv("REMOTE_ADDR"); // Jos vastaanottajaa ei ole annettu lomaketiedoissa, käytetään $myemail-osoitetta if (!isset($recipient) and $myemail != "") $recipient = $myemail; // Tarkistetaan, että vastaanottaja löytyy if (isset($recipient)) { // Lähetetään viesti mail ($recipient, $subject, $msg, "From: ". $email); // Laitetaan sessioniin lähetysaika + 10 min $_SESSION["form_time"] = time() + 60 * 10; // Uudelleenohjaus määritettyyn osoitteeseen tai kuittausviestin tulostus if (isset($redirect)) header("Location: $redirect"); else print "Viestisi on lähetetty. Kiitos yhteydenotosta."; } else die ("Virhe: Vastaanottajan sähköpostiosoite puuttuu."); ?>
lomake.php / kommentoimaton
<?php session_start(); $myemail = "nimi@domain.fi"; $allowed_emails = array("@domain.fi","@domain.net"); $spam_blocks = array("EIROSKAA","NOSPAM"); if (isset($_SESSION["form_time"]) and $_SESSION["form_time"] > time()) die ("Virhe: Roskapostittamisen estämiseksi on sallittua lähettää vain yksi viesti per 10 minuuttia."); if (isset($_POST)) $data = $_POST; elseif (isset($HTTP_POST_VARS)) $data = $HTTP_POST_VARS; if ((!isset($_POST) and !isset($HTTP_POST_VARS)) or count($data) == 0) die ("Virhe: Lomakedataa ei löytynyt."); foreach($data as $key => $value) { if($key == "recipient") { $recipient = $value; foreach ($spam_blocks as $array) $recipient = str_replace($array, "", $recipient); if (!in_array(strchr($recipient,"@"),$allowed_emails)) die ("Virhe: Vastaanottajan sähköpostiosoite ei ole sallittujen osoitteiden joukossa."); } elseif($key == "email") $email = $value; elseif($key == "subject") $subject= $value; elseif($key == "redirect") $redirect = $value; elseif ($value != "") $msg .= "$key: ". chr(13). chr(10) ."$value\n\n"; if (strlen($msg) > 50000) die ("Virhe: Viesti on liian pitkä (yli 50000 merkkiä)."); } if ($msg == "") die ("Virhe: Lähetit tyhjän lomakkeen."); else $msg = "WWW-LOMAKKEELLA LÄHETETYT TIEDOT: \n\n" . $msg . "Lähettäjän IP-numero: " . getenv("REMOTE_ADDR"); if (!isset($recipient) and $myemail != "") $recipient = $myemail; if (isset($recipient)) { mail ($recipient, $subject, $msg, "From: ". $email); $_SESSION["form_time"] = time() + 60 * 10; if (isset($redirect)) header("Location: $redirect"); else print "Viestisi on lähetetty. Kiitos yhteydenotosta."; } else die ("Virhe: Vastaanottajan sähköpostiosoite puuttuu."); ?>
HTML-lomakkeen esimerkki:
<form method="post" action="lomake.php"> <input type="hidden" name="recipient" value="vastaanottajaEIROSKAA@domain.fi"> <input type="hidden" name="subject" value="Viesti palautelomakkeesta"> <input type="hidden" name="redirect" value="kiitos.html"> <b>Nimi:</b><br> <input type="text" name="Nimi"> <p> <b>Sähköpostiosoite:</b><br> <input type="text" name="email"> <p> <b>Viesti:</b><br> <textarea name="Viesti"></textarea> <p> <input type="submit" value="Lähetä"> </form>
Väittäisin, että tuo roskapostituksen esto ei oikein toimi. Tuskinpa kukaan roskapostittaja kuitenkaan mitään sessio-keksejä tallentaa. IP-pohjaisesta systeemistä saattaisi olla jotain iloa.
Jeps, varmempi keino olisi tallentaa aikatieto ja IP-osoite palvelimella olevaan tiedostoon. Täytyy katsoa, josko tuota jaksaisi/ehtisi muuttaa sillä tavalla.
Ei toimi ei.
Olisi myös hyvä jos voisi valita minne viestin lähettää, ja valita oman prefixin ja postfixin (alku ja loppu).
Tuota voi tietysti jokainen muokata kuten haluaa. Prefixin ja postfixin lisäämisessä ei luulisi olevan kenellekään putkalaisella ongelmia.
Mitä tarkoitat, että voisi valita, minne viestin lähettää? Sehän onnistuu helposti, kun laittaa vaihtehtoiset vastaanottajat lomakkeeseen select-valintaan tähän tapaan:
<select name="recipient"> <option value="osoite1@domain.fi">Vastaanottaja 1</option> <option value="osoite2@domain.fi">Vastaanottaja 2</option> <option value="osoite3@domain.fi">Vastaanottaja 3</option> </select>
miksi kone sanoo näin
Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\Documents and Settings\Joni Rautiainen\Omat tiedostot\My Web Sites\bar.php on line 72
Onkos sulla postiasetukset oikein?
lainaus:
Prefixin ja postfixin lisäämisessä ei luulisi olevan kenellekään putkalaisella ongelmia.
Hyvinkin, jos ei osaa kovin hyvin php:tä kuten en minäkään osaa. Mallia katsomatta en osaa käyttää kuin echoa ja includea :)
Neuvokaas aloittelijaa! Siis mitkä osat noista pitää tallentaa ja mihin jos haluan lähetettävän lomakkeen missä saa valita vastaanottajan.niin ja mitkä kohdat sitten pitää muuttaa?
Aloittelijoille vinkkinä, että ohjelmointiputkasta löytyy muutamia alkeisoppaita taitojen kartuttamiseen.. Jos ei aiemmin ole tehnyt mitään PHP:llä, niin ei varmaan kannata aloittaa edes näin monimutkaisista koodeista.
Minulla on seurava ongelma: Aina tule virhe kun yritä lähetä kommentin " Virhe: Vastaanottajan sähköpostiosoite ei ole sallittujen osoitteiden joukossa." voiko tämän joten poista että kaikki voisivat lähettä?
Hyvä että oli kommentoimatonkin juttu!
Aihe on jo aika vanha, joten et voi enää vastata siihen.