Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Edit working php mail() to include pdf attachment

Posted on 2008-06-20
3
Medium Priority
?
977 Views
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();?>
<?php
	$emailSubject = 'New Automated Email';
	$webMaster = 'someone@fakeemail.com';
	$firstnameEM = $_SESSION['svFirstName'];
	$lastnameEM = $_SESSION['svLastName'];
	$companyEM = $_SESSION['svCompany'];
	$phoneEM = $_SESSION['svphone'];
	$emailEM = $_SESSION['svemail'];
	$dateEM = date('l, F dS Y.');
	$body = <<<EOD
<br><hr><br>
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>
 
EOD;
 
	/*$headers = "From: $emailField\r\n";  */
	$headers = "From:  fake@email.com\r\n";
	
	$headers .= "Content-type: text/html\r\n";
	$success = mail($webMaster, $emailSubject, $body, $headers);
	$theResults = <<<EOD
 
EOD;
echo "$theResults";
	
 
?>

Open in new window

0
Comment
Question by:fastfind1
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 48

Expert Comment

by:hernst42
ID: 21830168
use a mailer class for the attachment like
http://phpmailers.f.net
http://swiftmailer.sf.net

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

Expert Comment

by:hernst42
ID: 21830172
ups should be http://phpmailer.sf.net
0
 
LVL 14

Accepted Solution

by:
agriesser earned 2000 total points
ID: 21830228
I was in the need for something similar some time ago and found a fully working "send_mail" implementation on php.net.

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=array(0);
  $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 http://php.net
 */
function send_mail($to, $body, $subject, $fromaddress, $fromname, $attachments=false)
{
  $eol="\r\n";
  $mime_boundary=md5(time());
 
  # 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();
        $f_type=filetype($attachments[$i]["file"]);
        fclose($handle);
 
        # 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.
 
  # SEND THE EMAIL
  ini_set(sendmail_from,$fromaddress);  // the INI lines are to force the From Address to be used !
  $mail_sent = mail($to, $subject, $msg, $headers);
 
  ini_restore(sendmail_from);
 
  return $mail_sent;
}

Open in new window

0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A publishing tool, a Version Control System, or a Collaboration Platform! These can be some of the defining words for the two very famous web-hosting Git repositories: Bitbucket and Github. Git is widely used amongst the programmers and developers f…
These days, all we hear about hacktivists took down so and so websites and retrieved thousands of user’s data. One of the techniques to get unauthorized access to database is by performing SQL injection. This article is quite lengthy which gives bas…
Use Wufoo, an online form creation tool, to make powerful forms. Learn how to selectively show certain fields based on user input using rules to gather relevant information and data from your forms. The rules feature provides you with an opportunity…
In this fifth video of the Xpdf series, we discuss and demonstrate the PDFdetach utility, which is able to list and, more importantly, extract attachments that are embedded in PDF files. It does this via a command line interface, making it suitable …
Suggested Courses

636 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