如何在Laravel 9或10中使用Laravel Mail服务实现邮件发送?
解决Laravel Mail类中附加dompdf生成PDF的问题
1. 确认dompdf环境配置
若尚未安装dompdf,先执行安装命令:
composer require barryvdh/laravel-dompdf
如需自定义配置,可发布扩展配置文件:
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
2. 编写Mail类逻辑
假设你的业务邮件类为InvoiceNotification,修改其build方法,嵌入PDF生成与附件逻辑:
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Barryvdh\DomPDF\Facade\Pdf; class InvoiceNotification extends Mailable { use Queueable, SerializesModels; public $invoiceData; // 构造方法接收业务数据 public function __construct($invoiceData) { $this->invoiceData = $invoiceData; } public function build() { // 加载PDF模板并生成PDF实例 $pdf = Pdf::loadView('pdf.invoice_template', $this->invoiceData); return $this->subject('您的订单发票已生成') // 设置邮件正文视图 ->view('emails.invoice_notify') // 附加PDF二进制内容,无需先存磁盘 ->attachData( $pdf->output(), "invoice_{$this->invoiceData['order_no']}.pdf", ['mime' => 'application/pdf'] ); } }
关键细节说明
Pdf::loadView():传入PDF对应的Blade视图(如resources/views/pdf/invoice_template.blade.php)和业务数据attachData():直接使用PDF的二进制输出作为附件,避免磁盘IO开销,同时指定文件名与MIME类型- 确保
$invoiceData包含生成PDF和邮件正文所需的所有变量(如订单号、用户信息、金额等)
3. 控制器中调用Mail类
<?php namespace App\Http\Controllers; use App\Mail\InvoiceNotification; use Illuminate\Support\Facades\Mail; class OrderController extends Controller { public function sendInvoice() { $invoiceData = [ 'order_no' => 'ORD-20240501-001', 'user_name' => '李四', 'total_amount' => 199.00, // 其他业务字段 ]; // 发送邮件到目标邮箱 Mail::to('user@example.com')->send(new InvoiceNotification($invoiceData)); return redirect()->back()->with('success', '发票邮件已发送'); } }
常见问题排查
- PDF生成空白:检查PDF视图路径是否正确、数据是否正常传递、视图内有无语法错误
- 附件无法打开:确认
mime类型为application/pdf,$pdf->output()返回有效二进制内容 - 邮件发送失败:核对
.env文件中MAIL_HOST、MAIL_PORT、MAIL_USERNAME等配置项是否正确
内容的提问来源于stack exchange,提问作者Dark knight
相关产品推荐
相关产品推荐

