How to attach two or more files and send mail in PHP

In the code below, only one attachment is sent, but I need to attach and send two files (one rar and pdf file)

$email_to = "$email"; // The email you are sending to (example) $email_from = " online@example.co.in "; // The email you are sending from (example) $email_subject = "subject line"; // The Subject of the email $email_txt = "text body of message"; // Message that the email has in it $fileatt = "files/example.rar"; // Path to the file (example) $fileatt_type = "application/x-rar-compressed"; // File Type $fileatt_name = "example.rar"; // Filename that will be used for the file as the attachment $file = fopen($fileatt,'rb'); $data = fread($file,filesize($fileatt)); fclose($file); $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; $headers="From: $email_from"; // Who the email is from (example) $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; $email_message .= "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type:text/html; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $email_txt; $email_message .= "\n\n"; $data = chunk_split(base64_encode($data)); $email_message .= "--{$mime_boundary}\n" . "Content-Type: {$fileatt_type};\n" . " name=\"{$fileatt_name}\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n" . "--{$mime_boundary}--\n"; mail($email_to,$email_subject,$email_message,$headers); 
+9
source share
10 answers
 <form action="#" method="POST" enctype="multipart/form-data" > <input type="file" name="csv_file[]" /> <br/> <input type="file" name="csv_file[]" /> <br/> <input type="file" name="csv_file[]" /> <br/> <input type="submit" name="upload" value="Upload" /> <br/> </form> <?php if($_POST) { for($i=0; $i < count($_FILES['csv_file']['name']); $i++){ $ftype[] = $_FILES['csv_file']['type'][$i]; $fname[] = $_FILES['csv_file']['name'][$i]; } // array with filenames to be sent as attachment $files = $fname; // email fields: to, from, subject, and so on $to = " example@gmail.com "; $from = " example@gmail.com "; $subject ="My subject"; $message = "My message"; $headers = "From: $from"; // boundary $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; // headers for attachment $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; // multipart boundary $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"; $message .= "--{$mime_boundary}\n"; // preparing attachments for($x=0;$x<count($files);$x++){ $file = fopen($files[$x],"rb"); $data = fread($file,filesize($files[$x])); fclose($file); $data = chunk_split(base64_encode($data)); $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; $message .= "--{$mime_boundary}\n"; } // send $ok = @mail($to, $subject, $message, $headers); if ($ok) { echo "<p>mail sent to $to!</p>"; } else { echo "<p>mail could not be sent!</p>"; } } ?> 
+12
source

Following the principles of reusability , you can use https://github.com/Synchro/PHPMailer

 <?php require 'PHPMailerAutoload.php'; $mail = new PHPMailer; $mail->isSMTP(); // Set mailer to use SMTP $mail->Host = 'smtp1.example.com;smtp2.example.com'; // Specify main and backup server $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = 'jswan'; // SMTP username $mail->Password = 'secret'; // SMTP password $mail->SMTPSecure = 'tls'; // Enable encryption, 'ssl' also accepted $mail->From = ' from@example.com '; $mail->FromName = 'Mailer'; $mail->addAddress(' josh@example.net ', 'Josh Adams'); // Add a recipient $mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name $mail->Subject = 'Here is the subject'; $mail->Body = 'This is the HTML message body <b>in bold!</b>'; $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; if(!$mail->send()) { echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; exit; } echo 'Message has been sent'; 
+6
source

Check out the following multi-user file attachment in the main php mail function.

 <?php /** Mail with attachment */ function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $bcc, $subject, $message){ $uid = md5(uniqid(time())); $mime_boundary = "==Multipart_Boundary_x{$uid}x"; $header = "From: ".$from_name." <".$from_mail.">\r\n"; $header .= "Bcc: ".$bcc."\r\n"; $header .= "Reply-To: ".$replyto."\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"".$mime_boundary."\"\r\n\r\n"; $header .= "This is a multi-part message in MIME format.\r\n"; $header .= "--".$mime_boundary."\r\n"; $header .= "Content-type:text/html; charset=iso-8859-1\r\n"; $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; $header .= nl2br($message)."\r\n\r\n"; $header .= "--".$mime_boundary."\r\n"; foreach($filename as $k=>$v){ $file = $path.$v; $file_size = filesize($file); $handle = fopen($file, "r"); $content = fread($handle, $file_size); fclose($handle); $content = chunk_split(base64_encode($content)); $header .= "Content-Type: application/octet-stream; name=\"".$v."\"\r\n"; // use different content types here $header .= "Content-Transfer-Encoding: base64\r\n"; $header .= "Content-Disposition: attachment; filename=\"".$v."\"\r\n\r\n"; $header .= $content."\r\n\r\n"; $header .= "--".$mime_boundary."--"."\r\n"; } if (mail($mailto, $subject, "", $header)) { //echo "mail send ... OK"; // or use booleans here return true; } else { //echo "mail send ... ERROR!"; return false; } } ?> 
+6
source

This is one of the best solutions I have received for several email applications and successfully passed testing.

This code gives you the freedom of attaching a file by email without uploading it to your hosting server space. It is very necessary.

There are many solutions that tell you how to upload files to your server and then send them by email, but this solution gives "Direct multiple attachment of files to email"

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>E-mail with Attachment</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <?php if ($_SERVER['REQUEST_METHOD']=="POST"){ // we'll begin by assigning the To address and message subject $to=" me@me.com "; $subject="E-mail with attachment"; // get the sender 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 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 { ?> <p>Send an e-mail with an attachment:</p> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" name="form1"> <p>Your name: <input type="text" name="fromname"></p> <p>Your e-mail: <input type="text" name="fromemail"></p> <p>Mod List: <textarea name="question" maxlength="1000" cols="25" rows="6" name="modlist"></textarea> <p>File: <input type="file" name="file1"></p> <p>File: <input type="file" name="file2"></p> <p>File: <input type="file" name="file3"></p> <p>File: <input type="file" name="file4"></p> <p>File: <input type="file" name="file5"></p> <p>File: <input type="file" name="file6"></p> <p>File: <input type="file" name="file7"></p> <p>File: <input type="file" name="file8"></p> <p><input type="submit" name="Submit" value="Submit"></p> </form> <?php } ?> </body> </html> 
+4
source

Try it. Put your files in an array, and then use the form loop to add each of them to the $email_message variable

 $email_to = "$email"; // The email you are sending to (example) $email_from = " online@example.co.in "; // The email you are sending from (example) $email_subject = "subject line"; // The Subject of the email $email_message = "text body of message"; // Message that the email has in it $files = array("file_1.ext","file_2.ext","file_3.ext",......); $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; $headers="From: $email_from"; // Who the email is from (example) $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; $email_message .= "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type:text/html; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $email_txt; $email_message .= "\n\n"; for($x=0;$x<count($files);$x++){ $file = fopen($files[$x],"rb"); $data = fread($file,filesize($files[$x])); fclose($file); $data = chunk_split(base64_encode($data)); $email_message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; $email_message .= "--{$mime_boundary}\n"; } mail($email_to,$email_subject,$email_message,$headers); 

Hope it works great :)

0
source

This is the code that I use to send multiple attachments, I hope this helps too. You really need to use a loop to attach multiple files.

  $files = array("file1.pdf","file2.pdf"); $body = "email in html form"; // email fields: to, from, subject, and so on $to = "e-mail id of person you are sending to"; $from = "your e-mail id"; $subject = "email subject"; $message = html_entity_decode($body); $headers = "From: $from"; // boundary $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; // headers for attachment $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\" {$mime_boundary}\""; // multipart boundary $message = "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; $message .= "--{$mime_boundary}\n"; // preparing attachments for ($x = 0; $x < count($files); $x++) { $file = fopen($files[$x], "rb"); $data = fread($file, filesize($files[$x])); fclose($file); $data = chunk_split(base64_encode($data)); $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; $message .= "--{$mime_boundary}\n"; } // send $ok = @mail($to, $subject, $message, $headers); if ($ok) { echo "<p>mail sent to $to!</p>"; } else { echo "<p>mail could not be sent!</p>"; } 
0
source
 <input type="file" name="file" multiple> //select multiple file $target_dir = "upload/"; //first upload your directory path $names = $_FILES['file']['name']; //file Name $i =0; foreach($names as $name){ $target_file = $target_dir . basename($name); //first upload your directory path move_uploaded_file($_FILES["file"]["tmp_name"][$i], $target_file); //upload your directory $mail->addAttachment($target_file); //after upload file path fetch and atachment $i++; } 
0
source

A simple working and proven example:

 <?php mail_attachment(" mail@mail.com ","Subject","Here is the body",array("file1.pdf","file2.pdf")); function mail_attachment($to, $subject, $message, $files) { $headers = "From: no-reply@mail.com "; $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; $message = "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; $message .= "--{$mime_boundary}\n"; foreach ($files as $file) { $filename = end(explode("/",$file)); $data = file_get_contents($file); $data = chunk_split(base64_encode($data)); $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$file\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$file\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; $message .= "--{$mime_boundary}\n"; } echo (@mail($to, $subject, $message, $headers)) ? "<p>Send to $to!</p>" : "<p>Not send toaar $to!</p>"; } // mail-attachment ?> 
0
source

FYI, this line from the original message, as well as some responses, will cause a problem on some email systems.

$ headers. = "\ nMIME-Version: 1.0 \ n".

Initially, \ n the reason for the refusal of attachments was sending to the address located on emailpros.com, a reliable email system compatible with HIPAA. Just removing the line break fixed the problem there. However, it worked great when sending to a Gmail account and another host (Hostmonster). So they all worked great. $ headers. = "MIME-Version: 1.0 \ n".

0
source
  <?php // upload recommendation file section $target_dir = "wp-content/uploads/rec_file/"; $target_file = $target_dir . basename($_FILES["RC_file"]["name"]); $uploadOk = 1; $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); // Check if image file is a actual image or fake image $check = getimagesize($_FILES["RC_file"]["tmp_name"]); if($check !== false) { $error_msg = "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { $error_msg = "File is not an image."; $uploadOk = 0; } // Check if file already exists if (file_exists($target_file)) { $error_msg = "Sorry, file already exists."; $uploadOk = 0; } // Check file size if ($_FILES["RC_file"]["size"] > 500000) { echo "Sorry, your file is too large."; $uploadOk = 0; } // Allow certain file formats if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { $error_msg = "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { $error_msg = "your file was not uploaded."; // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["RC_file"]["tmp_name"], $target_file)) { echo "The file ". basename( $_FILES["RC_file"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file. ". $error_msg ; } } // upload driven licence file section $DL_target_dir = "wp-content/uploads/rec_file/"; $DL_target_file = $DL_target_dir . basename($_FILES["DL_file"]["name"]); $uploadOk = 1; $imageFileType = pathinfo($DL_target_file,PATHINFO_EXTENSION); // Check if image file is a actual image or fake image $check = getimagesize($_FILES["DL_file"]["tmp_name"]); if($check !== false) { $error_msg = "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { $error_msg = "File is not an image."; $uploadOk = 0; } // Check if file already exists if (file_exists($DL_target_file)) { $error_msg = "Sorry, file already exists."; $uploadOk = 0; } // Check file size if ($_FILES["DL_file"]["size"] > 500000) { echo "Sorry, your file is too large."; $uploadOk = 0; } // Allow certain file formats if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { $error_msg = "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { $error_msg = "your file was not uploaded."; // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["DL_file"]["tmp_name"], $DL_target_file)) { echo "The file ". basename( $_FILES["DL_file"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file. ". $error_msg ; } } // array with filenames to be sent as attachment $files = array($target_file,$DL_target_file); // email fields: to, from, subject, and so on $to = " tkdilankumara@gmail.com "; $from = " help@soosti.com "; $subject ="Member Registration"; $headers = "From: $from"; $eol = "\r\n"; $message .= "Member Registration Information.".$eol; $message .= $username.$eol; $message .= $email.$eol; $message .= $Fname.$eol; $message .= $Lname.$eol; $message .= $address.$eol; // boundary $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; // headers for attachment $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; // multipart boundary $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"; $message .= "--{$mime_boundary}\n"; // preparing attachments for($x=0;$x<count($files);$x++){ //$file = @fopen($files[$x],"rb"); //$data = @fread($file,filesize($files[$x])); //@fclose($file); $content =file_get_contents($files[$x],"rb"); $content = chunk_split(base64_encode($content)); $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" . "Content-Transfer-Encoding: base64\n\n" . $content . "\n\n"; $message .= "--{$mime_boundary}\n"; } // send $ok = @mail($to, $subject, $message, $headers); if ($ok) { echo "<p>mail sent to $to!</p>"; } else { echo "<p>mail could not be sent!</p>"; } ?> 
0
source

All Articles