This function allows you to send an HTML email with a file attachment. To do this it’s necessary to read the file and encode it with base 64 and split it in small chunks, and write everything using mail headers.
The $fileatt parameter identify the filename to be sent. The $replyto is optional and allows you to specify a different reply-to address. The $from parameter specify the sender address. The other parameters are the same of the ones of the mail php function.
It returns true if succeeded.
function mail_file( $to, $subject, $messagehtml, $from, $fileatt, $replyto="" ) { // handles mime type for better receiving $ext = strrchr( $fileatt , '.'); $ftype = ""; if ($ext == ".doc") $ftype = "application/msword"; if ($ext == ".jpg") $ftype = "image/jpeg"; if ($ext == ".gif") $ftype = "image/gif"; if ($ext == ".zip") $ftype = "application/zip"; if ($ext == ".pdf") $ftype = "application/pdf"; if ($ftype=="") $ftype = "application/octet-stream"; // read file into $data var $file = fopen($fileatt, "rb"); $data = fread($file, filesize( $fileatt ) ); fclose($file); // split the file into chunks for attaching $content = chunk_split(base64_encode($data)); $uid = md5(uniqid(time())); // build the headers for attachment and html $h = "From: $from\r\n"; if ($replyto) $h .= "Reply-To: ".$replyto."\r\n"; $h .= "MIME-Version: 1.0\r\n"; $h .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n"; $h .= "This is a multi-part message in MIME format.\r\n"; $h .= "--".$uid."\r\n"; $h .= "Content-type:text/html; charset=iso-8859-1\r\n"; $h .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; $h .= $messagehtml."\r\n\r\n"; $h .= "--".$uid."\r\n"; $h .= "Content-Type: ".$ftype."; name=\"".basename($fileatt)."\"\r\n"; $h .= "Content-Transfer-Encoding: base64\r\n"; $h .= "Content-Disposition: attachment; filename=\"".basename($fileatt)."\"\r\n\r\n"; $h .= $content."\r\n\r\n"; $h .= "--".$uid."--"; // send mail return mail( $to, $subject, strip_tags($messagehtml), str_replace("\r\n","\n",$h) ) ; }
the problem with this script is that you can only send one attachment at a time.
Thank you, this is exactly what I have needed.
This is excellent thanks.
Excellent, thanks for the snippet well done.
This is absolutely beatiful. It’s a perfect code. The 1st of its kind that I’ve found on these Php mail/attachment issue. I’m so glad I stumbled on this website/post.
Imagine I’ve been frustrated for over 1 month searching online a code that could do this for me.
Men, I AM SOOOOOOOOOOOOOOOOOO HAAAAAAPPYYYYYYYYY!
Thanks and keep it up!
thanks
Thank you very much, it is working excellent.
a bit shitty – no file validation
what does ‘rb’means in the 13-th row?
rb means read for binary files, such as jpegs.
guys u need to help me coz i think am running out.i try to design a website where there is a button when clicked is supposed to attach a file to a website and i dont know where to start
File is attached , but blank attachment.
Is there any code missing?
You’re wonderful! Thank you for sharing your mail_file function.
The line that defines $htmlMsg had the surrounding html and body tags stripped off during the upload.