Laravel实现PDF文件邮件发送求助(新手开发者)
在Laravel里实现带PDF附件的邮件发送
1. 先创建邮件类
用Artisan命令快速生成邮件模板类:
php artisan make:mail SendInvoiceMail
生成的文件在app/Mail/SendInvoiceMail.php,后续核心逻辑都在这里写。
2. 准备PDF文件(两种常用方式)
本地已有PDF文件
如果PDF是提前生成好存在服务器里的,直接用文件路径即可,比如存放在public/invoices/目录下。
动态生成PDF(推荐用dompdf包)
要是需要根据数据实时生成PDF,先安装常用的转换包:
composer require barryvdh/laravel-dompdf
这个包能把Blade视图转成PDF,比如你写一个emails/invoice.blade.php视图,里面放发票的HTML结构,再用下面的代码生成PDF实例:
use Barryvdh\DomPDF\Facade\Pdf; // 传入视图和对应数据,生成PDF $pdf = Pdf::loadView('emails.invoice', ['order' => $order]);
3. 在邮件类里添加附件逻辑
打开SendInvoiceMail.php,找到build()方法,加入附件处理:
添加本地PDF的示例
public function build() { return $this->subject('您的订单发票已生成') // 指定邮件正文的视图 ->view('emails.invoice_notice') // 附加本地PDF:第一个参数是文件路径,as是收件人看到的文件名,mime是文件类型 ->attach(public_path('invoices/order_123.pdf'), [ 'as' => '订单123号发票.pdf', 'mime' => 'application/pdf', ]); }
添加动态生成PDF的示例
先在邮件类的构造函数里传入需要的数据(比如订单信息):
protected $order; public function __construct($order) { $this->order = $order; }
然后在build()方法里生成并附加PDF:
public function build() { // 用订单数据生成PDF $pdf = Pdf::loadView('emails.invoice', ['order' => $this->order]); return $this->subject('您的专属发票') ->view('emails.invoice_notice') // attachData直接传入PDF内容,无需提前保存到本地 ->attachData($pdf->output(), '您的订单发票.pdf', [ 'mime' => 'application/pdf', ]); }
4. 触发邮件发送
在控制器或业务逻辑里调用发送即可:
use App\Mail\SendInvoiceMail; use Illuminate\Support\Facades\Mail; // 假设从数据库获取订单数据 $order = Order::find(123); // 发送给指定收件人 Mail::to('customer@example.com')->send(new SendInvoiceMail($order));
常见踩坑提示
- 检查
.env里的邮件配置项(MAIL_MAILER、MAIL_HOST等),确保邮件基础发送功能正常 - 动态生成PDF时,服务器的
storage目录需要有写入权限 - 用dompdf转PDF时,视图尽量用内联CSS,避免外部样式加载失败导致PDF排版混乱
内容的提问来源于stack exchange,提问作者Peter Peter
相关产品推荐
相关产品推荐

