Laravel 10中1x1像素图片追踪邮件打开状态失败问题求助
问题修复方案
核心问题分析
- 请求方法不匹配:图片
src属性发起的是GET请求,但track_open路由定义为POST方法,邮件客户端只会发送GET请求,导致路由无法匹配,既不会更新open字段,也无法返回图片内容。 - 图片响应缺少正确头信息:返回图片时未设置
Content-Type为image/png,即便请求成功,邮件客户端也无法识别这是有效图片,因此显示破碎。
具体修复步骤
1. 修改路由请求方法
将track_open路由从POST改为GET,适配图片加载的请求类型:
// web.php Route::get('/images',[CampaignController::class,'index'])->name('track_open');
2. 修复控制器的图片响应逻辑
返回图片时设置正确的Content-Type头,同时优化图片读取方式:
public function index(Request $request) { $mail = Campaign::find($request->id); if ($mail) { $mail->open = 1; $mail->save(); } // 用Laravel内置方法返回图片并设置正确头信息 return response()->file(public_path('1x1.png'), [ 'Content-Type' => 'image/png', ]); }
3. 排除CSRF验证(必要操作)
邮件中的请求不会携带Laravel的CSRF令牌,需将追踪路由加入CSRF白名单:
打开app/Http/Middleware/VerifyCsrfToken.php,在$except数组中添加路由:
protected $except = [ '/images', ];
额外注意事项
- 确认
public/1x1.png文件存在且权限正常。 - 部分邮件客户端会默认阻止外部图片加载,用户需手动开启图片才能触发追踪,这是邮件安全机制限制,无法通过代码规避。
内容的提问来源于stack exchange,提问作者Tanjib Rubayet
相关产品推荐
相关产品推荐

