Edit working php mail() to include pdf attachment

Posted on 2008-06-20
Last Modified: 2008-06-20
I have the following code that currently sends an email based on session variables.  It works perfectly (I have changed the email addresses only to comply with EE rules of not showing your real email address).

I need to ammend the following code so that it always sends out an attachment called form.pdf (which is found in the root directory).  How do I edit my code to add an PDF attachment.
<?php session_start();?>


	$emailSubject = 'New Automated Email';

	$webMaster = '';

	$firstnameEM = $_SESSION['svFirstName'];

	$lastnameEM = $_SESSION['svLastName'];

	$companyEM = $_SESSION['svCompany'];

	$phoneEM = $_SESSION['svphone'];

	$emailEM = $_SESSION['svemail'];

	$dateEM = date('l, F dS Y.');

	$body = <<<EOD


First Name:  $firstnameEM <br><br>

Last Name:  $lastnameEM <br><br>

Company:  $companyEM <br><br>

Phone: $phoneEM <br><br>

Email:  $emailEM <br><br>

Date Completed Form:  $dateEM <br><br>


	/*$headers = "From: $emailField\r\n";  */

	$headers = "From:\r\n";


	$headers .= "Content-type: text/html\r\n";

	$success = mail($webMaster, $emailSubject, $body, $headers);

	$theResults = <<<EOD


echo "$theResults";



Open in new window

Question by:fastfind1
  • 2
LVL 48

Expert Comment

Comment Utility
use a mailer class for the attachment like

those classes are easy to use and code the mail correctly. Your code should be easy transformed to use those classes.
LVL 48

Expert Comment

Comment Utility
ups should be
LVL 14

Accepted Solution

agriesser earned 500 total points
Comment Utility
I was in the need for something similar some time ago and found a fully working "send_mail" implementation on

In your case, you'd only have to substitute the mail() invocation with send_mail().
I attached the code snippet, please give it a try.

The parameter "attachments" to the function shown below must be filled like this:

  $attachment[0] = array( "file" => $filename, "content_type" => "application/pdf" );

Please note that the "content_type" option has to be changed acording to the type of attachment you want to send.


 * send_mail() implementation (uses the PHP mail() function and allows for attaching

 * files

 * found on


function send_mail($to, $body, $subject, $fromaddress, $fromname, $attachments=false)




  # Common Headers

  $headers .= "From: ".$fromname."<".$fromaddress.">".$eol;

  $headers .= "Reply-To: ".$fromname."<".$fromaddress.">".$eol;

  $headers .= "Return-Path: ".$fromname."<".$fromaddress.">".$eol;    // these two to set reply address

  $headers .= "Message-ID: <".time()."-".$fromaddress.">".$eol;

  $headers .= "X-Mailer: PHP v".phpversion().$eol;          // These two to help avoid spam-filters

  # Boundry for marking the split & Multitype Headers

  $headers .= 'MIME-Version: 1.0'.$eol;

  $headers .= "Content-Type: multipart/mixed; boundary=\"".$mime_boundary."\"".$eol.$eol;

  # Open the first part of the mail

  $msg = "--".$mime_boundary.$eol;

  $htmlalt_mime_boundary = $mime_boundary."_htmlalt"; //we must define a different MIME boundary for this section

  # Setup for text OR html -

  $msg .= "Content-Type: multipart/alternative; boundary=\"".$htmlalt_mime_boundary."\"".$eol.$eol;

  # Text Version

  $msg .= "--".$htmlalt_mime_boundary.$eol;

  $msg .= "Content-Type: text/plain; charset=iso-8859-1".$eol;

  $msg .= "Content-Transfer-Encoding: 8bit".$eol.$eol;

  $msg .= strip_tags(str_replace(array("<br>", "<br />", "<br/>"), array("\n", "\n", "\n"), $body)) . $eol . $eol;

//  $msg .= strip_tags(str_replace("<br>", "\n", substr($body, (strpos($body, "<body>")+6)))).$eol.$eol;

  # HTML Version

  $msg .= "--".$htmlalt_mime_boundary.$eol;

  $msg .= "Content-Type: text/html; charset=iso-8859-1".$eol;

  $msg .= "Content-Transfer-Encoding: 8bit".$eol.$eol;

  $msg .= $body.$eol.$eol;

  //close the html/plain text alternate portion

  $msg .= "--".$htmlalt_mime_boundary."--".$eol.$eol;

  if ($attachments !== false)


    for($i=0; $i < count($attachments); $i++)


      if (is_file($attachments[$i]["file"]))


        # File for Attachment

        $file_name = substr($attachments[$i]["file"], (strrpos($attachments[$i]["file"], "/")+1));

        $handle=fopen($attachments[$i]["file"], 'rb');

        $f_contents=fread($handle, filesize($attachments[$i]["file"]));

        $f_contents=chunk_split(base64_encode($f_contents));    //Encode The Data For Transition using base64_encode();



        # Attachment

        $msg .= "--".$mime_boundary.$eol;

        $msg .= "Content-Type: ".$attachments[$i]["content_type"]."; name=\"".$file_name."\"".$eol;  // sometimes i have to send MS Word, use 'msword' instead of 'pdf'

        $msg .= "Content-Transfer-Encoding: base64".$eol;

        $msg .= "Content-Description: ".$file_name.$eol;

        $msg .= "Content-Disposition: attachment; filename=\"".$file_name."\"".$eol.$eol; // !! This line needs TWO end of lines !! IMPORTANT !!

        $msg .= $f_contents.$eol.$eol;




  # Finished

  $msg .= "--".$mime_boundary."--".$eol.$eol;  // finish with two eol's for better security. see Injection.


  ini_set(sendmail_from,$fromaddress);  // the INI lines are to force the From Address to be used !

  $mail_sent = mail($to, $subject, $msg, $headers);


  return $mail_sent;


Open in new window


Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

PDF files have been in the limelight due to its unmatched features.  Personal documents, emails, business reports and eBooks are all converted into PDF files owing to peerless features provided by it. Adding watermark to a PDF file is a method to se…
International Data Corporation (IDC) prognosticates that before the current the year gets over disbursing on IT framework products to be sent in cloud environs will be $37.1B.
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and … provides powerful tools for surveying targeted groups, and utilizing data from completed surveys to find trends, discover areas of demand or customer expectation, and make business decisions on products or services.

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

6 Experts available now in Live!

Get 1:1 Help Now