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

Laravel通知中如何传递自定义变量以动态修改邮件头部Logo?

Laravel通知中如何传递自定义变量以动态修改邮件头部Logo?

嘿,这个需求我之前做项目的时候刚好碰到过,其实核心就是把Logo的相关变量从通知类传递到邮件视图里,给你分步骤捋一捋具体怎么实现:

  • 第一步:在通知类中定义并传递Logo变量
    首先在你的通知类里,通过构造函数接收Logo的地址(或者base64编码内容,看你实际需求),把它存为类的属性,这样后续发邮件的方法就能直接调用。比如:

    class InvoiceNotification extends Notification
    {
        protected $emailContent;
        protected $logoInfo; // 定义存储Logo信息的属性
    
        // 构造函数接收业务内容和Logo参数
        public function __construct($emailContent, $logoInfo)
        {
            $this->emailContent = $emailContent;
            $this->logoInfo = $logoInfo;
        }
    
        // 指定通知渠道为邮件
        public function via($notifiable)
        {
            return ['mail'];
        }
    }
    
  • 第二步:在toMail方法中把变量传递到邮件视图
    接下来在toMail方法里,有两种常见实现方式,根据你是否要自定义全量邮件模板来选:

    方式一:使用完全自定义的邮件模板
    如果你想自己掌控整个邮件的样式结构,就用view方法指定你的blade模板,同时把Logo变量和其他内容一起传进去:

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject($this->emailContent['subject'])
            // 关联自定义模板并传递变量
            ->view(
                'emails.custom-invoice',
                [
                    'logoInfo' => $this->logoInfo,
                    'emailBody' => $this->emailContent['email_body'],
                    'payActionUrl' => url('/'),
                    'thankYouText' => 'Thank you for using our application!'
                ]
            )
            ->attachData(base64_decode($yourAttachmentData), 'invoice-detail.pdf'); // 你的附件逻辑
    }
    

    然后在resources/views/emails/custom-invoice.blade.php模板里,直接用变量渲染Logo:

    <div class="email-header">
        <!-- 如果是URL直接用src,是base64就拼接data URI -->
        <img src="{{ is_string($logoInfo) ? $logoInfo : 'data:image/png;base64,'.$logoInfo }}" 
             alt="Brand Logo" style="height: 50px;">
    </div>
    <!-- 其他邮件内容渲染 -->
    <div class="email-content">{!! $emailBody !!}</div>
    

    方式二:复用Laravel默认邮件组件(仅替换头部Logo)
    要是不想全量自定义,只想改默认模板的头部Logo,可以先发布Laravel的邮件视图资源:

    php artisan vendor:publish --tag=laravel-mail
    

    找到resources/views/vendor/mail/html/header.blade.php,修改组件逻辑支持接收Logo变量:

    @component('mail::header', ['url' => config('app.url')])
        <img src="{{ $logoInfo }}" alt="{{ config('app.name') }} Logo" style="height: 40px;">
    @endcomponent
    

    然后在通知类的toMail方法里,用with把Logo变量共享到视图中:

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject($this->emailContent['subject'])
            ->line(new HtmlString($this->emailContent['email_body']))
            ->action('Pay Invoice', url('/'))
            ->line('Thank you for using our application!')
            ->with(['logoInfo' => $this->logoInfo]) // 共享Logo变量到邮件视图
            ->attachData(base64_decode($yourAttachmentData), 'attachment.pdf');
    }
    
  • 第三步:触发通知时传入动态Logo参数
    最后在控制器或者业务逻辑里触发通知时,把对应场景的Logo信息传进去就行:

    // 比如从配置或数据库取动态Logo地址
    $dynamicLogo = 'https://your-brand.com/seasonal-logo.png';
    // 或者base64编码的图片内容
    // $dynamicLogo = base64_encode(file_get_contents(storage_path('app/logos/custom.png')));
    
    $user->notify(new InvoiceNotification($emailContent, $dynamicLogo));
    

这样就能根据不同业务场景动态替换邮件头部的Logo啦,操作起来没什么复杂的~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:34:39