Solved

Need to Add Additional Input Fields to Simple PHP Mailer Form

Posted on 2011-09-12
2
481 Views
Last Modified: 2013-12-13
Right now the code below allows the user to enter his name, email and a message in a form.

Is there an easy way to add a number of other <input type="text" name="xxxxx"> fields and <select><option value="xxxxx"></option></select> fields to the code below:

<?php
/*
// This will show in the browsers title bar and at the top of the form.
$websitename="Your Website"; 

// Allowed file types. Please remember to keep the format of this array, add the file extensions you want
// WITHOUT the dot. Please also be aware that certain file types (such as exe) may contain malware.
$allowtypes=array("zip", "rar", "txt", "doc", "jpg", "png", "gif", "odt", "xml");

// What's your email address? Seperate email addresses with commas for multiple email addresses.
$myemail="ehop66@gmail.com";

// What priority should the script send the mail? 1 (Highest), 2 (High), 3 (Normal), 4 (Low), 5 (Lowest).
$priority="3"; 

// Should we allow visitors to attach files? How Many? 0 = Do not allow attachments,
// 1 = allow only 1 file to be attached, 2 = allow two files etc.
$allowattach="2"; 

// Maximum file size for attachments in KB NOT Bytes for simplicity. MAKE SURE your php.ini can handel it,
// post_max_size, upload_max_filesize, file_uploads, max_execution_time!
// 2048kb = 2MB,       1024kb = 1MB,     512kb = 1/2MB etc..
$max_file_size="1024";

// Maximum file size for all attachments combined in KB. MAKE SURE your php.ini can handel it,
// post_max_size, upload_max_filesize, file_uploads, max_execution_time!
// 2048kb = 2MB,       1024kb = 1MB,     512kb = 1/2MB etc..
$max_file_total="2048";

// Value for the Submit Button
$submitvalue=" Submit Form "; 

// Value for the Reset Button
$resetvalue=" Reset Form ";

// Default subject? This will be sent if the user does not type in a subject
$defaultsubject="Web Design Request Form"; 

// Because many requested it, this feature will add a drop down box for the user to select a array of
// subjects that you specify below. 
// True = Use this feature, False = do not use this feature
$use_subject_drop=false;

// This is an array of the email subjects the user can pick from. Make sure you keep the format of
// this array or you will get errors.
// Look at <http://novahq.net/forum/showthread.php?t=38718> for examples on how to use this feature.
$subjects=array("Department 1", "Department 2", "Department 3");

// This is an array of the email addresses for the array above. There must be an email FOR EACH
// array value specified above. You can have only 1 department if you want.
// YOU MUST HAVE THE SAME AMMOUNT OF $subjects and $emails or this WILL NOT work correctly!
// The emails also must be in order for what you specify above!
// Seperate email addresses by a comma to send an email to multiple addresses.
$emails=array("dept_1@domain.com", "dept_2@domain.com", "dept_3@domain.com");

// This is the message that is sent after the email has been sent. You can use html here.
// If you want to redirect users to another page on your website use this:
// <script type=\"text/javascript\">window.location=\"http://www.YOUR_URL.com/page.html\";</script>
$thanksmessage="Thank you! Your email has been sent, we will respond shortly."; 

/*
//================================================================================
* ! ATTENTION !
//================================================================================
: Don't edit below this line.
*/

// Function to get the extension of the uploaded file.
function get_ext($key) { 
      $key=strtolower(substr(strrchr($key, "."), 1));
      $key=str_replace("jpeg", "jpg", $key);
      return $key;
}

// Function used to attach files to the message
function phattach($file, $name, $boundary) {
      
      $fp=fopen($file, "r");
      $str=fread($fp, filesize($file));
      $str=chunk_split(base64_encode($str));
      $message="--".$boundary."\n";
      $message.="Content-Type: application/octet-stream; name=\"".$name."\"\n";
      $message.="Content-disposition: attachment; filename=\"".$name."\"\n"; 
      $message.="Content-Transfer-Encoding: base64\n";
      $message.="\n";
      $message.="$str\n";
      $message.="\n";

      return $message;
}

//Little bit of security from people forging headers. People are mean sometimes :(
function clean_msg($key) {
      $key=str_replace("\r", "", $key);
      $key=str_replace("\n", "", $key);
      $find=array(
            "/bcc\:/i",
            "/Content\-Type\:/i",
            "/Mime\-Type\:/i",
            "/cc\:/i",
            "/to\:/i"
      );
  $key=preg_replace($find, "", $key);
  return $key;
}

