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

PHPMailer - send PHP generated PDF (mPDF) as attachment

我知道如何使用 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 附件已损坏,因此无法显示。如何正确编码?我尝试了其他几种方法,但文件已损坏或根本没有附加(在一种情况下,整个电子邮件正文都是空白的)。

提前感谢您的帮助! :)

问题是您使用 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');

您可以使用 Output 方法的 "return a string" 输出模式 (S) 并从包含的文件中 returning 字符串来跳过外部文件方法:

$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();