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

Laravel非Markdown HTML邮件视图中$message变量未定义问题

解决Laravel 5.5非Markdown邮件中$message变量未定义的问题

这个报错的核心原因很明确:非Markdown格式的Laravel邮件模板不会自动注入$message变量,只有Markdown邮件才会默认提供这个变量供你调用embed方法。下面给你两种可行的解决方案:

方案一:在Mailable类中处理图片嵌入并传递CID到模板

修改你的NewUserWelcomeEmail.php,直接在build方法里用Mailable自身的embed方法处理图片,然后把生成的图片CID(Content ID)传递给视图:

class NewUserWelcomeEmail extends Mailable { 
    use SerializesModels; 
    public $inlineImageCid; // 定义公共变量,供视图直接使用

    public function build() {
        // 注意:这里要用本地文件路径,而非Web访问URL
        $imageLocalPath = storage_path('images/inline_image.png');
        
        // 嵌入图片并获取唯一CID
        $this->inlineImageCid = $this->embed($imageLocalPath);

        return $this->view('mails.new_user_welcome');
    } 
}

然后更新你的邮件模板new_user_welcome.blade.php,直接使用传递过来的CID:

@extends('layouts.mail') 
@section('content') 
<img src="{{ $inlineImageCid }}" alt="An inline image" /> 
@endsection

方案二:通过视图数据传递Mailable实例到模板

如果你更倾向于在模板层面处理嵌入逻辑,也可以把当前Mailable实例传递给视图,这样就能在模板里直接调用embed方法:

修改NewUserWelcomeEmail.php的build方法:

public function build() {
    return $this->view('mails.new_user_welcome')
                ->with('mailInstance', $this); // 将当前Mailable实例传给视图
}

然后在模板里使用这个实例完成图片嵌入:

@extends('layouts.mail') 
@section('content') 
<img src="{{ $mailInstance->embed(storage_path('images/inline_image.png')) }}" alt="An inline image" /> 
@endsection

额外注意事项

  • 不要用url('storage/images/inline_image.png')作为embed的参数,embed方法需要的是服务器本地文件路径,而非Web访问链接,所以要用storage_path生成正确的本地路径。
  • 确保storage/images/inline_image.png文件存在,并且Laravel拥有该文件的读取权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:32:46