Laravel发送邮件至Gmail图片无法显示问题求助
解决Laravel发送邮件时Gmail中图片显示破损的问题
我之前也碰到过一模一样的问题,Gmail对外部图片的代理处理确实有点“挑剔”,咱们一步步来搞定它:
1. 先确认图片URL的完整性
你提供的图片src看起来被截断了(https://evaluo.org/ev...),Gmail的图片代理根本无法解析不完整的链接。首先要确保Laravel生成的图片地址是完整的绝对URL,建议用框架自带的辅助函数生成:
<!-- 在邮件视图中使用url()或asset()生成正确的绝对路径 --> <img style="font-family:Avenir,Helvetica,sans-serif;box-sizing:border-box;max-width:100%;border:none;width:137px;height:68px" src="{{ url('images/your-logo.png') }}" alt="Logo">
生成后可以直接在浏览器里访问这个URL,确认图片能正常打开。
2. 改用内嵌图片(最稳妥的方案)
Gmail经常会对外部图片的代理转换出问题,把图片直接内嵌到邮件里就能彻底绕开这个问题。Laravel自带了图片内嵌的功能:
在邮件类的build方法中添加内嵌逻辑:
public function build() { // 用embed()方法内嵌本地图片,参数是图片的本地路径 $embeddedImage = $this->embed(public_path('images/your-logo.png')); return $this->view('emails.your-template') ->with(['embeddedImage' => $embeddedImage]); }
在邮件视图中引用内嵌的图片:
<img style="font-family:Avenir,Helvetica,sans-serif;box-sizing:border-box;max-width:100%;border:none;width:137px;height:68px" src="{{ $embeddedImage }}" alt="Logo">
这样图片会作为邮件的一部分发送,Gmail不会再去代理外部链接,自然就不会显示破损了。
3. 检查图片服务器的防盗链和响应头
如果坚持用外部图片,要确保你的图片服务器:
- 没有设置严格的防盗链规则(比如限制Referer),因为Gmail的代理请求Referer是谷歌域名,可能被你的服务器拦截
- 返回正确的
Content-Type响应头(比如image/png、image/jpeg),不要让浏览器猜图片类型 - 没有设置
X-Content-Type-Options: nosniff这类可能干扰Gmail代理解析的头
4. 清理Laravel配置缓存
有时候URL生成会因为缓存出问题,运行下面的命令清理缓存:
php artisan route:clear php artisan config:clear
内容的提问来源于stack exchange,提问作者Agi
相关产品推荐
相关产品推荐

