Laravel使用Mailgun发送邮件报错:Serialization of 'Closure' is not allowed
解决Laravel中Mailgun发送邮件时的"Serialization of 'Closure' is not allowed"错误
问题原因
这个错误是因为你在邮件闭包中直接引用了$user对象,而该对象内部包含了无法被序列化的闭包(匿名函数)类型属性——即使你没显式使用队列,Laravel在处理邮件发送的某些环节仍会尝试序列化相关对象,从而触发这个错误。
解决方案
方案1:仅传递所需属性而非整个对象
避免传递完整的$user对象,只提取闭包需要的属性(比如邮箱),这样就不会触发对整个对象的序列化:
$details = [ 'email' => $request->email, 'password' => $request->password, ]; // 单独提取需要的属性 $userEmail = $user->email; Mail::send('emails.welcome', $details, function ($message) use ($userEmail) { $message->from('admin@mywebsite.tv', 'Admin'); $message->to($userEmail); });
方案2:确认邮件驱动为同步模式
检查是否无意中开启了邮件队列,确保邮件驱动是sync(即时发送,不进入队列):
在.env文件中设置:
MAIL_MAILER=sync
方案3:清理对象中的闭包属性(若必须传递整个对象)
如果业务需要传递完整的$user对象,先检查模型中是否存在闭包类型的自定义属性或访问器,手动移除这些属性后再传递:
// 假设$user有一个包含闭包的属性$customCallback unset($user->customCallback); Mail::send('emails.welcome', $details, function ($message) use ($user) { $message->from('admin@mywebsite.tv', 'Admin'); $message->to($user->email); });
内容的提问来源于stack exchange,提问作者Noman Ali
相关产品推荐
相关产品推荐