// Initilize some variables
$error="";
$sent_mail=false;

// When the form is submitted
If($_POST['submit']==true) {
      extract($_POST, EXTR_SKIP);

            // Check the form for errors
            If(trim($yourname)=="") { 
                  $error.="You did not enter your name!<br />";
            }
            
            If(trim($youremail)=="") { 
                  $error.="You did not enter your email!<br />";
            } Elseif(!preg_match("/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/", $youremail)) {
                  $error.="Invalid email address.<br />";
            }

            If(trim($emailsubject)=="") {
                  $emailsubject=$defaultsubject;
            }

            If(trim($yourmessage)=="") { 
                  $error.="You did not enter a message!<br />";
            }
            
            // Verify Attchment info
            If($allowattach > 0) {
                  
                  // Get the total size of all uploaded files
                  If((array_sum($_FILES['attachment']['size'])) > ($max_file_total*1024)) {
                        
                        $error.="The max size allowed for all your files is ".$max_file_total."kb<br />";
                        
                  } Else {

                        //Loop through each of the files
                        For($i=0; $i <= $allowattach-1; $i++) {
                              
                              If($_FILES['attachment']['name'][$i]) {
      
                                    //Check if the file type uploaded is a valid file type. 
                                    If(!in_array(get_ext($_FILES['attachment']['name'][$i]), $allowtypes)) {
                                          
                                          $error.= "Invalid file type for your file: ".$_FILES['attachment']['name'][$i]."<br />";
                                          
                                    //Check the size of each file
                                    } Elseif(($_FILES['attachment']['size'][$i]) > ($max_file_size*1024)) {
                                          
                                          $error.= "Your file: ".$_FILES['attachment']['name'][$i]." is to big.<br />";
                                          
                                    } // If in_array
                                    
                              } // If Files
                              
                        } // For
                        
                  } // Else array_sum($_FILES['attachment']['size'])
                  
            } // If Allowattach

      If($error) {
      
            $display_message=$error;

      } Else {
            
            If($use_subject_drop AND is_array($subjects) AND is_array($emails)) {
                  $subject_count=count($subjects);
                  $email_count=count($emails);
                  
                  If($subject_count==$email_count) {
                        
                        $myemail=$emails[$emailsubject];
                        $emailsubject=$subjects[$emailsubject];

                  } // If $subject_count
                  
            } // If $use_subject_drop

            $boundary=md5(uniqid(time()));
            
            //Headers
            $headers="Return-Path: <".clean_msg($youremail).">\n";
            $headers.="From: ".clean_msg($yourname)." <".clean_msg($youremail).">\n";
            $headers.="X-Mailer: PHP/".phpversion()."\n";
            $headers.="X-Sender: ".$_SERVER['REMOTE_ADDR']."\n";
            $headers.="X-Priority: ".$priority."\n"; 
            $headers.="MIME-Version: 1.0\n";
            $headers.="Content-Type: multipart/mixed; boundary=\"".$boundary."\"\n";
            $headers.="This is a multi-part message in MIME format.\n";

            //Message
            $message = "--".$boundary."\n";
            $message.="Content-Type: text/html; charset=\"iso-8859-1\"\n";
            $message.="Content-Transfer-Encoding: quoted-printable\n";
            $message.="\n";
            $message.=clean_msg(nl2br(strip_tags($yourmessage)));
            $message.="\n";

            //Add attachments to message
            If($allowattach > 0) {
                  
                  For($i=0; $i <= $allowattach-1; $i++) {
                        
                        If($_FILES['attachment']['tmp_name'][$i]) {
                              
                              $message.=phattach($_FILES['attachment']['tmp_name'][$i], $_FILES['attachment']['name'][$i], $boundary);
                              
                        } //If $_FILES['attachment']['name'][$i]
                        
                  } //For
                  
            } // If
            
            // End the message
            $message.="--".$boundary."--\n";
            
            // Send the completed message
            If(!mail($myemail, clean_msg($emailsubject), $message, $headers)) {
                  
                  Exit("An error has occured, please report this to the website administrator.\n");
                  
            } Else {
            
                  $sent_mail=true;
                  
            }

      } // Else

} // $_POST

