laravel邮件模板必须放在resources/views/emails/目录下并小写中划线命名,且mailable类中需显式调用$this->view('emails.xxx'),否则报viewnotfoundexception;数据仅通过public属性或with()传入,须配纯文本模板text()方法。

直接写 resources/views/emails/welcome.blade.php 就能用,但必须在 Mailable 类里显式调用 $this->view('emails.welcome') —— Laravel 不会自动根据类名猜路径,不写这句就报 ViewNotFoundException。
模板文件放哪、命名怎么才生效
Laravel 只认两个位置:一是 resources/views/emails/xxx.blade.php,二是通过 php artisan vendor:publish --tag=laravel-mail 发布后的 resources/views/vendor/mail/。前者适合项目专属模板,后者适合全局样式统一。
-
resources/views/emails/是最常用、最可控的位置;不要放在mail/、notifications/或根目录下,否则要手动改view()路径 - 文件名用小写+中划线(如
order-confirmed.blade.php),避免大驼峰或下划线,Blade 不做转换 - 别依赖“类名自动映射”:哪怕你叫
OrderConfirmedMail类,Laravel 也不会去找order-confirmed.blade.php,除非你明确写$this->view('emails.order-confirmed')
数据怎么传进模板才安全可靠
模板里能访问的变量,只来自两处:public 属性(构造时赋值)或 with() 方法传入的数组。其他方式(比如在 build() 里临时设 $this->foo = 'bar')不会进视图。
- 推荐把核心业务对象声明为
public $user, $order;,在构造函数里接收并赋值,模板里直接用{{$user->name}} - 动态计算值(如 token、URL)用
with():比如->with(['reset_url' => URL::signedRoute('password.reset', ['id' => $this->user->id])]) - 避免在
build()里执行 Eloquent 查询——队列发送时模型可能已失效,查不到数据
内联 CSS 和响应式怎么处理才不出错
邮件客户端(尤其是 Outlook、Apple Mail)对 CSS 支持极差,@media 基本无效,外部样式表和 <style></style> 标签常被过滤,唯一靠谱的是内联 style 属性。
- 别写
<style>h1 { color: #333; }</style>—— 大部分客户端会删掉整段<style></style> - 用 Laravel 自带的 Markdown 邮件时,发布
--tag=laravel-mail-markdown后可修改resources/views/vendor/mail/html/themes/default.css,但最终仍需内联化(Laravel 会自动处理) - 自己写 Blade 模板时,老老实实用
<table style="width:100%; max-width:600px;">...,表格布局比 Flex/Grid 更稳 <li>图片路径务必用绝对 URL:<code><img src="https://img.php.cn/?x-oss-process=image/resize,p_40" alt="Laravel邮件模板怎么写_Laravel邮件视图方法【教程】">,相对路径在邮件里全失效
最易被忽略的一点:纯文本版本不是可选项。即使你只写了 HTML 模板,也得在 Mailable 中加 ->text('emails.welcome_plain'),否则某些客户端(如 Outlook 桌面版)会显示空白或乱码。这个文件不用复杂,就几行文字 + URL 即可。











