Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: FormMail / lomakekäsittelijä

Sivun loppuun

hmmp [17.08.2005 21:35:06]

#

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>

arcatan [18.08.2005 15:56:59]

#

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.

hmmp [18.08.2005 16:07:29]

#

Jeps, varmempi keino olisi tallentaa aikatieto ja IP-osoite palvelimella olevaan tiedostoon. Täytyy katsoa, josko tuota jaksaisi/ehtisi muuttaa sillä tavalla.

Tuplanolla [18.08.2005 20:03:50]

#

Ei toimi ei.
Olisi myös hyvä jos voisi valita minne viestin lähettää, ja valita oman prefixin ja postfixin (alku ja loppu).

hmmp [18.08.2005 21:02:35]

#

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>

JoniRautiainen [10.09.2005 11:17:13]

#

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

miiro [13.09.2005 15:37:03]

#

Onkos sulla postiasetukset oikein?

miiro [13.09.2005 15:39:55]

#

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 :)

Heino [20.10.2005 15:49:09]

#

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?

hmmp [01.12.2005 13:45:01]

#

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.

bujars [22.04.2010 08:28:20]

#

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ä?

ErroR++ [04.07.2011 18:12:33]

#

Hyvä että oli kommentoimatonkin juttu!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta