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

Laravel 9升级至11后邮件内嵌图片失效求助

Laravel 9 升级到 11 后邮件内嵌图片显示异常的替代解决方案

Laravel 从 9 版本升级到 11 版本后,邮件内嵌图片无法正常显示。原代码:

$message->embed(resource_path('assets/images/email/myimg.png'))

不再返回带 @symfony 后缀的 Content-ID(例如 f150f0a9b59076bc9768a5910cce5d7b@symfony),而是返回类似 JipwOYRW4e 的附件文件名,导致图片无法内嵌渲染。

以下是无需重写框架类的解决办法:

方法一:手动构建 Symfony DataPart

直接在邮件的构建逻辑中使用 Symfony 的原生组件创建内嵌资源,手动控制 Content-ID:

use Illuminate\Support\Str;
use Symfony\Component\Mime\Part\DataPart;
use Symfony\Component\Mime\Part\File;

public function build()
{
    $filePath = resource_path('assets/images/email/myimg.png');
    // 生成符合旧格式的 Content-ID
    $cid = Str::random(10) . '@symfony';
    $dataPart = (new DataPart(new File($filePath), $cid))->asInline();
    
    // 将资源添加到 Symfony 邮件实例
    $this->withSymfonyMessage(function ($message) use ($dataPart) {
        $message->addPart($dataPart);
    });

    return $this->view('emails.your-template')
        ->with(['imageCid' => "cid:$cid"]);
}

在邮件模板中直接使用传递的 Content-ID:

<img src="{{ $imageCid }}" alt="内嵌图片">

方法二:使用 embedData() 替代 embed()

改用 embedData() 方法直接传入图片二进制数据,该方法在 Laravel 11 中仍会生成标准的 Content-ID:

public function build()
{
    $imageData = file_get_contents(resource_path('assets/images/email/myimg.png'));
    // 生成带 @symfony 后缀的 Content-ID
    $cid = $message->embedData($imageData, 'myimg.png', 'image/png');

    return $this->view('emails.your-template')
        ->with(['imageCid' => $cid]);
}

模板中同样通过 {{ $imageCid }} 引用图片即可。

这两种方式均无需修改框架核心类,通过原生 API 或替代方法即可恢复内嵌图片的正常显示。

内容的提问来源于stack exchange,提问作者EquivalentBat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:52:07