Attaching a PDF on the fly using mPDF and PHPmailer

Paul Dessert picture Paul Dessert · Apr 25, 2013 · Viewed 7.4k times · Source

I'm using mPDF to generate PDF's when a button is clicked. I am looking for a way to add the PDF to an attachment using PHPmailer. Here is what I've tried:

$mpdf = new mPDF(); 
$mpdf->WriteHTML($output);
$emailAttachment = $mpdf->Output('filename.pdf','S');
$emailAttachment = chunk_split(base64_encode($emailAttachment));    

require_once('/inc/user_controller.php');
require_once('/inc/PHPMailer/class.phpmailer.php');
$user = new user();
$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch

    $currentUserInfo = $user->userDetails($userId);

    try {
      $mail->AddAddress($currentUserInfo['emailAddress'], $currentUserInfo['firstName']);
      $mail->SetFrom('[email protected]', 'First Last');
      $mail->AddReplyTo('[email protected]', 'First Last');
      $mail->Subject = 'Your file is attached';
      $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
      $mail->MsgHTML("This is a test");
      $mail->AddAttachment($emailAttachment);      // attachment
      $mail->Send();
      echo "Message Sent OK</p>\n";
    } catch (phpmailerException $e) {
      echo $e->errorMessage(); //Pretty error messages from PHPMailer
    } catch (Exception $e) {
      echo $e->getMessage(); //Boring error messages from anything else!
    }

I get this error "Could not access file:" then a bunch of junk, which I assume comes from the base64_encode. Ideally, the PDF would display or download and be emailed as well without saving a copy on my server. I can live with a temp file being created, but haven't tried that yet.

I've tested the email functionality and it works without adding an attachment, so I know the issues is with mPDF and attaching it properly.

Answer

Harry B picture Harry B · May 19, 2013

When you use mpdf's S option the file is returned as a string and the file name parameter is ignored.

However phpmailer's addAttachment function takes a file path as its first parameter not a file as a string, hense the error you are seeing.

You should take a look at an alternative phpmailer function called AddStringAttachment:

AddStringAttachment($string,$filename,$encoding,$type)

http://phpmailer.worxware.com/index.php?pg=tutorial#3.2