PHPMailer - send PHP generated PDF (mPDF) as attachment
The problem is that you're using file_get_contents
incorrectly; as you've used it, it will fetch the contents of include.php
, not the results of its execution. You need to expand it to a full URL in order to have it fetched that way, though I would advise not doing that. Have the script generate a PDF file and then load that, using the file output option of mpdf:
$mpdf = new mPDF();
$mpdf->WriteHTML($html);
$mpdf->Output('/path/to/files/doc.pdf', 'F');
Then run that script and attach the resulting file from PHPMailer (and delete the file afterwards):
include 'invoice.php';
$mail = new PHPMailer();
...
$mail->addAttachment('/path/to/files/doc.pdf');
$mail->send();
unlink('/path/to/files/doc.pdf');
You could skip the external file approach by using the "return a string" output mode (S
) of the Output
method and return
ing the string from the included file:
$mpdf = new mPDF();
$mpdf->WriteHTML($html);
return $mpdf->Output('doc.pdf', 'S');
and then:
$pdf = include 'invoice.php';
$mail = new PHPMailer();
...
$mail->addStringAttachment($pdf, 'doc.pdf');
$mail->send();
Ján Janočko
Updated on July 14, 2022Comments
-
Ján Janočko almost 2 years
I know how to generate PDF using mPDF library and send it as attachment using PHPMailer - something like this:
... $emailAttachment = $mpdf->Output('file.pdf', 'S'); $mail = new PHPMailer(); $mail->AddStringAttachment($emailAttachment, 'file.pdf', 'base64', 'application/pdf'); ...
But what if I generate PDF in separate PHP file (that should not be modified) - like this - invoice.php:
... $mpdf = new mPDF(); $mpdf->WriteHTML($html); $mpdf->Output(); exit;
How can I attach this dynamically created PDF file using PHPMailer? I tried this:
$mail = new PHPMailer(); ... $mail->addStringAttachment(file_get_contents('invoice.php'), 'invoice.pdf', 'base64', 'application/pdf'); $mail->send();
Email is sent with correct content but PDF attachment is corrupted and thus cannot be displayed. How to encode it correctly? I tried few other ways but file is corrupted or is not attached at all (in one case, whole email body was blank).
Thank you for your help in advance! :)
-
Ján Janočko almost 7 yearsThanks, I ended up generating file, attaching and then unlinking it. Originally I wanted to avoid editing of PDF generating script and just use it as it is. So you say, that using full URL would do the job? It makes sense... Why would you not advise doing it this way?
-
Synchro almost 7 yearsBecause it adds a lot of overhead, increases attack surface on your app, makes the running of your code involve the web server unnecessarily. Passing the string directly will be the fastest and most efficient way.