How do I merge PHP file to attach and send multiple attachments with existing PHP file?
Copy link to clipboard
Copied
Any experts out there on PHP?
I am trying to merge the following php code (#2) with my existing php code (#1) so that it I can attach and send multiple files. I've got it so I can attach and send files, no problem, but the form verification and anti-bot test no longer works. I realize there might be some redundancies in the two php codes. I have removed, replaced and tried combining code multiple times, but to no avail. Also the code in #2 returns a blank page saying "Message sent" or "Failed to send" when I prefer what I already have in code #1 with the message appearing in a div over top of the page.
Any guidance without starting from scratch with php mailers, etc, would be very appreciated. It's probably something simple for those of you well-versed in PHP.
Thanks!
Dave
PHP #1 (No file attachment, but form verification and anti-bot test):
<?php
// NOTE: this page must be saved as a .php file.
// And your server must support PHP 5.3+ PHP Mail().
// Define variables and set to empty values
$result = $message = $human = "";
$errName = $errMessage = $errHuman = "";
if ( isset( $_POST[ "submit" ] ) ) {
$message = $_POST[ 'message' ];
$human = intval( $_POST[ 'human' ] );
//valid address on your web server
$from = 'me@myemail.com';
//your email address where you wish to receive mail
$to = 'me@myemail.com';
$subject = 'MESSAGE FROM YOUR WEB SITE';
$headers = "From:$from\r\nReply-to:$email";
$body = "Message: $message";
//Check if message is entered
if ( empty( $_POST[ "message" ] ) ) {
$errMessage = "Please enter your message.";
} else {
$message = test_input( $_POST[ "message" ] );
}
//Check if simple anti-bot test is entered
if ( empty( $_POST[ "human" ] ) ) {
$errHuman = "Please enter the sum.";
} else {
if ( $human !== 1001 ) {
$errHuman = 'Wrong answer. Please try again.';
}
}
// If there are no errors, send the email & output results to the form
if ( !$errMessage && !$errHuman ) {
if ( mail( $to, $subject, $body, $from ) ) {
$result = '<div class="alert alert-success"><h2><span class="glyphicon glyphicon-ok"></span> Message sent!</h2><h3>Thank you for contacting us. Someone will be in touch with you soon.</h3></div>';
} else {
$result = '<div class="alert alert-danger"><h2><span class="glyphicon glyphicon-warning-sign"></span> Sorry there was a form processing error.</h2> <h3>Please try again later.</h3></div>';
}
}
}
//sanitize data inputs
function test_input( $data ) {
$data = trim( $data );
$data = stripslashes( $data );
$data = htmlspecialchars( $data );
$data = ( filter_var( $data, FILTER_SANITIZE_STRING ) );
return $data;
}
//end form processing script
?>
PHP #2 (Multiple file attachment):
<?php
if ($_SERVER['REQUEST_METHOD']=="POST"){
// we'll begin by assigning the To address and message subject
$to="me@myemail.com";
$subject="E-mail with attachment";
// get the sender's name and email address
// we'll just plug them a variable to be used later
$from = stripslashes($_POST['fromname'])."<".stripslashes($_POST['fromemail']).">";
// generate a random string to be used as the boundary marker
$mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";
// now we'll build the message headers
$headers = "From: $from\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: multipart/mixed;\r\n" .
" boundary=\"{$mime_boundary}\"";
// here, we'll start the message body.
// this is the text that will be displayed
// in the e-mail
$message="This is an example";
$message .= "Name:".$_POST["fromname"]."Message Posted:".$_POST["modlist"];
// next, we'll build the invisible portion of the message body
// note that we insert two dashes in front of the MIME boundary
// when we use it
$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$message . "\n\n";
// now we'll process our uploaded files
foreach($_FILES as $userfile){
// store the file information to variables for easier access
$tmp_name = $userfile['tmp_name'];
$type = $userfile['type'];
$name = $userfile['name'];
$size = $userfile['size'];
// if the upload succeded, the file will exist
if (file_exists($tmp_name)){
// check to make sure that it is an uploaded file and not a system file
if(is_uploaded_file($tmp_name)){
// open the file for a binary read
$file = fopen($tmp_name,'rb');
// read the file content into a variable
$data = fread($file,filesize($tmp_name));
// close the file
fclose($file);
// now we encode it and split it into acceptable length lines
$data = chunk_split(base64_encode($data));
}
// now we'll insert a boundary to indicate we're starting the attachment
// we have to specify the content type, file name, and disposition as
// an attachment, then add the file content.
// NOTE: we don't set another boundary to indicate that the end of the
// file has been reached here. we only want one boundary between each file
// we'll add the final one after the loop finishes.
$message .= "--{$mime_boundary}\n" .
"Content-Type: {$type};\n" .
" name=\"{$name}\"\n" .
"Content-Disposition: attachment;\n" .
" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n";
}
}
// here's our closing mime boundary that indicates the last of the message
$message.="--{$mime_boundary}--\n";
// now we just send the message
if (@mail($to, $subject, $message, $headers))
echo "Message Sent";
else
echo "Failed to send";
} else {
?>
html:
<!--begin HTML Form-->
<form role="form" method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<!--when submit button is clicked, show results here-->
<div class="form-group"> <?php echo $result;?> </div>
<div class="form-group">
<textarea class="form-control" rows="3" name="message" requiredplaceholder="What's new?"><?php echo $message;?></textarea>
<span class="required small"><?php echo $errMessage;?></span> </div>
<div class="form-group">
<div class="col-sm-4">
File: <input type="file" name="file1">
</div>
<div class="col-sm-4">
File: <input type="file" name="file2">
</div>
<div class="col-sm-4">
File: <input type="file" name="file3">
</div>
<div class="col-sm-4">
File: <input type="file" name="file4">
</div>
<div class="col-sm-4">
File: <input type="file" name="file5">
</div>
<div class="col-sm-4">
File: <input type="file" name="file6">
</div>
</div>
<div class="form-group">
<div class="col-sm-4">
<h6 class="human">A number between 1 and 1,806,010</h6>
<input type="text" class="form-control" id="human" name="human" placeholder="Your Answer" value="<?php echo $human;?>">
<span class="required small"><?php echo $errHuman;?></span><br>
<button type="submit" id="submit" name="submit" class="btn btn-success">SUBMIT</button>
<button type="reset" id="reset" name="reset" class="btn btn-success">RESET</button>
</div>
</div>
</form>
<!--end Form-->
Copy link to clipboard
Copied
There are massive security issues to consider with forms and attachments, too numerous to name here. Left unprotected, forms are an open door to bots, hackers and other bad actors.
If you're not experienced with PHP code and making sure your forms are secure, full stop. Hire an experienced developer or use a form building service like JotForms or Wufoo forms. Additional fees may apply.
Alternatively, switch to an online site building platform like Webflow. Or use open source WordPress and the WPForm Plugin.
Copy link to clipboard
Copied
Ha! OK, I'll give one of those a try. I was hoping to avoid third party, but will take a look. Thanks, Nancy.
Copy link to clipboard
Copied
Well, @daveharr1s0n , It's true that in your message you emphasize the point of not using PHPMailer, but even if you're going to use a third-party solution, it's worth taking a look at the library, which handles the sending of multiple attachments quite simply.
https://github.com/PHPMailer/PHPMailer/blob/master/examples/send_multiple_file_upload.phps

