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

Laravel邮件:如何将attachData传递至视图并实现内联图片

解决Laravel邮件中嵌入Base64 PNG图片的问题

我来帮你搞定这个Laravel邮件嵌入图片的问题——你之前的核心问题是混淆了attachData和embedData的用途,加上没正确处理Base64到二进制数据的转换,所以才一直没成功。下面一步步给你梳理解决方案:

第一步:修正控制器里的邮件发送逻辑

attachData是用来给邮件加普通附件的,不是用来内联显示图片的!要在邮件正文中嵌入图片,得用embedData方法,而且得先把Base64字符串解码成原始二进制数据。

修改后的控制器代码如下:

Mail::send(['html'=>'mailtransaction'], $data_content, function($msg) use ($to, $issueType, $base64){ 
    $msg->to($to);
    $msg->subject($issueType); 

    // 先处理Base64字符串:去掉可能带的"data:image/png;base64,"前缀,再解码成二进制
    $imageBinary = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $base64));
    
    // 生成内联图片的专属URL,然后把这个URL传给视图
    $inlineImageUrl = $msg->embedData($imageBinary, 'test.png', ['mime' => 'image/png']);
    
    // 将内联图片URL添加到视图可用的变量里
    $msg->with(['inlineImageUrl' => $inlineImageUrl]);
});

第二步:在Blade视图中调用内联图片

现在你只需要在视图里用刚才传递过来的inlineImageUrl变量,就能显示图片了。修改你的mailtransaction.blade.php中对应部分:

<!DOCTYPE html> 
<html> 
<head> </head> 
<body style="width:100%;"> 
<div style="border:0px solid #000; width:1000px !important;"> 
<div style="display: inline-block;"> 
<img src="{{$message->embed('storage/app/public/images/logo.png')}}" height="50px" width="50px"> 
</div> 
<div style="display: inline-block; vertical-align: top;"> 
<div style="font-size:24px; margin-bottom: -10px;">Fraud Detection Tool</div> 
<div>Suspicious Transaction details</div> 
</div> 
<hr style="border:0px; border-bottom:1px solid #000; width:1000px;"> 
<div class="container"> 
<!-- 这里放你原本的$msg内容 -->
{{ $msg }}
</div> 
<hr style="width:1000px;"> 
<div class="container_mail" style="width:600px !important;"> 
<!-- 用传递过来的内联图片URL显示图片 -->
<img src="{{ $inlineImageUrl }}" height="auto" style="max-width: 1000px"> 
</div> 
</div> 
</body> 
</html>

备选方案:直接在视图中处理Base64

如果你不想在控制器里预处理,也可以把Base64变量直接传到视图,在视图里完成解码和嵌入:

控制器修改:

Mail::send(['html'=>'mailtransaction'], array_merge($data_content, ['base64Image' => $base64]), function($msg) use ($to, $issueType){ 
    $msg->to($to);
    $msg->subject($issueType); 
});

视图修改:

<img src="{{ $message->embedData(
    base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $base64Image)),
    'test.png',
    ['mime' => 'image/png']
) }}" height="auto" style="max-width: 1000px">

为啥之前的方法没用?

  • attachData:这个方法是把文件作为附件添加,不会生成内联显示的CID链接,所以你在视图里根本调用不到它;
  • 直接嵌原始Base64:不少邮件客户端不支持src里直接写data:image/png;base64,...这种格式,用Laravel的embedData生成标准的CID链接,兼容性会好很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:56:48