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

Ján*_*čko 2 php pdf phpmailer mpdf

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

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

但是,如果我在单独的PHP文件中生成PDF(不应修改),该怎么办-像这样-invoice.php:

...
$mpdf = new mPDF();
$mpdf->WriteHTML($html);
$mpdf->Output();
exit;
Run Code Online (Sandbox Code Playgroud)

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

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

电子邮件发送的内容正确,但是PDF附件已损坏,因此无法显示。如何正确编码?我尝试了其他几种方法,但文件已损坏或根本没有连接(在一种情况下,整个电子邮件正文为空)。

提前谢谢你的帮助!:)

Syn*_*hro 5

问题是您使用file_get_contents不正确;如您所用,它将获取的内容include.php,而不是其执行结果。您需要将其扩展为完整的URL,以便以这种方式获取它,尽管我建议不要这样做。让脚本生成PDF文件,然后使用mpdf的文件输出选项加载该文件

$mpdf = new mPDF();
$mpdf->WriteHTML($html);
$mpdf->Output('/path/to/files/doc.pdf', 'F');
Run Code Online (Sandbox Code Playgroud)

然后运行该脚本,并从PHPMailer附加生成的文件(然后删除该文件):

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

您可以通过使用方法的“返回字符串”输出模式(SOutputreturn从包含的文件中获取字符串来跳过外部文件方法:

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

然后:

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