Laravel生产环境密码重置邮件无法发送,提示password_resets表不存在求助
解决Laravel密码重置邮件无法发送及表不存在问题
看起来你的问题主要出在两个核心点:password_resets表的结构不符合要求,加上Gmail的SMTP配置有过时的地方,咱们一步步来搞定:
1. 先搞定password_resets表的问题
从错误日志能明确看到,系统找不到这个表——哪怕你手动建了,肯定是表结构不对,Laravel的密码重置功能对这个表的字段有严格要求。
正确的表结构SQL
直接通过你的数据库管理工具(比如phpMyAdmin、Navicat)执行下面的SQL语句,替换掉你之前手动建的表:
CREATE TABLE password_resets ( email VARCHAR(255) NOT NULL, token VARCHAR(255) NOT NULL, created_at TIMESTAMP NULL DEFAULT NULL, PRIMARY KEY (email) );
因为你是线上环境没法用php artisan migrate,直接跑SQL是最稳妥的方式。
2. 修复Gmail的SMTP配置坑
你提到开启了“低安全应用”权限,但Google早在2022年就停用这个功能了,而且端口用25也容易被服务器封禁,调整一下配置:
- 先给你的Gmail账号开启两步验证
- 去Google账号设置里创建一个应用专用密码,用这个密码替换
.env里的MAIL_PASSWORD - 把端口改成
587,这个是Gmail推荐的SMTP端口
修正后的.env邮箱配置:
MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=your-email@gmail.com MAIL_PASSWORD=你的应用专用密码 MAIL_ENCRYPTION=tls
3. 别漏了CSRF令牌!
看你贴的表单代码里没有@csrf字段,Laravel默认会验证CSRF,没有这个的话请求会直接被拦截,表单里必须加上:
<form action="{{ url('passwords/email') }}" method='post'> @csrf <!-- 一定要加这个! --> <input type="email" name='email' class="form-control" id="exampleInputPassword1" placeholder="Enter Your Email Here" style='text-align:center'> <button type='submit'>Send Link to Email to Reset Password</button> </form>
最后测试流程
做完上面三步后,再测试密码重置:
- 输入邮箱提交,看页面有没有返回“重置链接已发送”的提示
- 如果还是有问题,去
storage/logs里看最新的错误日志,排查剩余问题
内容的提问来源于stack exchange,提问作者contributor
相关产品推荐
相关产品推荐

