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”

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

Recommended

WP doesn’t send email? try this

Snippets for sending emails with Wordpress

Febbraio 8, 2020

Modify the language attribute based on category in WordPress

How to modify the language attribute in your Wordpress theme using a specific value

Novembre 7, 2019

WordPress anyone can register, but no email confirmation

Many times it has happened to me that my WordPress installation properly send emails using wp_mail directly, specifing also the…

Agosto 25, 2015

Embedding images in HTML or CSS with PHP

This small function returns an encoded string to embed images, inline, inside your html/css code and reduce the number of…

Dicembre 4, 2013

Block junk emails, spammers and temporary emails

If you need an Email Validator Function, consider this version that includes also the check against common temporary mail services…

Dicembre 3, 2013

Reading mp3 informations with php (id3 tags)

Inside mp3 files there are often some usefull informations stored. Those data are called “id3 tags” and deal with Author…

Febbraio 22, 2010