<?php
////////////////////////////////////////////////
/// Contact formulier met formherhaling
/// Gemaakt door Sebazzz
/// xhtml compatible
///////////////////////////////////////////
//output buffering aanzetten om leuke errors te verhelpen/voorkomen
ob_start();
//headers alvast instellen
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
/////////////////////////////////////////////////////
/// Variablen die ingesteld moeten worden
/////////////////////////////////////////////////////
// Maanden, hoef je eigen niks aan te wijzigen, tenzij je
// natuurlijk de maanden in het engels wil ontvangen
$SETTINGS['maanden'] = array(
'01' => 'Januari',
'02' => 'Februari',
'03' => 'Maart',
'04' => 'April',
'05' => 'Mei',
'06' => 'Juni',
'07' => 'Juli',
'08' => 'Augustus',
'09' => 'September',
'10' => 'Oktober',
'11' => 'November',
'12' => 'December'
);
// email adres(sen) waar het naartoe moet
// naam_van_persoon => email adres
$SETTINGS['emails'] = array('Ik' => 'ik@jij.nl',
'Hij' => 'Hij@zij.com',
'Bin laden' => 'b.laden@alquada.ak',
'Bush' => 'bush@whitehouse.gov',
);
//standaard persoon die aangekruist staat (email adres)
$SETTINGS['stdmail'] = 'Ik';
//onderwerpen gebruiken?
//true / false
$SETTINGS['do_onderwerpen'] = true;
//welke onderwerpen?
// id => onderwerp
$SETTINGS['onderwerpen'] = array(1 => 'Suggesie',
2 => 'Klacht',
3 => 'Ideëen',
4 => 'Vraag',
);
//wat is het standaard onderwerp
// $SETTINGS['onderwerpen'][ id_van onderwerp ]
$SETTINGS['stdsub'] = $SETTINGS['onderwerpen'][4];
// html email of plain text? kies uit:
// text/html - text/plain
$SETTINGS['mime'] = 'text/html';
//datum formaat volgens php's date() functie
$SETTINGS['datum_formaat'] = 'd-m-Y H:i:s';
//tijdzone waar je in zit
$SETTINGS['timezone'] = 1;
//STA, Server Time Adjustment in minuten. Zegt het al...
$SETTINGS['adjustment'] = 0;
//input: minimale en maximale string lengte van naam?
$SETTINGS['naam_min'] = 3;
$SETTINGS['naam_max'] = 20;
//input: minimale en maximale string lengte van titel?
$SETTINGS['titel_min'] = 4;
$SETTINGS['titel_max'] = 40;
//input: minimale en maximale string lengte van titel?
$SETTINGS['email_min'] = 4;
$SETTINGS['email_max'] = 40;
//input: minimale en maximale string lengte van bericht? maximale woord lengte?
$SETTINGS['bericht_min'] = 20;
$SETTINGS['bericht_max'] = 10000;
$SETTINGS['bericht_wmx'] = 50;
//bericht dat weergegeven wordt bovenaan het formulier, html ingeschakelt
//hoeft er niks? laat dan staan
$SETTINGS['bericht_top'] = ' <span style="font-weight:bold;">Test formulier script</span> ';
//bericht dat weergegeven wordt nadat het emailtje successvol is verzonden
$SETTINGS['bericht_suc'] = 'Bedankt voor het versturen van een e-mail.';
$SETTINGS['bericht_suc'] .= 'Je zult snel een antwoord krijgen indien nodig. <br />';
$SETTINGS['bericht_suc'] .= 'We gaan vertroiuwelijk om met de informatie en ';
$SETTINGS['bericht_suc'] .= 'je email adres zal nooit aan derden worden gegeven.';
//kijken voor een geldige email adres? true voor ja, false voor nee
$SETTINGS['email_check'] = true;
//foutmelding om te weergeven als het verzenden van
//de email niet is gelukt(dus als mail() FALSE geeft)
//html ingeschakelt
$SETTINGS['no_email'] = 'Er is een foutje opgetreden waardoor het email verzenden is mislukt...';
//foutmelding om te weergeven als degene al een emailtje heeft verzonden. html ingeschakelt
$SETTINGS['error_spam'] = 'Jij hebt al eens een emailtje gestuurd vandaag!';
//tijd wanneer het koekje beschimmeld raakt ( in andere taal: cookie verloop tijd)
$SETTINGS['expire_cookie'] = time() + (3600 * 24); //verloopt na een dag
/// niks meer te editen
// error reporting goed zetten
error_reporting(E_ALL ^ E_NOTICE);
//////////////////////////////
/// functies defineeren
////////////////////////////
function parse_incoming() {
////////////////////////////////////////////////
/// Deze functie geeft al het 'incoming' via
/// _POST en _GET terug. _POST heeft voorrang,
/// dus als een key in _GET al bestaat, wordt
/// de key overgeschreven
////////////////////////////////////////////////
/// array parse_incoming( void );
$return = array();
//eerst get,
foreach ($_GET as $k => $v) {
if (!is_array($v)) {
$return[ $k ] = clean_value($v);
}
}
//en dan post!
foreach ($_POST as $k => $v) {
if (!is_array($v)) {
$return[ $k ] = clean_value($v);
}
}
return $return;
}
function clean_value($val) {
global $site;
if ($val == "")
{
return "";
}
$val = str_replace( " ", " ", $val );
$val = str_replace( chr(0xCA), "", $val );
$val = str_replace( "&" , "&" , $val );
$val = str_replace( "<!--" , "<!--" , $val );
$val = str_replace( "-->" , "-->" , $val );
$val = preg_replace( "/<script/i" , "<script" , $val );
$val = str_replace( ">" , ">" , $val );
$val = str_replace( "<" , "<" , $val );
$val = str_replace( "\"" , """ , $val );
$val = preg_replace( "/\n/" , "<br>" , $val );
$val = preg_replace( "/\\\$/" , "$" , $val );
$val = preg_replace( "/\r/" , "" , $val );
$val = str_replace( "!" , "!" , $val );
$val = str_replace( "'" , "'" , $val );
$val = preg_replace("/&#([0-9]+);/s", "&#\\1;", $val );
$val = stripslashes($val);
$val = preg_replace( "/\\\(?!&#|\?#)/", "\", $val );
return $val;
}
function checkcookie() {
///////////////////////////////////////////////
/// Deze functie kijkt voor een cookie,
/// in dit geval of de gast al eens een
/// mailtje heeft gestuurd.
// geeft false voor ja, true voor nee
///////////////////////////////////////////////
/// boolean checkcookie( void );
if ($_COOKIE['sendmail'] == "yeah") {
return false;
}
return true;
}
function vervang_maand($datum) {
//////////////////////////////////////////////////
/// Deze functie gaat ervan uit dat $datum het
/// volgende datum formaat gebruikt:
/// d-m-Y H:i:xxxx
/// d/m/Y H:i:xxxx
/// d.m.y H:i:xxx
/// Je zou natuurlijk strftime() kunnen gebruiken
/// maar omdat we dan gebruik gaan maken van de
/// ingebakken taalpakketten van php en het kan
/// wel eens gebeuren dat men alleen engels
/// in die versie heeft gestopt en dus nederlands
/// niet ondersteund wordt.
////////////////////////////////////////////////
/// string vervang_maand(string date);
global $SETTINGS;
list($dag, $maand, $rest) = split('[/.-]', $datum);
foreach ($SETTINGS['maanden'] as $nummer => $naam) {
$maand = str_replace ($nummer, $naam, $maand);
}
$temp_array = array( $dag, $maand, $rest);
$datum = implode(" ", $temp_array);
return $datum;
}
function validate_email($input) {
///////////////////////////////////////
/// Kijkt of $input een geldig
/// email adres bevat
/////////////////////////////////////
/// boolean validate_email( string email );
if (!preg_match("/^[A-Za-z0-9._\-]+\@[A-Za-z0-9._\-]+\.[A-Za-z]{2,4}$/",$input)) {
return false;
}
return true;
}
function checkstring($input, $minstrlen = 3, $maxstrlen = 10000, $maxwordlen = 300) {
////////////////////////////////
/// Check $input string
/// Geeft false als het niet goed is
/// geeft true als de string $input
/// oke is
/////////////////////////////
/// boolean checkstring(string input, [int minimaal tekens, [int maximaal tekens, [int maximaal woord lengte]]]);
if (empty($input)) {
return false;
}
if (strlen($input) < $minstrlen) {
return false;
}
if (strlen($input) > $maxstrlen) {
return false;
}
$temp_array = explode(" ", $input);
foreach ($temp_array as $woord) {
if (strlen($woord) > $maxwordlen) {
return false;
}
}
return true;
}
function get_date($timezone = 1, $adjustment = 0) {
////////////////////////////////////////////////
/// Verkrijg de datum en tijd van een tijdzone
/////////////////////////////////////
/// string get_date( [int timezone, [int adjustment]] );
global $SETTINGS;
$adjustment = $adjustment / 60;
$date = gmdate($SETTINGS['datum_formaat'], time() + 3600*($adjustment + $timezone + date("I")));
return $date;
}
function show_form($naam = '', $email = '', $titel = '', $bericht = '', $error = false, $to = false, $onderwerp = false) {
///////////////////////////////////////////////
/// Laat formulier zien. Error als opgegeven
////////////////////////////////////////////////
/// void show_form( [string naam, [string email, [string titel, [string bericht, [string error]]]]] );
global $SETTINGS;
if ($error == false) {
$header = $SETTINGS['bericht_top'];
} else {
$header = '<span style="color:#FF0000;font-weight:bold;">'.$error.'</span>';
}
if ($to == false) {
$to = $SETTINGS['stdmail'];
}
if ($onderwerp == false) {
$onderwerp = $SETTINGS['stdsub'];
}
$t = $_SERVER['PHP_SELF'];
$s = explode("/", $_SERVER['PHP_SELF']);
$this_file = $s[ count($s) - 1 ];
echo '<form name="contact" action="'.$this_file.'" method="post">';
echo '<input type="hidden" name="ip" value="'.$_SERVER['REMOTE_ADDR'].'" />';
echo '<input type="hidden" name="act" value="dosend" />';
echo '<table>'; //hier kun je eventueel nog style info aan toevoegen
echo '<tr><td colspan="2" align="center">'.$header.'</td></tr>';
echo '<tr><td align="left" valign="top">Je naam:</td><td align="left"><input type="text" name="naam" value="'.$naam.'" size="75" maxlength="'.$SETTINGS['naam_max'].'" /></td></tr>';
echo '<tr><td align="left" valign="top">Je email:</td><td align="left"><input type="text" name="email" value="'.$email.'" size="75" maxlength="'.$SETTINGS['email_max'].'" /></td></tr>';
echo '<tr><td align="left" valign="top">Ontvanger:</td><td align="left">';
foreach ($SETTINGS['emails'] as $name => $adres) {
$name = htmlentities($name);
echo '<input type="radio" name="to" value="'.str_replace('_', ' ', $name).'" id="'.str_replace('_', ' ', $name).'" ';
if (strtolower($to) == strtolower($name)) {
echo 'checked="checked" ';
}
echo '/><label for="'.str_replace('_', ' ', $name).'">'.$name.'</label><br />';
}
print '</td></tr>';
if ($SETTINGS['do_onderwerpen'] == true) {
print '<tr><td align="left" valign="top">Onderwerp:</td>';
print '<td align="left"><select name="onderwerp">';
foreach ($SETTINGS['onderwerpen'] as $id => $sub) {
print '<option value="'.$id.'" ';
if ($sub == $onderwerp) {
print 'selected="selected"';
}
print '>'.htmlentities($sub).'</option>';
}
print '</select></td></tr>';
}
echo '<tr><td align="left" valign="top">Titel:</td><td align="left"><input type="text" name="titel" value="'.$titel.'" size="75" maxlength="'.$SETTINGS['titel_max'].'" /></td></tr>';
echo '<tr><td align="left" valign="top">Je bericht:</td><td align="left"><textarea name="bericht" cols="75" rows="7" wrap="soft">'.$bericht.'</textarea></td>';
echo '<tr><td align="center" colspan="2"><input type="submit" name="submit" value="Verzend email" /></td></tr>';
echo '</table></form>';
}
function sendmail($naam, $email, $titel, $bericht, $ip, $datum, $to, $onderwerp) {
//////////////////////////////////////////////
/// Stuurt emaitje. Gebruikt de $SETTINGS var
/// en geeft false als het niet lukt
/////////////////////////////////////////////
/// boolean sendmail( string naam, string email, string titel, string bericht, string ip);
global $SETTINGS;
$to = $SETTINGS['emails'][ str_replace(' ', '_', $to) ];
$sub = $SETTINGS['onderwerpen'][ $onderwerp ];
$subject = "Mailtje van je website - ".$naam.": ".$titel;
if ($SETTINGS['mime'] == "text/html") {
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$message = "<html><head>";
$message .= "</head><body>";
$message .= "Je hebt een emailtje gekregen van een gast van de website!<br /><br />";
$message .= "<table>";
$message .= "<tr><td>Naam:</td><td>".$naam."</td></tr>";
$message .= "<tr><td>Email:</td><td><a href=\"mailto:".$email."\">".$email."</a></td></tr>";
$message .= "<tr><td>Onderwerp:</td><td>".htmlentities($sub)."</td></tr>";
$message .= "<tr><td>Titel:</td><td>".$titel."</td></tr>";
$message .= "<tr><td>Bericht:</td><td>".$bericht."</td></tr>";
$message .= "<tr><td colspan=\"2\"> </td></tr>";
$message .= "<tr><td>Datum:</td><td>".vervang_maand($datum)."</td></tr>";
$message .= "<tr><td>Ip:</td><td><a href=\"http://sunny.nic.com/cgi-bin/whois\">".$ip."</a></td></tr>";
$message .= "</table></body></html>";
} else {
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";
$message = "==============================================\n";
$message .= "Emailtje van een gast van je website!\n";
$message .= "==============================================\n";
$message .= "\n";
$message .= "Naam:\n";
$message .= $naam."\n\n";
$message .= "Email:\n";
$message .= $email."\n\n";
$message .= "Onderwerp:\n";
$message .= $sub."\n\n";
$message .= "Titel:\n";
$message .= $titel."\n\n";
$message .= "Bericht:\n";
$message .= $bericht."\n\n";
$message .= "\n";
$message .= "Datum:\n";
$message .= vervang_maand($datum)."\n\n";
$message .= "Ip adres:\n";
$message .= $ip."\n\n";
}
$headers .= "From: Php automailer <{$email}>\r\n";
if (!mail($to, $subject, $message, $headers)) {
return false;
}
return true;
}
///////////////////////////
/// En nu het script.....
///////////////////////////
$IN = parse_incoming();
if (checkcookie()) {
if ($IN['act'] != 'dosend') {
show_form();
} else {
$err = false;
if (!checkstring($IN['naam'], $SETTINGS['naam_min'], $SETTINGS['naam_max'])) {
$err = 'Geen naam ingevoerd of je naam is te kort of te lang.';
} elseif (!checkstring($IN['email'], $SETTINGS['email_min'], $SETTINGS['email_max'])) {
$err = 'Geen email ingevoerd of je email is te kort of te lang.';
} elseif (!validate_email($IN['email']) && $SETTINGS['email_check'] == true) {
$err = 'Ongeldig email adres ingevoerd.';
} elseif (!checkstring($IN['titel'], $SETTINGS['titel_min'], $SETTINGS['titel_max'])) {
$err = 'Geen titel ingevoerd of je titel is te kort of te lang.';
} elseif (!checkstring($IN['bericht'], $SETTINGS['bericht_min'], $SETTINGS['bericht_max'])) {
$err = 'Geen bericht ingevoerd of je bericht is te kort of te lang.';
}
if ($err == false) {
$datum = get_date($SETTINGS['timezone'], $SETTINGS['adjustment']);
if (!sendmail($IN['naam'], $IN['email'], $IN['titel'], $IN['bericht'], $IN['ip'], $datum, $IN['to'], $IN['onderwerp'])) {
echo $SETTINGS['no_email'];
} else {
echo $SETTINGS['bericht_suc'];
setcookie('sendmail', "yeah", $SETTINGS['expire_cookie']);
}
} else {
show_form($IN['naam'], $IN['email'], $IN['titel'], $IN['bericht'], $err, $IN['to'], $IN['onderwerp']);
}
}
} else {
echo $SETTINGS['error_spam'];
}
//laten we nu maar alles outputten, het is genoeg
//geweest voor deze keer en er komen toch
//geen headers meer ^^
ob_end_flush();
?>