Sending email with multiple attachments with PHP
- July 22, 2008 by Emanuele Feronato
- Filed under Php | 55 Comments
Today I was looking for a cut/paste script to manage emails with multiple attachments with php and I only found classes, server-side libraries or non-working examples (!!!).
I just needed an easy script and I did not find it… so I cut/pasted here and there, I changed something, shaked a bit and here it is an easy and working script.
Just fill $files array with the files to be sent, custom email fields and you’re done.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?php // array with filenames to be sent as attachment $files = array("file_1.ext","file_2.ext","file_3.ext",......); // email fields: to, from, subject, and so on $to = "mail@mail.com"; $from = "mail@mail.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>"; } ?> |
Enjoy and send mails with any number of attachments without any class/library
55 Responses
Leave a Reply
TUTORIAL SERIES:
- Una guida completa al gioco del poker online e una selezione dei migliori casino online.
- casino online
- migliori casino online
- BlackJack online
- casinò online

(39 votes, average: 4.31 out of 5)

You have to be careful with the mail function.
Some free hosts disable it.
I would also appreciate how to send those mails right from the form – especialy how to attach multiple files and then send them.
Hey, its a nice script but how to attach files at run time?
A perfect script. I was quite fagged out trying to correct a code sending a single attachment and got no where. Great work.
It would be great to know how to make form for uploading files and storing in this array. I am beginner in PHP. Anyone help, please?
Thanks for the multiple attachments code. I found what appears to be a problem with it though. For the very last file, I think you need a “–” at the end of the mime boundary hash; i.e., “–{$mime_boundary}–\n”. Otherwise, I get an extra empty file attached to the email called “ATT000??.txt”.
Godd Example to send multiple attachment in PHP
thank you very much for your help
Thank You … It is really helpful for my project … thanx lots ..
hey
I cant get it to work , what do I need to do with it
btw I am sort of new to php
pleas help me anyone
The script works great except for one thing.
I always get an extra file “ATT000XX.txt” that is empty.
I trying adding “-” to the end of “–{$mime_boundary}”. I added it to just the one in the loop, out of the loop and every combination in between.
Nothing seems to work.
How do I get that file to not be attached?
Thanks.
I had the same experience, especially with examples that didn’t work or corrupt attachments, until I found your code.
Thans a lot !!!
gr8 work ! but there is problem of extra file “ATT000XX.txt”.
i found a way in which we can solve this problem as follows;
$just=count($files);
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”;
if($x==($just-1))
{
$message .= “–{$mime_boundary}-\n”;
} else
{
$message .= “–{$mime_boundary}\n”;
}
}
replace the for loop with this code
$just=count($files);
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”;
if($x==($just-1))
{
$message .= “–{$mime_boundary}-\n”;
} else
{
$message .= “–{$mime_boundary}\n”;
}
}
Line 10 can be skipped because of line 21.
this worked for me butt i get that extra file
strange thing in windows mail there is no extra file
in outlook i got it
i tray Umesh thing butt then i got only one attachment
i include 3 of them
this worked for me butt i get that extra file
strange thing in windows mail there is no extra file
in outlook i got it
i tray Umesh thing butt then i got only one attachment
i include 3 of them
instead of –{$mime_boundary}\n this use
–-{$mime_boundary}–\n
instead of –{$mime_boundary}\n this use
–-{$mime_boundary}–-\n
I am having issues with multiple attachments. Only the fist one is getting attached while the other files aren’t. Any ideas?
I also had issues with an extra attachment, but this did solve the problem:
Original:
Line 33:
$message .= “–{$mime_boundary}\n”;
FIX:
$message .= “–{$mime_boundary}–\n”;
Hmm, for some reason, WordPress combines 2 hashes “- -” into one hash: “–”
So to clarify, you want 2 hashes before and after {$mime_boundary}
Thanks Emanuele!!! Great script. Since a lot of people above seem to be having the same problem and I solved said problem, I will show my improved version that worked for me with 0 attachments, 1 attachment and more than 1 attachment without the extra txt file or gibberish at the end. Maybe u can re-post this if u get a chance.
<?php
// array with filenames to be sent as attachment
$files = array("filename.blah", "filename.blah");
$filecount=count($files);
// email fields: to, from, subject, and so on
$to = "blah@blah.com";
$from = "blah@blah.com";
$subject ="testemail";
$message = "testing if the script i downloaded works";
$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";
if($filecount!=0)
{
$message .= "–{$mime_boundary}\n";
}
// preparing attachments
for($x=0;$x<$filecount;$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";
if($x==$filecount-1)
{
$message .= "–{$mime_boundary}-\n";
}
else
{
$message .= "–{$mime_boundary}\n";
}
}
// send
$ok = @mail($to, $subject, $message, $headers);
if ($ok)
{
echo "mail sent to $to!”;
}
else
{
echo “mail could not be sent!”;
}
?>
Hi,
This code works but the initial problem was that it was attaching the empty text file but i used the new code like here specified i replaced the loop with that just variable and even the last code
<?php
// array with filenames to be sent as attachment
$files = array("filename.blah", "filename.blah");
$filecount=count($files);
// email fields: to, from, subject, and so on
$to = "blah@blah.com";
$from = "blah@blah.com";
$subject ="testemail";
$message = "testing if the script i downloaded works";
$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";
if($filecount!=0)
{
$message .= "–{$mime_boundary}\n";
}
// preparing attachments
for($x=0;$x
the extra txt file is removed but it is attaching only one file not all the files name that i gave in the array please provide me the solution for that so that it will attach all the files without extra txt file.
Try this it really works on my side.
$value){
$ctr_file++;
$att_file = $_FILES[$idx]['tmp_name'];
$att_file_type = $_FILES[$idx]['type'];
$att_file_name = $_FILES[$idx]['name'];
if (is_uploaded_file($att_file)) {
// Read the file to be attached (‘rb’ = read binary)
$file = fopen($att_file,’rb’);
$data = fread($file,filesize($att_file));
fclose($file);
// Base64 encode the file data
$data = chunk_split(base64_encode($data));
// Add file attachment to the message
$message .= “Content-Type: {$att_file_type};\n” .
” name=\”{$att_file_name}\”\n” .
“Content-Disposition: attachment;\n” .
” filename=\”{$att_file_name}\”\n” .
“Content-Transfer-Encoding: base64\n\n” .
$data . “\n\n”;
$message .= ($ctr_file != count($_FILES)) ? “–{$mime_boundary}\n” : “–{$mime_boundary}–\n”;
}
}
echo mail($to,$subject,$message,$headers) ? ‘mail sent with attached files’ : ‘mail not sent!’;
}
?>
Simply superb.. its wrkin fine dude…
HI, can any one hellp me out, I have mentioned the following code, we are reciving an email with the text format – ATT0029.txt , the following code as mentioned, we are trying to attach a word format and submit
/ Build email data
// generate a random string to be used as the boundary marker
$mime_boundary = “==Multipart_Boundary_x”.md5(mt_rand()).”x”;
// open the file for a binary read
$file = fopen($this->attachment, ‘rb’);
// read the file content into a variable
$data = fread($file, filesize($this->attachment));
// close the file
fclose($file);
// now we encode it and split it into acceptable length lines
$data = chunk_split(base64_encode($data));
$file_name = explode(“\\”, $this->attachment );
// 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}\”";
// next, we’ll build 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_body . “\n\n”;
// 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 and set another boundary to
// indicate that the end of the file has been reached
$message .= “–{$mime_boundary}\n” . “Content-Type: text/plain;\n” . ” name=\”{$file_name[1]}\”\n” .
“Content-Disposition: attachment;\n” .
// ” filename=\”{$fileatt_name}\”\n” .
“Content-Transfer-Encoding: base64\n\n” . $data . “\n\n” . “–{$mime_boundary}–\n”;
Please help me out with the solution
It doesnt work at all, sometimes it adds 2 attachment other times nothing. The code of Wilson Abesamis is not complete, pls send the complete code
THanks
Dabby
works.. but attachment recieves like text
[...] a everyday use function, but I am sure some of you will find it useful, just like it happened with Sending email with multiple attachments with PHP. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 function [...]
I made to changes to the original
replace line 22 with:
if (count($files)){
$message .=”–{$mime_boundary}\n”;
}
else{
$message .=”–{$mime_boundary}–\n”;
}
replace line 33 with:
if ($x==count($files)-1){
$message .=”–{$mime_boundary}–\n”;
}
else{
$message .=”–{$mime_boundary}\n”;
}
this handles extra file problem and allows for no files or multiple files to be sent
Retool here ==You can leave lime 22 as is, but change lime 33 as mentioned above
How do I name the files to be attached with files which have been uploaded as part of a form to complete the following line?
(“file_1.ext”,”file_2.ext”,”file_3.ext”,……);
Nice Script… :)
Such a great script! Been testing script on the net for >10hrs without findng what I was looking for. Until now. Thanks from Sweden!
Oh forgot to say, if you want to send the message in html instead of plain text, just change Content-Type from text/plain to text/html.
file_get_contents() has been available since php 4.3.0 (release in 2002):
$data = chunk_split( base64_encode(file_get_contents(“$files[$x]“)) );
This looks like a great script and works fine, wit the exception of the extra empty attachment. Lots of people have suggested fixes, but it’s not very clear which fix actually work…would anyone who’s got the script to work be able to post the full amended script on here?
Many thanks :)
This is my modification which solved for me problem of unwanted file:
// preparing attachments
$counted = count($files);
for($x=0;$x<$counted;$x++){
$data = chunk_split( base64_encode(file_get_contents("$files[$x]")) );
$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";
if($x < $counted-1){
$message .= "–{$mime_boundary}\n";
}else{
$message .= "–{$mime_boundary}-\n";
}
}
Thanks for this snippet, it provided an excellent starting place.
I had issues with this script however, after reading the comments and looking over various other pages I managed to piece something together that works well. This should work for both 0 and more than 0 files. I added the proper elements to support utf8 encoded messages in the subject, filename and body. You may need to alter the script for your application but this may save some time:
//begin_example
$to_address = “someaddress@something.com”;
$second_to_address = “someotheraddress@something.com”;
$to = “$to_address”. “, “; // note the comma
$to .= “$second_to_address”;
$from_name = “Bob Dole”;
$from_email = “bob@dole.com”;
$additional_email1 = “add1@something.com”;
$additional_email2 = “add2@something.com”;
$additional_email3 = “add3@something.com”;
$sub = “Test Subject”;
//utf-8 handling
$subject = “=?UTF-8?B?”;
$subject .= base64_encode($sub);
$subject .=”?=\n”;
//UTF-8 from header
$headers = “From: =?UTF-8?B?”.base64_encode($from_name).”?= \r\n”;
if(empty($additional_email1)){}else{ $headers .= “CC: \r\n”; }
if(empty($additional_email2)){}else{ $headers .= “CC: \r\n”; }
if(empty($additional_email3)){}else{ $headers .= “CC: \r\n”; }
$body = ” Test email body”;
//path to files relative to the document
$attachment_path = “attachments/some_folder”;
//you can easily create a function that reads a directory and returns an array of files or “empty” . The if statement below will allow empty to properly format the mail for no attachments.
$dir_contents = array(“file_1.ext”,”file_2.ext”,”file_3.ext”);
$files = $dir_contents;
//random number for MIME boundary
$semi_rand = md5(time());
//the MIME boundary
$mime_boundary = “==Multipart_Boundary_x{$semi_rand}x”;
//add the headers for attachment
$headers .= “MIME-Version: 1.0\n”;
$headers .= “Content-Type: multipart/mixed;”;
$headers .= ” boundary=\”{$mime_boundary}\”\n”;
// multipart boundary
$msg = “This is a multi-part message in MIME format.\n\n”.”–{$mime_boundary}\n”.”Content-type: text/plain; charset=UTF-8\n”.”Content-Transfer-Encoding: 8bit\n\n”.$body.”\n\n”;
//attachment code
//if the files array isn’t empty attach the files, else don’t run the attachment code
if( $files “empty”){
$counted = count($files);
for($x=0;$x<$counted;$x++){
$msg .= "–{$mime_boundary}\n";
$data = chunk_split(base64_encode(file_get_contents("".$attachment_path."/".$files[$x]."")) );
$msg .= "Content-Type: application/octet-stream;\n"
." name=\"=?UTF-8?B?".base64_encode($files[$x])."?=\"\n".
"Content-Disposition: attachment;\n" ." filename=\"=?UTF-8?B?".base64_encode($files[$x])."?=\"\n"
."Content-Transfer-Encoding: base64\n\n".$data."\n\n";
}
}
$res = @mail($to, $subject, $msg, $headers);
if($res){
return TRUE;
}
else
{
return FALSE;
}
//end_example
you have just saved me soooo much work
I am very new to coding PHP. In fact, I am learning it on the fly because of a client. I need to attach four files from a form and send them. I am using the file attach button from Dreamweaver CS3. How do I set the file names in this array?
// array with filenames to be sent as attachment
$files = array(“file_1.ext”,”file_2.ext”,”file_3.ext”,……);
Do I have to set variable that look at each form field?
I am lost and could really use some help.
These are all going to be text files, by the way, if that matters.
Jerrid, check http://php.net/manual/en/reserved.variables.files.php . Essentially it all starts with the $_FILES superglobal variable. To see what the array looks like I use “print_r($_FILES); ” ( http://php.net/manual/en/function.print-r.php) . There is a good example of how to use print_r with some “pre” tags to view arrays ( which makes them more manageable ). I wouldn’t implement a send attachment without some sort of validation mainly so you can control file size and types being sent. Check http://php.net/manual/en/function.move-uploaded-file.php for some information on the move_uploaded_file function. They have a good uploading multiple files example there. BTW my post above has some issues because this form submission seems to strip characters such as greater than and less than signs hopefully everyone can figure out how to fill in the gaps.
Nice script, works fine for me, except that I get things like this where usually the first lines of my mail contents show in gmail: – PNG IHDR – – < qâ pHYs šœ OiCCPPhotoshop ICC profile xÚ SgTSé =÷ÞôBKˆ€”KoR RB … and I don't want that at all… because it looks like you get a virus of some sort (if you are a noob at things like this, I need it for a CMS so I can't really use smth like that to show in the mail headers right?
GREAT YET SIMPLE. THANKS
heres a form processing code I wrote that uploads 3 files without using an array… also requires re-captcha but you can take that out of the code if needed…also does some PHP validation… still gona add some file extension validations and file size… name of file attachments on form are fileatt, fileatt2, and fileatt3…hope this helps someone.
require_once(‘recaptchalib.php’);
$privatekey = “6LdvfQwAAAAAAIqtAC0RV1XXPwSq8oMbqJz9xP4Y”;
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
$result = $result . “A small problemPlease Go back and try it again.” .
“(” . $resp->error . “)”;
}
elseif (!($firstname && $lastname && $city && $country && $contactPhone && $email)) {$result = $result . “ERROR: Please Re-apply, Fill all fields marked *“;
}
elseif (!eregi(“^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$”, $email)) {$result = $result . “ERROR: Email Not Valid”;
}
else{
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$businessName = $_POST['businessName'];
$streetAddress = $_POST['streetAddress'];
$city = $_POST['city'];
$country = $_POST['country'];
$contactPhone = $_POST['contactPhone'];
$mobilePhone = $_POST['mobilePhone'];
$fax = $_POST['fax'];
$email = $_POST['email'];
$from = $_POST['firstname'];
$from .= $_POST['lastname'];
if(isset($_POST['checkValves'])&&
$_POST['checkValves'] == ’1′)
{
$requested = $requested . ” Check Valves, “;
}
if(isset($_POST['fireValves'])&&
$_POST['fireValves'] == ’1′)
{
$requested = $requested . ” Fire Valves, “;
}
if(isset($_POST['flanges'])&&
$_POST['flanges'] == ’1′)
{
$requested = $requested . ” Flanges, “;
}
if(isset($_POST['guageGlassFittings'])&&
$_POST['guageGlassFittings'] == ’1′)
{
$requested = $requested . ” Guage Glass Fittings, “;
}
if(isset($_POST['globeValves'])&&
$_POST['globeValves'] == ’1′)
{
$requested = $requested . ” Globe Valves, “;
}
if(isset($_POST['safetyValves'])&&
$_POST['safetyValves'] == ’1′)
{
$requested = $requested . ” Safety Valves, “;
}
if(isset($_POST['sightGlasses'])&&
$_POST['sightGlasses'] == ’1′)
{
$requested = $requested . ” Sight Glasses, “;
}
if(isset($_POST['steamEjectors'])&&
$_POST['steamEjectors'] == ’1′)
{
$requested = $requested . ” Steam Ejectors, “;
}
if(isset($_POST['steamUnions'])&&
$_POST['steamUnions'] == ’1′)
{
$requested = $requested . ” Steam Unions, “;
}
if(isset($_POST['treacleCocks'])&&
$_POST['treacleCocks'] == ’1′)
{
$requested = $requested . ” Treacle Cocks, “;
}
if(isset($_POST['vacuumBreakValves'])&&
$_POST['vacuumBreakValves'] == ’1′)
{
$requested = $requested . ” Vacuum Break Valves, “;
}
if(isset($_POST['other'])&&
$_POST['other'] == ’1′)
{
$requested = $requested . ” Other, “;
}
$additionalDetails = $_POST['additionalDetails'];
// Obtain file upload vars
$file_name = $_FILES['fileatt']['name'];
$temp_name = $_FILES['fileatt']['tmp_name'];
$file_type = $_FILES['fileatt']['type'];
// Obtain file upload vars
$file_name2 = $_FILES['fileatt2']['name'];
$temp_name2 = $_FILES['fileatt2']['tmp_name'];
$file_type2 = $_FILES['fileatt2']['type'];
// Obtain file upload vars
$file_name3 = $_FILES['fileatt3']['name'];
$temp_name3 = $_FILES['fileatt3']['tmp_name'];
$file_type3 = $_FILES['fileatt3']['type'];
$to = “dd@vodafone.co.nz”;
$subject = “Price Enquiry Form”;
$info = “First Name(s): ” . $firstname . “\n”;
$info .= “Last Name: ” . $lastname . “\n”;
$info .= “Business Name: ” . $businessName . “\n”;
$info .= “Street Address: ” . $streetAddress . “\n”;
$info .= “City: ” . $city . “\n”;
$info .= “Country: ” . $country . “\n”;
$info .= “Contact Phone: ” . $contactPhone . “\n”;
$info .= “Mobile Phone: ” . $mobilePhone . “\n”;
$info .= “Fax: ” . $fax . “\n”;
$info .= “Email: ” . $email . “\n\n”;
$info .= “Requested Info for: ” . $requested . “\n\n”;
$info .= “Additional Details: ” . $additionalDetails . “\n”;
$message = $info;
// things you need
$file = $temp_name;
$content = chunk_split(base64_encode(file_get_contents($file)));
$uid = md5(uniqid(time()));
$header = “From: $firstname $lastname \n” .
$header = “Reply-To: $email \r\n” ;
$header .= ‘Cc: fd@vodafone.co.nz‘ . “\r\n”;
$header .= “MIME-Version: 1.0\r\n”;
// declaring we have multiple kinds of email
$header .= “Content-Type: multipart/mixed; boundary=\”".$uid.”\”\r\n\r\n”;
$header .= “This is a multi-part message in MIME format.\r\n”;
// plain text part
$header .= “–”.$uid.”\r\n”;
$header .= “Content-type:text/plain; charset=iso-8859-1\r\n”;
$header .= “Content-Transfer-Encoding: 7bit\r\n\r\n”;
$header .= $message.”\r\n\r\n”;
//file attachment
$header .= “–” .$uid. “\r\n”;
$header .= “Content-Type: “.$file_type.”; name=\”".$file_name.”\”\r\n”;
$header .= “Content-Transfer-Encoding: base64\r\n”;
$header .= “Content-Disposition: attachment; filename=\”".$file_name.”\”\r\n\r\n”;
$header .= $content.”\r\n\r\n”;
//file attachment 2
$header .= “–” .$uid. “\r\n”;
$header .= “Content-Type: “.$file_type2.”; name=\”".$file_name2.”\”\r\n”;
$header .= “Content-Transfer-Encoding: base64\r\n”;
$header .= “Content-Disposition: attachment; filename=\”".$file_name2.”\”\r\n\r\n”;
$header .= $content.”\r\n\r\n”;
//file attachment 3
$header .= “–” .$uid. “\r\n”;
$header .= “Content-Type: “.$file_type3.”; name=\”".$file_name3.”\”\r\n”;
$header .= “Content-Transfer-Encoding: base64\r\n”;
$header .= “Content-Disposition: attachment; filename=\”".$file_name3.”\”\r\n\r\n”;
$header .= $content.”\r\n\r\n”;
$ok = @mail($to, $subject, “”, $header );
if ($ok){
$result = $result . “Thank You” . $firstname . ” for Your Enquiry!\n We will contact you asap\n”;
}else {
$result = $result . “Sorry” . $firstname . ” There was a Problem sending the Form\n Please Try Again\n”;
}
}
include ‘thankyou.php’;
also 4got to mention that the included thankyou.php has a div that echos $result…
ok mine didnt quite work… it’s attaching the file info but the full file isnt being attached? can any1 see wats wrong with my code?
ok someone delete all my posts and if anybody cud help me make my code into an array uploading email form?
Thank you
Took a few pointers from here. Thanks!
Thank you
If you want a complete working script, see below;
This removes any extra attachments, and makes sure all attachments are included. No additional text in the body, no missing files! Enjoy!
<?php
// array with filenames to be sent as attachment
$path1 = "path/to/file1.ext";
$path2 = "path/to/file2.ext";
$patharray = array("$path2", "$path1");
$files = array("file2.ext", "file1.ext");
// email fields: to, from, subject, and so on
$to = "email@youremail.com";
$from = "email@youremail.com";
$subject = "Subject title here";
$message = "Write a message for email body here \n \n";
$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";
// preparing attachments
$just = count($files);
for ($x = 0; $x < count($files); $x++) {
$file = fopen($patharray[$x], "rb");
$data = fread($file, filesize($patharray[$x]));
fclose($file);
$data = chunk_split(base64_encode($data));
if ($x < $just – 1) {
$message .= "–{$mime_boundary}\n";
} else {
$message .= "–{$mime_boundary}–\n";
}
$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";
if ($x
Hi Daniel E. The code you pasted is incomplete. Could you please re-paste? Cheers mate.
hey…
i upload multiple file first nd store it in a folder
nw can any1 teme hw to send dose files…..
Lost hours with other broken scripts till I find yours. You’re my saviour! Works like a charm!
If you want to send multiple email attachments with PHP using the mail function, search no more.
hi
For anybody still struggling with the extra empty text attachment, the following worked for me. I’ve only tested it when there will always be at least 1 attachment.
Change
$message .= “–{$mime_boundary}\n”;
to
if ($x<=count($files)-2)
{
$message .= "–{$mime_boundary}\n";
}
note there should be two hyphens before {$mime_boundary}, not 1