Laravel无法发送邮件:未定义变量$name问题求助
解决「Undefined variable: name」邮件发送报错问题
嘿,我来帮你搞定这个邮件发送的报错!首先咱们得搞清楚:这个错误不是说表单没传name值(毕竟你dd出来的数组里明明有"name"=>"tester"),而是你的邮件模板(或者处理邮件的代码)没拿到这个$name变量——简单说就是中间传递环节漏了。
下面分两种Laravel里最常见的邮件发送场景给你解决方案:
场景1:直接用Mail facade发送邮件
如果你的代码是直接调用Mail::send()这种方式,大概率是没把表单数据传给邮件视图。
你可能踩坑的写法
public function sendemailtoadmin(Request $request){ $this->validate($request, [ 'name' => 'required|max:255', 'email' => 'required|email', // 其他验证规则... ]); // 这里只传了闭包,但没把$request里的变量传给视图,模板自然找不到$name Mail::send('emails.admin_notification', function($message) use ($request) { $message->to('admin@yourdomain.com')->subject($request->subject); }); }
修正后的正确写法
要把需要的表单数据整理成数组,作为第二个参数传给Mail::send(),这样视图就能拿到所有变量了:
public function sendemailtoadmin(Request $request){ // 先做好验证,确保所有必填字段都有值 $this->validate($request, [ 'name' => 'required|max:255', 'email' => 'required|email', 'subject' => 'required', 'issue' => 'required', 'budget' => 'required', 'messagetext' => 'required' ]); // 把需要的表单字段提取成数组,方便传递 $formData = $request->only(['name', 'email', 'subject', 'issue', 'budget', 'messagetext']); // 第二个参数传$formData,视图就能直接用{{ $name }}这些变量了 Mail::send('emails.admin_notification', $formData, function($message) use ($request) { $message->from($request->email, $request->name); // 可以把发件人设为表单提交者 $message->to('admin@yourdomain.com')->subject($request->subject); }); return redirect()->back()->with('success', '邮件已发送成功!'); }
之后你的邮件模板emails.admin_notification.blade.php里,就能正常用{{ $name }}、{{ $messagetext }}这些变量啦。
场景2:用自定义Mailable类发送(Laravel推荐方式)
如果是用php artisan make:mail生成的Mailable类,那得在类里把需要的变量暴露给视图。
第一步:修改你的Mailable类
比如你的类叫AdminNotification,要在里面定义公共变量,或者在构造函数里接收数据:
namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class AdminNotification extends Mailable { use Queueable, SerializesModels; // 定义公共变量,视图可以直接访问这些变量 public $name; public $email; public $subject; public $issue; public $budget; public $messagetext; // 构造函数接收表单数据,赋值给上面的变量 public function __construct($formData) { $this->name = $formData['name']; $this->email = $formData['email']; $this->subject = $formData['subject']; $this->issue = $formData['issue']; $this->budget = $formData['budget']; $this->messagetext = $formData['messagetext']; } public function build() { return $this->subject($this->subject) // 设置邮件主题 ->view('emails.admin_notification'); // 指定邮件模板 } }
第二步:在控制器里调用这个Mailable类
public function sendemailtoadmin(Request $request){ $this->validate($request, [ 'name' => 'required|max:255', 'email' => 'required|email', // 其他验证规则... ]); $formData = $request->only(['name', 'email', 'subject', 'issue', 'budget', 'messagetext']); // 发送邮件,把$formData传给Mailable的构造函数 Mail::to('admin@yourdomain.com')->send(new \App\Mail\AdminNotification($formData)); return redirect()->back()->with('success', '邮件发送成功!'); }
最后再检查两个小细节
- 确认你的邮件模板里变量名没拼写错——比如是不是写成了
{{ $username }}而不是{{ $name }}? - 如果用了队列发送邮件,记得重启队列worker,避免旧代码缓存搞事情:
php artisan queue:restart
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

