Laravel发送邮件报错:Attempt to read property "email" on null 求修复
问题分析
Attempt to read property "email" on null 错误说明你正在尝试读取一个null值的email属性,核心原因是传递给邮件系统的收件人对象/变量为null,或者在模板中直接访问了未初始化的null变量。以下是针对性的代码修正方案:
1. 修正 EmailController
确保你获取的收件人数据有效,避免传递null到邮件类:
错误示例
// EmailController.php public function sendProductEmail() { // 可能获取到不存在的用户,导致$user为null $user = User::find(999); Mail::to($user)->send(new ProductMail()); }
修正后代码
// EmailController.php use App\Models\User; use App\Mail\ProductMail; use Illuminate\Support\Facades\Mail; public function sendProductEmail() { // 方式1:使用findOrFail,找不到用户直接抛出异常 $user = User::findOrFail(1); // 方式2:手动判断用户是否存在 // $user = User::find(1); // if (!$user) { // return redirect()->back()->with('error', '收件人不存在'); // } // 直接传递邮箱字符串(避免依赖对象)或带有效数据的对象 Mail::to($user->email)->send(new ProductMail($user)); return redirect()->back()->with('success', '邮件发送成功'); }
2. 修正 ProductMail 类
确保邮件类正确接收并传递数据到模板,避免模板使用null变量:
错误示例
// ProductMail.php class ProductMail extends Mailable { public $user; public function __construct() { // 未初始化$user,导致模板中$user为null } public function build() { return $this->view('emails.product-template'); } }
修正后代码
// ProductMail.php use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use App\Models\User; class ProductMail extends Mailable { use Queueable, SerializesModels; public $user; // 构造函数强制接收User对象,确保传入数据有效 public function __construct(User $user) { $this->user = $user; } public function build() { return $this->view('emails.product-template') // 显式传递数据到模板(可选,增强可读性) ->with(['user' => $this->user]); } }
3. 修正 product-template.blade.php 模板
在模板中增加变量校验,避免直接访问null的属性:
错误示例
<!-- product-template.blade.php --> <p>您好,{{ $user->email }}</p>
修正后代码
<!-- product-template.blade.php --> <!-- 方式1:条件判断 --> @if(isset($user) && $user) <p>您好,{{ $user->email }}</p> @else <p>您好,访客</p> @endif <!-- 方式2:PHP 8+ 可选链+空值合并 --> <p>您好,{{ $user?->email ?? '访客' }}</p>
内容的提问来源于stack exchange,提问作者Muhammad Gunawan
相关产品推荐
相关产品推荐