/*
//================================================================================
* Start the form layout
//================================================================================
:- Use the html below to customize the form.
*/
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Language" content="en-us" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><?php echo $websitename; ?> - Powered By phMailer</title>

<style type="text/css">
      body{
            background-color:#FFFFFF;
            font-family: Verdana, Arial, sans-serif;
            font-size: 12pt;
            color: #000000;
      }
      
      .error_message{
            font-family: Verdana, Arial, sans-serif;
            font-size: 11pt;
            color: #FF0000;
      }
      
      .thanks_message{
            font-family: Verdana, Arial, sans-serif;
            font-size: 11pt;
            color: #000000;
      }
      
      a:link{
            text-decoration:none;
            color: #000000;
      }
      a:visited{
            text-decoration:none;
            color: #000000;
      }
      a:hover{
            text-decoration:none;
            color: #000000;
      }
      
      .table {
            border-collapse:collapse;
            border:1px solid #000000;
            width:500px;
      }
      
      .table_header{
            border:1px solid #070707;
            background-color:#C03738;
            font-family: Verdana, Arial, sans-serif;
            font-size: 11pt;
            font-weight:bold;
            color: #FFFFFF;
            text-align:center;
            padding:2px;
      }
      
      .attach_info{
            border:1px solid #070707;
            background-color:#EBEBEB;
            font-family: Verdana, Arial, sans-serif;
            font-size: 8pt;
            color: #000000;
            padding:4px;
      }
      
      
      .table_body{
            border:1px solid #070707;
            background-color:#EBEBEB;
            font-family: Verdana, Arial, sans-serif;
            font-size: 10pt;
            color: #000000;
            padding:2px;
      }
      
      .table_footer{
            border:1px solid #070707;
            background-color:#C03738;
            text-align:center;
            padding:2px;
      }
      
      input,select,textarea {
            font-family: Verdana, Arial, sans-serif;
            font-size: 10pt;
            color: #000000;
            background-color:#AFAEAE;
            border:1px solid #000000;
      }
      
      .copyright {
            border:0px;
            font-family: Verdana, Arial, sans-serif;
            font-size: 9pt;
            color: #000000;
            text-align:right;
      }
      
      form{
            padding:0px;
            margin:0px;
      }
</style>

<script type="text/javascript">
var error="";
e_regex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/;

function Checkit(theform) {
      if(theform.yourname.value=="") {
            error+="You did not enter your name\n";
      }
      
      if(theform.youremail.value=="") {
            error+="You did not enter your email\n";
      } else if(!e_regex.test(theform.youremail.value)) {
            error+="Invalid email address\n";
      }
            
      if(theform.yourmessage.value=="") {
            error+="You did not enter your message\n";
      }
      
      if(error) {
            alert('**The form returned the following errors:**\n\n' + error);
            error="";
            return false;
      } else {
            return true;
      }
}
</script>

</head>
<body>
<?If($display_message) {?>

<div align="center" class="error_message"><b><?=$display_message;?></b></div>
<br />

<?}?>

