如何通过变量将后端本地图片传递到PHP Blade邮件模板并展示?
解决Laravel邮件模板中图片无法显示的问题
核心原因
邮件客户端无法直接访问服务器本地文件系统,所以不能用storage_path()、本地相对路径或未公开的文件路径来引用图片,必须通过邮件附件嵌入或公开可访问URL两种方式实现。
解决方案一:嵌入邮件附件(推荐,无需图片公开)
这种方式会把图片作为邮件的内嵌附件发送,兼容性最好,不受服务器访问限制。
修改邮件发送代码
在Mail::send的闭包中,使用embed()方法将本地图片转为邮件识别的CID(内容ID),并传递给模板:if (count($fecha_nacimiento) > 0) { error_log(" lo envie"); // 用use($directory)把外部变量传入闭包 Mail::send('mails/cumple', compact('nombre_cumple'), function ($mail) use ($directory) { $mail->from('energiasolar@grupowattsolar.com'); $mail->to('auxsistemas@grupowattsolar.com'); $mail->subject("Feliz Cumpleaños!!!"); $mail->headers = array( 'From' => 'Departamento de Recursos Humanos' ); // 生成图片的CID,public_path()拼接Laravel的public目录绝对路径 $imageCid = $mail->embed(public_path($directory)); // 将CID传递给模板 $mail->with(['imageCid' => $imageCid]); }); }注意:如果你的
$directory路径是coreui/public/img/brand/...,存在路径冗余,应改为相对于Laravelpublic目录的路径,比如coreui/img/brand/mpanesSolar.png(假设coreui是public下的子文件夹)。修改Blade模板代码
使用cid:前缀引用生成的CID:<img src="cid:{{ $imageCid }}" alt="Logo" height="50">
解决方案二:使用公开可访问URL(适用于生产环境)
如果图片已经部署到可公开访问的服务器(或开发环境用ngrok等工具映射本地端口),可以直接用asset()生成公开URL。
修正路径变量
确保$directory是相对于Laravelpublic目录的路径,比如:// 去掉多余的coreui/public/,改为相对public的路径 $directory='coreui/img/brand/mpanesSolar.png';Blade模板中引用
使用asset()生成完整的公开URL:<img src="{{ asset($directory) }}" alt="Logo" height="50">注意:本地开发时,
asset()生成的是http://localhost/...,邮件客户端无法访问,此时推荐用方案一。
你之前写法的问题分析
$directory->getPath():$directory是字符串变量,不是文件对象,调用方法会直接报错。storage_path():生成的是服务器本地绝对路径(如/var/www/project/storage/...),邮件客户端无法访问这个路径。src={{directory}}:缺少Blade变量语法(应该是{{ $directory }}),且即使修正,路径也是本地相对路径,邮件客户端无法识别。
内容的提问来源于stack exchange,提问作者Au Sistemas
相关产品推荐
相关产品推荐

