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
相关产品推荐
相关产品推荐

