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
相关产品推荐
相关产品推荐

