You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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', '邮件发送成功!');
}

最后再检查两个小细节

  1. 确认你的邮件模板里变量名没拼写错——比如是不是写成了{{ $username }}而不是{{ $name }}?
  2. 如果用了队列发送邮件,记得重启队列worker,避免旧代码缓存搞事情:php artisan queue:restart

内容的提问来源于stack exchange,提问作者mafortis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:38:33