
本文详解如何利用 dompdf 库将 html 内容渲染为 pdf,并以附件形式通过 phpmailer 发送至指定邮箱,涵盖 pdf 生成、文件保存与邮件配置全流程。
本文详解如何利用 dompdf 库将 html 内容渲染为 pdf,并以附件形式通过 phpmailer 发送至指定邮箱,涵盖 pdf 生成、文件保存与邮件配置全流程。
在 Web 开发中,常需将动态生成的 HTML 报表(如发票、订单确认单)自动转为 PDF 并邮件送达用户。DOMPDF 是一个成熟稳定的 PHP HTML-to-PDF 渲染库,但其 stream() 方法仅用于浏览器下载,无法直接用于邮件附件。要实现“生成 PDF + 邮件发送”,关键在于调用 $dompdf->output() 获取原始 PDF 二进制数据,再持久化为临时文件或直接作为字符串流处理。
以下是一个完整、可运行的实践示例:
<?php require_once 'vendor/autoload.php'; // 确保已通过 Composer 安装 dompdf/dompdf
use Dompdf\Dompdf;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
// 1. 生成 PDF
$dompdf = new Dompdf([
'defaultFont' => 'Helvetica',
'isRemoteEnabled' => true // 启用远程资源(如在线 CSS/图片)
]);
$dompdf->loadHtml(html_entity_decode($output)); // $output 为你的 HTML 字符串
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
// 2. 获取 PDF 二进制内容(不输出,不下载)
$pdfContent = $dompdf->output(); // 返回 string 类型的 PDF 原始字节流
// 3. 保存为临时文件(推荐用于调试和兼容性)
$tempPdfPath = sys_get_temp_dir() . '/invoice_' . uniqid() . '.pdf';
file_put_contents($tempPdfPath, $pdfContent);
// 4. 使用 PHPMailer 发送带附件的邮件
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com'; // 替换为你的 SMTP 服务器
$mail->SMTPAuth = true;
$mail->Username = 'your_email@gmail.com'; // 发件人邮箱
$mail->Password = 'your_app_password'; // Gmail 需使用应用专用密码
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->setFrom('your_email@gmail.com', 'Your App');
$mail->addAddress('recipient@example.com', 'Recipient Name');
$mail->isHTML(true);
$mail->Subject = 'Your Invoice PDF is Ready';
$mail->Body = 'Please find your invoice attached as a PDF file.';
// ✅ 关键:添加 PDF 附件(支持路径或内容流)
$mail->addAttachment($tempPdfPath, 'Invoice.pdf'); // 文件名可自定义
$mail->send();
echo 'Email sent successfully with PDF attachment.';
// 清理临时文件(发送成功后删除)
unlink($tempPdfPath);
} catch (Exception $e) {
error_log("Mailer Error: " . $mail->ErrorInfo);
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
?>
✅ 注意事项与最佳实践:
- 避免使用 stream() 或 download():二者会立即输出 HTTP 头并终止脚本,无法继续执行邮件逻辑;务必改用 output()。
- 临时文件安全:使用 sys_get_temp_dir() 创建临时路径,并在邮件发送成功后及时 unlink(),防止磁盘堆积。
- 内存敏感场景:若 PDF 较大或并发量高,可跳过文件落地,直接用 $mail->addStringAttachment($pdfContent, 'Invoice.pdf', 'base64', 'application/pdf') 以字符串方式附加(需确保 PHPMailer ≥ 6.5)。
- 字体与样式:DOMPDF 默认不支持中文,如需显示中文,请加载支持 UTF-8 的字体(如 simhei.ttf),并配置 @font-face 及 dompdf->set_option('defaultFont', 'simhei')。
- SMTP 配置:生产环境务必使用 TLS/SSL 加密连接,并启用 SMTP 认证;Gmail 用户需开启「两步验证」并生成「应用专用密码」。
掌握这一流程后,你即可将任何 HTML 报表自动化封装为专业 PDF,并无缝集成至通知系统、财务流水、电子合同等业务场景中。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










