php密码重置邮件发送失败主因是smtp未连通:需确认mail_driver=smtp、gmail用应用专用密码、端口与加密方式严格匹配(tls+587或ssl+465),并清除laravel配置缓存。

PHP密码重置邮件发不出,大概率不是代码写错了,而是SMTP连接根本没建立成功——尤其在生产环境(比如cPanel、共享主机或云服务器)下,mail()函数基本不可用,必须走SMTP,且配置稍有偏差就会静默失败。
确认是否真在用SMTP
很多项目默认用 MAIL_DRIVER=mail,这其实是调用系统 sendmail,而绝大多数生产环境(尤其是cPanel、阿里云轻量应用服务器、腾讯云CVM)已禁用或未安装sendmail。Laravel、CodeIgniter 4等框架若没显式设为 smtp,就会 fallback 到不可靠的 mail 驱动。
- 检查
.env:确保MAIL_DRIVER=smtp(不是mail或空值) - Laravel 还要确认
config/mail.php中'default' => env('MAIL_DRIVER', 'smtp')没被硬编码改掉 - CI4 必须用
email.default.*前缀写 .env,email.production.*不会被自动加载
Gmail/主流邮箱必须用「应用专用密码」
Google 自2022年5月起彻底关闭“低安全性应用访问”,现在用 Gmail 账号密码直连 SMTP 必然失败,报错通常是 Could not authenticate 或 Failed to connect to server。
- 必须先开启 Google 账户的「两步验证」
- 再进入 myaccount.google.com/security → 应用专用密码,选「邮件」+「其他」,生成16位密码
-
MAIL_PASSWORD或$mail->Password必须填这个16位密码(去掉空格),不能是登录密码,也不能带感叹号等手动转义
端口与加密方式必须严格匹配
Gmail 官方只支持两种组合,混搭必连不上:
-
TLS 模式(推荐):
MAIL_ENCRYPTION=tls+MAIL_PORT=587 -
SSL 模式(兼容旧配置):
MAIL_ENCRYPTION=ssl+MAIL_PORT=465 - 注意:
MAIL_ENCRYPTION值必须小写(tls,不是TLS);PHPMailer 中对应SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS或ENCRYPTION_SMTPS
发完别忘了清缓存 & 测试连通性
修改 .env 后,Laravel 在生产环境不会自动生效——因为配置被缓存了。
- 运行三行命令强制刷新:
php artisan config:clearphp artisan cache:clearphp artisan config:cache - 用 Tinker 快速验证是否连得通:
php artisan tinker>> use Illuminate\Support\Facades\Mail;>> Mail::raw('test', function($m) { $m->to('your@gmail.com')->subject('SMTP OK'); });
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











