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

如何在Laravel Mailable模板中修改Header Logo并正确传递自定义变量

问题解决方法

核心错误原因

  • Mailable类的__construct方法不需要返回值,你写在构造里的return $this->markdown()完全无效,邮件的模板配置要写在build方法内
  • 你在build方法直接返回header子视图是错误的,header是整套邮件模板的嵌套组件,你单独给它传参不会在全局邮件渲染时生效,自然会报变量未定义

正确实现步骤

1. 修正ContactMail.php代码

Mailable的公共属性会自动传递到所有关联的邮件视图、子组件中,不需要手动with传参给子视图:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class ContactMail extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;
    // 定义为公共属性,所有邮件相关视图都可直接访问
    public $content;

    public function __construct()
    {
        // 建议用asset生成完整URL,避免邮件客户端无法加载相对路径图片
        $this->content = asset("storage/hg5zkMDJTAWaIjc8hH5jqtb5FGmOXfpccha2k0A4.png");
    }

    public function build()
    {
        // 这里返回你自定义的主邮件markdown模板即可
        return $this->markdown('emails.contact');
    }
}

2. 修正header.blade.php代码

注意给img的src属性加引号,避免解析错误:

<tr>
<td class="header">
<a href="{{ $url }}" style="display: inline-block;">
<img src="{{ $content }}" class="logo" alt="Logo">
</a>
</td>
</tr>

如果需要兼容其他邮件的默认logo,可以加个存在性判断:

<tr>
<td class="header">
<a href="{{ $url }}" style="display: inline-block;">
@isset($content)
    <img src="{{ $content }}" class="logo" alt="Logo">
@elseif (trim($slot) === 'Laravel')
    <img src="https://laravel.com/img/notification-logo.png" class="logo" alt="Laravel Logo">
@else
    {{ $slot }}
@endif
</a>
</td>
</tr>

3. 测试验证

现在你Controller里的test方法直接返回ContactMail实例即可正常预览,变量会自动生效。如果是实际发送邮件,调用Mail::to($address)->send(new ContactMail())即可。

内容的提问来源于stack exchange,提问作者Artur Müller Romanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:06:05