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…

Gennaio 10, 2010

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


	}

Author

PHP expert. Wordpress plugin and theme developer. Father, Maker, Arduino and ESP8266 enthusiast.

Comments on “Sending HTML emails with attachment with PHP”

There are 15 thoughts

  1. lee murray ha detto:

    the problem with this script is that you can only send one attachment at a time.

  2. Vadim ha detto:

    Thank you, this is exactly what I have needed.

  3. Tim ha detto:

    This is excellent thanks.

  4. Dan ha detto:

    Excellent, thanks for the snippet well done.

  5. Ayo ha detto:

    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!

  6. sudeep ha detto:

    thanks

  7. Hemant Vaniya ha detto:

    Thank you very much, it is working excellent.

  8. az ha detto:

    a bit shitty – no file validation

  9. angel16mk ha detto:

    what does ‘rb’means in the 13-th row?

  10. Giulio Pons ha detto:

    rb means read for binary files, such as jpegs.

  11. calady ha detto:

    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

  12. Pragnesh Karia ha detto:

    File is attached , but blank attachment.
    Is there any code missing?

  13. Norm Jurgen ha detto:

    You’re wonderful! Thank you for sharing your mail_file function.

  14. Tim B ha detto:

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

Comments are closed