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

