* http://www.pgregg.com * * Function: Generate a valid MIME email with html and plain text elements * and attach any files as needed * * This file should be included by other php scripts * * Open Source Code: If you use this code on your site for public * access (i.e. on the Internet) then you must attribute the author and * source web site: http://www.pgregg.com/projects/ * You must also make this original source code available for download * unmodified or provide a link to the source. Additionally you must provide * the source to any modified or translated versions or derivatives. * * This software is Donationware - if you feel you have benefited from * the use of this tool then please consider a donation. The value of * which is entirely left up to your discretion. * http://www.pgregg.com/donate/ * */ // Function to generate a valid MIME email with html and plain text elements // and attach any files as needed // Usage notes: // At a minimum you need to pass in an HTML formatted message. // The plain text email can be supplied, or if left out (or you pass NULL) // then strip_tags() will be called on the HTML to generate the plain text. // Attachments: // In Version 2.0 - you simply passed in an array of filenames. These would // be encoded and attached as regular attachments to the email body. // In Version 2.1 - you can, optionally, provide a "string" type key to // the array value. This implies that this attachment is an in-line one // and is encoded accordingly. This only works for images. The HTML part // of the email should contain this string key as a PLACEHOLDER. The // placeholder text is replaced with a call to the image. // e.g. regular attachments: // $attachments = array('file1.txt', 'file2.jpg'); // attachment + inline: // $attachments = array('file1.txt', 'INLINEIMAGE'=>'file2.jpg'); // with inline images the string "INLINEIMAGE" is replaced with the // correct content marker to display the image inline when viewing. function GenerateMIMEMail( $html, $plain=NULL, $attachments=array(), $boundarybase=NULL) { $CRLF = "\n"; # Check your email injector - you may need \r\n if (is_null($plain)) // crude, but effective if you layout the html nicely $plain = str_replace(' ', ' ', strip_tags($html)); if (is_null($boundarybase)) $boundarybase = '==pgregg_Multipart_Boundary'; $mime_boundary1 = $boundarybase . '1_' . md5(time()); $mime_boundary2 = $boundarybase . '2_' . md5(time()+1); // Lets generate the email headers we are going to use $headers = ''; // Add MIME headers $headers .= "MIME-Version: 1.0$CRLF"; $headers .= "Content-type: multipart/mixed;$CRLF boundary=\"" . $mime_boundary1 . '";' . "$CRLF"; // Pre-generate the Content-ID: / cid: for the in-line attachment placeholders $placeholder_cid = array(); if (is_array($attachments) && count($attachments) > 0) { foreach ($attachments as $placeholder => $tmpfile) { if (is_readable($tmpfile)) { if (is_string($placeholder)) { # attachment is an inline one $tmpfilename = basename($tmpfile); $cid = uniqid() .'@'. mt_rand(100000,999999) .'-'. mt_rand(1000,9999); $html = preg_replace("/$placeholder/", "\"$tmpfilename\"", $html); $placeholder_cid[$placeholder] = $cid; } } } } // Now generate the body of the email $body = << 0) { foreach ($attachments as $placeholder => $tmpfile) { $tmpfilename = basename($tmpfile); if (function_exists('mime_content_type')) $tmp_mimetype = mime_content_type($tmpfile); else $tmp_mimetype = 'application/octet-stream'; if (is_readable($tmpfile)) { if (is_string($placeholder)) { # attachment is an inline one #$cid = uniqid() . '@' . mt_rand(100000,999999) . '-' . mt_rand(1000,9999); # Recover the previously generated Content-ID: for this attachment $cid = $placeholder_cid[$placeholder]; $body .= sprintf("--%s\nContent-Type: %s\n name=%s\nContent-Transfer-Encoding: base64\nContent-ID: <%s>\nContent-Description: %s\nContent-Location: %s\n\n", $mime_boundary1, $tmp_mimetype, $tmpfilename, $cid, $tmpfilename, $tmpfilename ); } else { $body .= sprintf("--%s\nContent-Type: %s\n name=%s\nContent-Transfer-Encoding: base64\nContent-Disposition: attachment;\n filename=\"%s\"\n\n", $mime_boundary1, $tmp_mimetype, $tmpfilename, $tmpfilename ); } $body .= chunk_split(base64_encode(file_get_contents($tmpfile))) . "\n"; } } } // Terminate the outer MIME boundary $body .= '--' . $mime_boundary1 . "--\n"; // We now have our headers, body and attachments correctly encoded return array($headers, $body); } ?>