You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中使用Dompdf生成PDF并添加为邮件附件的问题

解决Laravel中Dompdf生成PDF并作为邮件附件的问题

两种实现方案:直接附加PDF内容 / 先保存再附加


方案一:直接将PDF内容作为邮件附件(无需提前保存到服务器)

无需额外保存文件,直接用Dompdf生成的二进制内容传给Laravel邮件的attachData()方法即可:

// 初始化Dompdf并生成PDF
$document = new Dompdf($options);
$document->loadHtml($html);
$document->setPaper('a4', 'portrait');
$document->render();

// 获取PDF原始二进制内容
$pdfContent = $document->output();

// 发送邮件
SendMail::send('mail_templates.default', $data, function ($message) use ($pdfContent) {
    $message->from('us@example.com', 'Laravel')
            ->to('foo@example.com')
            ->cc('bar@example.com');
    
    // 直接附加PDF内容,指定邮件中显示的文件名
    $message->attachData($pdfContent, 'filename.pdf', [
        'mime' => 'application/pdf',
    ]);
});

方案二:先将PDF保存到服务器,再作为附件发送

如果需要将PDF留存到服务器,可借助Laravel的文件存储系统保存后,通过文件路径附加:

// 初始化Dompdf并生成PDF
$document = new Dompdf($options);
$document->loadHtml($html);
$document->setPaper('a4', 'portrait');
$document->render();

$pdfContent = $document->output();
$fileName = 'filename.pdf';

// 保存到storage/app/public目录(可根据需求切换存储磁盘)
Storage::disk('public')->put($fileName, $pdfContent);

// 获取文件的服务器完整路径
$filePath = storage_path('app/public/' . $fileName);

// 发送邮件
SendMail::send('mail_templates.default', $data, function ($message) use ($filePath) {
    $message->from('us@example.com', 'Laravel')
            ->to('foo@example.com')
            ->cc('bar@example.com');
    
    // 通过文件路径附加,可自定义邮件中显示的文件名
    $message->attach($filePath, [
        'as' => 'filename.pdf',
        'mime' => 'application/pdf',
    ]);
});

关键注意点

  • Dompdf的output()方法默认返回PDF的二进制内容,无需使用Output('E')这类旧版参数,直接调用即可。
  • 优先使用attachData()方案,避免不必要的文件IO操作,更高效;若需留存文件再选择保存后附加。
  • 若使用public存储磁盘,需执行php artisan storage:link生成软链,才能通过公开URL访问保存的PDF(如果有需要的话)。

内容的提问来源于stack exchange,提问作者Azura Zaber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:25:18