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
相关产品推荐
相关产品推荐

