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

Laravel Markdown邮件嵌入HTML块无法正常渲染的解决方法

解决Laravel Markdown邮件中HTML块无法正常渲染的问题

核心问题分析

  1. 邮件客户端限制:几乎所有主流邮件客户端(Gmail、Outlook等)会出于安全原因屏蔽<script>标签,直接嵌入的JS代码无法执行。
  2. 变量解析失效:你在$content字符串中使用的{{$code}}是Blade语法,但字符串中的Blade代码不会被自动解析,导致变量无法替换。
  3. 内容过滤机制:Laravel Markdown邮件默认会对输出内容做安全清理,可能过滤掉部分属性或标签。

解决方案

方案一:直接在Blade模板中编写HTML(推荐)

将HTML内容直接放到邮件模板里,让Blade直接解析变量,避免字符串转义和解析问题:

修改Mailable类

// Mailable类代码
$greeting = 'Hi User';
$code = 'your-target-code'; // 替换为实际的变量值

return (new MailMessage())
    ->subject($subject)
    ->markdown('email', [
        'greeting' => $greeting,
        'code' => $code
    ]);

修改邮件模板

@component('mail::message')
{{ $greeting }}

<div id="mainDiv" data-widget="main" data-code="{{ $code }}"></div>

### 配置步骤:
请复制以下代码到你的网站对应位置:
```html
<script type="text/javascript" src="http://domain/js/main.js"></script>

@endcomponent

### 方案二:通过变量传递已处理的HTML
如果必须通过变量传递HTML内容,先在Mailable中完成变量替换,再传入模板:

#### 修改Mailable类
```php
// Mailable类代码
$greeting = 'Hi User';
$code = 'your-target-code';

// 手动替换变量,使用e()方法防止XSS
$content = '<div id="mainDiv" data-widget="main" data-code="' . e($code) . '"></div>';
$scriptCode = '<script type="text/javascript" src="http://domain/js/main.js"></script>';

return (new MailMessage())
    ->subject($subject)
    ->markdown('email', [
        'greeting' => $greeting,
        'content' => $content,
        'scriptCode' => $scriptCode
    ]);

修改邮件模板

@component('mail::message')
{{ $greeting }}

{!! $content !!}

### 配置步骤:
请复制以下代码到你的网站对应位置:
```html
{!! $scriptCode !!}

@endcomponent

## 关键注意事项
- 不要尝试在邮件中运行JS代码:所有主流邮件客户端都会屏蔽`<script>`标签,这是不可绕过的安全限制,只能引导用户复制代码到自己的网站中使用。
- 避免XSS风险:传递用户可控变量时,务必使用`e()`方法进行转义,防止跨站脚本攻击。

内容的提问来源于stack exchange,提问作者Govinda Lohani
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:33:30