<?If($sent_mail!=true) {?>

<form method="post" action="<?=$_SERVER['PHP_SELF'];?>" enctype="multipart/form-data" name="phmailer" onsubmit="return Checkit(this);">
<table align="center" class="table">
      <tr>
            <td colspan="2" class="table_header" width="100%"><?=$websitename;?></td>
      </tr>
      <?If($allowattach > 0) {?>
            <tr>
                  <td width="100%" class="attach_info" colspan="2">
                        <b>Valid Attachment Types:</b> <?=implode($allowtypes, ", ");?><br />
                        <b>Max size per file:</b> <?=$max_file_size?>kb.<br />
                        <b>Max combined file size:</b> <?=$max_file_total?>kb.
                  </td>
            </tr>
      <?}?>
      
      
                  <tr>
                        <td align="right" valign="top"><span style="font-weight:bold;">Your Name</span><span style="color:#AAAAAA;">&nbsp;&#151;&nbsp;</span></td><td align="left"><input type="text" name="yourname" onChange="toProper(this)" type="text" style="font-family:Segoe UI,Calibri,Verdana,Tahoma,Arial,sans-serif;font-size:15px;color:#666666;width:300px;"></td>
                  </tr>
                  <tr>
                        <td align="right" valign="top"><span style="font-weight:bold;">Your Email Address</span><span style="color:#AAAAAA;">&nbsp;&#151;&nbsp;</span></td><td align="left"><input type="text" name="youremail" onBlur="javascript:this.value=this.value.toLowerCase();this.value=correctit(this.value);" id="email" style="font-family:Segoe UI,Calibri,Verdana,Tahoma,Arial,sans-serif;font-size:15px;color:#666666;width:300px;"></td>
                  </tr>
                  <tr>
                        <td align="right" valign="top"><span style="font-weight:bold;">Your Telephone Number</span><span style="color:#AAAAAA;">&nbsp;&#151;&nbsp;</span></td><td align="left"><input type="text" name="yourtelephone" style="font-family:Segoe UI,Calibri,Verdana,Tahoma,Arial,sans-serif;font-size:15px;color:#666666;width:300px;"></td>
                  </tr>
                  
                  
                  
            
                  <?If($use_subject_drop AND is_array($subjects)) {?>
                              <select name="emailsubject" size="1">
                                    <?while(list($key,$val)=each($subjects)) {?>

                                          <option value="<?=intval($key);?>"><?=htmlspecialchars(stripslashes($val));?></option>
                                    
                                    <?}?>
                              </select>
                        
                  
                  <?} Else {?>
                        
                        <input name="emailsubject" type="text" size="30" value="<?=stripslashes(htmlspecialchars($emailsubject));?>" />
                        
                  <?}?>

      <?For($i=1;$i <= $allowattach; $i++) {?>
            <tr>
                  <td width="30%" class="table_body">Attach File:</td>
                  <td width="70%" class="table_body"><input name="attachment[]" type="file" size="30" /></td>
            </tr>
      <?}?>
      
      <tr>
            <td colspan="2" width="100%" class="table_body">Your Message:<span class="error_message">*</span><br />
                  <div align="center">
                        <textarea name="yourmessage" rows="8" cols="60"><?=stripslashes(htmlspecialchars($yourmessage));?></textarea>
                  </div>
            </td>
      </tr>
      <tr>
            <td colspan="2" width="100%" class="table_footer">
                  <input type="hidden" name="submit" value="true" />
                  <input type="submit" value="<?=$submitvalue;?>" /> &nbsp;
                  <input type="reset" value="<?=$resetvalue;?>" />
            </td>
      </tr>
</table>
</form>

<?} Else {?>

      <div align="center" class="thanks_message"><?=$thanksmessage;?></div>
      <br />
      <br />

<?}
</body>
</html>

Open in new window

0
Comment
Question by:ehop66
2 Comments
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 36526400
No, I don't think there is an easy way.  EE is really good for getting questions answered, but when we have to sift through 470 lines of code to try to figure out the question you may not get much in the way of useful results.

Here is a good learning resource that teaches the way PHP handles forms.
http://us3.php.net/manual/en/tutorial.forms.php

Best of luck with it, ~Ray
0
 
LVL 8

Accepted Solution

by:
ropenner earned 125 total points
ID: 36527049
add your inputs anywhere between lines 393 and 460.

You can print them all in the email by calling the function printInputs() .. see attached code which prints them alphabetically.

NOTE:   all special characters are eliminated and only +-.A-Za-z0-9 are allowed.  If you have other requirements you can adjust the preg_replace line.

after line 205 you add

$message .= printInput();

and it will be added to the email immediately following the clean_msg() portion of the email.
<?php
function printInputs() {
	$output = "";
	ksort($_REQUEST);
	foreach ($_REQUEST as $key => $value) {
		if (strlen($value) > 0){
			$newvalue = preg_replace("/[^\s\w\.\+\-]/","", $value);
			$output .= "$key = $newvalue\n";
		}
	}
	return $output;
}
?>
<HTML>
<BODY>
<FORM action=forms.php method=post>
	<INPUT type=text name=junk size=5><BR>
	<INPUT type=text name=garbage size=15><BR>
	<INPUT type=submit name=go>
	<HR>
<?php echo printInputs();?>
</FORM>
</BODY>
</HTML>

Open in new window

0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Developers of all skill levels should learn to use current best practices when developing websites. However many developers, new and old, fall into the trap of using deprecated features because this is what so many tutorials and books tell them to u…
This article discusses how to create an extensible mechanism for linked drop downs.
Learn the basics of if, else, and elif statements in Python 2.7. Use "if" statements to test a specified condition.: The structure of an if statement is as follows: (CODE) Use "else" statements to allow the execution of an alternative, if the …
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now