<?php

// formmail.php - http://h2o.ch/php/
// junya keller - 20050809 - gpl

// please customize
$realnameto=''// real name of recipient, e.g. 'John Wayne' or 'Wayne, John'
$mailto='';     // address of recipient, e.g. 'mail@example.com'
$errmailto='';  // address of webmaster, e.g. 'webmaster@example.com'
$subject='Formmail '.$_SERVER['HTTP_HOST']; // Subject, e.g. 'Formmail host.example.com'
$rmemailheaderchars=""// change to "\r" if from header appears in mail body
$rmemailbodychars="";   // change to "\r" if newline appears twice in mail body

$mailfrom='';
$realnamefrom='';
$text='';
$validemailchars='A-Za-z0-9!#$%&\'()*+-.\/:=?@^_`{|}~';
$validrealnamechars='<>, '.$validemailchars;
$validsubjectchars=$validrealnamechars;
$validtextchars=$validrealnamechars."\n\r\t";
$quoterealnamechars='<>@,';
$submit=0;

// get form input
$error='';
while(list(
$name,$value)=each($_POST)) {
  
$value=stripslashes($value);
  if (
$name=='name') {
    
$realnamefrom=$value;
  }
  if (
$name=='email') {
    
$mailfrom=$value;
  }
  if (
$name=='subject') {
    
$subject=$value;
  }
  if (
$name=='text') {
    
$submit=1;
    
$text=$value;
  }
}

// check input
if (!ereg("^[$validrealnamechars]*$",$realnamefrom)) {
  
$realnamefrom=ereg_replace("[^$validrealnamechars]",'',$realnamefrom);
  
$error.="warning: removed invalid chars in name!<br>\n";
}
if (!
ereg("^[$validemailchars]*$",$mailfrom)) {
  
$mailfrom=ereg_replace("[^$validemailchars]",'',$mailfrom);
  
$error.="warning: removed invalid chars in e-mail!<br>\n";
}
if (!
ereg("^[$validemailchars]+@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,6})$",$mailfrom)) {
  
$error.="error: e-mail is invalid!<br>\n";
}
if (!
ereg("^[$validsubjectchars]*$",$subject)) {
  
$subject=ereg_replace("[^$validsubjectchars]",'',$subject);
  
$error.="warning: removed invalid chars in subject!<br>\n";
}
if (!
ereg("^[$validtextchars]*$",$text)) {
  
$text=ereg_replace("[^$validtextchars]",'',$text);
  
$error.="warning: removed invalid chars in text!<br>\n";
}
if (!
ereg("^[$validrealnamechars]*$",$realnameto)) {
  
$error.="error: recipient name contains invalid chars! please contact the <a href=\"mailto:".$errmailto."\">webmaster</a><br>\n";
}
if (!
ereg("^[$validemailchars]+@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,4})$",$mailto)) {
  
$error.="error: recipient email is invalid! please contact the <a href=\"mailto:".$errmailto."\">webmaster</a><br>\n";
}

// output form
if (($submit==0) or ($error<>'')) {
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <title>Formmail</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <style type="text/css">
    div.error {color: red;}
  </style>
</head>
<body>
<form method="post">
  <table>
  <tr>
    <td>Name </td>
    <td><input type="text" name="name" size="40" value="<?php echo "$realnamefrom"?>" /></td>
  </tr>
  <tr>
    <td>E-mail </td>
    <td><input type="text" name="email" size="40" value="<?php echo "$mailfrom"?>" /></td>
  </tr>
  <tr>
    <td>Subject </td>
    <td><input type="text" name="subject" size="40" value="<?php echo "$subject"?>" /></td>
  </tr>
  </table>
  <textarea name="text" rows="5" cols="62"><?php echo $text?></textarea><br>
<?php
  
if (($submit==1) and ($error<>'')) {
    echo 
'<div class="error">'.$error."</div>\n";
  }
?>
  <input type="submit" value="Send" />
</form>
</body>
</html>
<?php
} else {

// quote realname if needed
  
if (ereg("[$quoterealnamechars]",$realnamefrom)) {
    
$realnamefrom="\"$realnamefrom\"";
  }
  if (
ereg("[$quoterealnamechars]",$realnameto)) {
    
$realnameto="\"$realnameto\"";
  }
  if (
$realnamefrom<>'') {
    
$realnamefrom.=" ";
  }
  if (
$realnameto<>'') {
    
$realnameto.=" ";
  }

// build headers
  
$headers="X-Formmailer: from ".$_SERVER['REMOTE_ADDR']." by ".$_SERVER['SERVER_ADDR'].":".$_SERVER["SERVER_PORT"]." (".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"].")\r\nFrom: $realnamefrom<$mailfrom>";

// remove chars
  
if ($rmemailheaderchars<>'') {
    
$headers=ereg_replace("[$rmemailheaderchars]",'',$headers);
  }
  if (
$rmemailbodychars<>'') {
    
$text=ereg_replace("[$rmemailbodychars]",'',$text);
  }

// send mail
  
mail("$realnameto<$mailto>",$subject,$text,$headers,"-f" $errmailto);

// output sent message
  
$textout="Subject: ".$subject."\n".$headers."\n\n".$text;
  
$textout=ereg_replace("\r\n","\n",$textout);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Formmail</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" link="#003399" vlink="#003399" alink="#003399">
<p>Thank you! Following e-mail has been sent:</p>
<table border="1"><tr><td>
<?php
  
echo ereg_replace("\n","<br>\n",htmlentities($textout));
?></td></tr></table>
</body>
</html>
<?php
}

// history:
// jk/20050809 - initial release
// jk/20070305 - added additional headers, corrected character handling
// jk/20070306 - removes invalid characters, added 6 character tld support
// jk/20070917 - XSS problem solved in subject and text + minor bugfixes
// jk/20080804 - modified character class
// jk/20090415 - modified $validtextchars
//             - chars removable in mail header and body
// jk/20091031 - minor bugfix
?>