Laravel邮件附件本地正常生产环境缺失问题求助
解决Laravel部署到Ubuntu后邮件无附件问题
首先看代码里的致命小问题:
你写的判断条件里,数组键名多了个空格:$this->email['attachmentUrl '](注意attachmentUrl后面的空格),这会导致判断永远为false,根本不会执行附件添加逻辑!本地测试时可能没注意到这个空格,或者数据里的键名不带空格,直接把空格删掉改成$this->email['attachmentUrl'],这大概率能解决问题。
如果还不行,按以下步骤排查:
1. 确认是否进入附件逻辑
在if块前后添加日志,验证代码是否走到了附件处理部分:
Log::info('准备检查邮件附件,当前attachmentUrl值:'.($this->email['attachmentUrl'] ?? '空')); if(!empty($this->email['attachmentUrl'])) { Log::info('开始处理附件,文件路径:'.$file); // ... 剩余代码 Log::info('附件已添加,文件名:'.$filename); } else { Log::info('attachmentUrl为空,跳过附件'); }
然后查看Laravel日志(storage/logs/laravel.log),确认是否进入了if块。
2. 替换附件添加方式
用Laravel自带的attach方法代替attachData,直接传入文件路径,避免手动读取文件可能出现的问题:
// 替换原来的attachData代码 $message->attach($file, [ 'as' => $filename, 'mime' => $mimeType ]);
甚至可以省略mime参数,Laravel会自动检测文件的MIME类型:
$message->attach($file, ['as' => $filename]);
3. 检查文件读取权限
虽然你设置了chmod -R 775 storage,但要确认PHP执行用户(通常是www-data)是否属于storage目录的用户组。可以执行以下命令:
# 查看storage目录的用户和组 ls -ld /var/www/html/storage # 查看www-data所属组 groups www-data
如果storage的组不是www-data所属的组,执行:
chown -R www-data:www-data /var/www/html/storage
4. 捕获文件读取异常
手动读取文件时可能有隐藏错误,添加异常捕获:
try { $fileContent = file_get_contents($file); Log::info('文件读取成功,大小:'.strlen($fileContent).'字节'); $message->attachData($fileContent, $filename, ['mime' => $mimeType]); } catch (\Exception $e) { Log::error('读取附件文件失败:'.$e->getMessage().',文件路径:'.$file); }
查看日志里的错误信息,定位具体问题。
内容的提问来源于stack exchange,提问作者Sant Bohara
相关产品推荐
相关产品推荐

