PHPMailer - 将PHP生成的PDF(mPDF)作为附件

时间:2017-06-07 08:28:06

标签: php pdf phpmailer mpdf

我知道如何使用mPDF库生成PDF并使用PHPMailer将其作为附件发送 - 如下所示:

...
$emailAttachment = $mpdf->Output('file.pdf', 'S');
$mail = new PHPMailer();
$mail->AddStringAttachment($emailAttachment, 'file.pdf', 'base64', 'application/pdf');
...

但是如果我在单独的PHP文件中生成PDF(不应该修改) - 如下所示 - invoice.php:

...
$mpdf = new mPDF();
$mpdf->WriteHTML($html);
$mpdf->Output();
exit;

如何使用PHPMailer附加此动态创建的PDF文件? 我试过这个:

$mail = new PHPMailer();
...
$mail->addStringAttachment(file_get_contents('invoice.php'), 'invoice.pdf',  'base64', 'application/pdf');
$mail->send();

发送的电子邮件内容正确但PDF附件已损坏,因此无法显示。如何正确编码?我尝试了其他一些方法,但文件已损坏或根本没有附加(在一个案例中,整个电子邮件正文都是空白的。)

提前感谢您的帮助! :)

1 个答案:

答案 0 :(得分:5)

问题是您未正确使用file_get_contents;当你使用它时,它将获取include.php的内容,而不是它的执行结果。您需要将其扩展为完整的URL,以便以这种方式获取它,尽管我建议不要这样做。让脚本生成PDF文件,然后使用the file output option of mpdf

加载该文件
$mpdf = new mPDF();
$mpdf->WriteHTML($html);
$mpdf->Output('/path/to/files/doc.pdf', 'F');

然后运行该脚本并从PHPMailer附加结果文件(并在之后删除该文件):

include 'invoice.php';
$mail = new PHPMailer();
...
$mail->addAttachment('/path/to/files/doc.pdf');
$mail->send();
unlink('/path/to/files/doc.pdf');

您可以跳过外部文件方法,使用"返回一个字符串" S方法的输出模式(Output)和return来自包含文件的字符串:

$mpdf = new mPDF();
$mpdf->WriteHTML($html);
return $mpdf->Output('doc.pdf', 'S');

然后:

$pdf = include 'invoice.php';
$mail = new PHPMailer();
...
$mail->addStringAttachment($pdf, 'doc.pdf');
$mail->send();