Sending HTML emails with attachment with PHP

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) ) ;


	}
  1. Embedding images in HTML or CSS with PHP
  2. Block junk emails, spammers and temporary emails
  3. PHP code to check if remote mp3 exists
  4. Correct headers to download a CSV from PHP
  5. Fix html tags, close tags, repair bad quotes and more

16 comments

  1. Ayo

    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!

  2. calady

    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

  3. Tim B

    The line that defines $htmlMsg had the surrounding html and body tags stripped off during the upload.

  4. Pingback: php email attachment - PHP Solutions - Developers Q & A

Post a comment

You may use the following HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>