You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8本地邮件发送失败,连接localhost被拒绝求助

Laravel 8 密码重置邮件发送失败排查方案

核心错误分析

你遇到的错误Connection could not be established with host localhost :stream_socket_client(): unable to connect to tcp://localhost:587,说明Laravel实际尝试连接的是本地主机而非你配置的Gmail SMTP服务器,结合你的配置和代码,以下是具体排查步骤:

1. 修正SMTP主机地址错误

你的.env配置中MAIL_HOST存在拼写错误:

# 错误配置
MAIL_HOST=smtpgmail.com
# 正确配置
MAIL_HOST=smtp.gmail.com

缺少中间的英文点号,导致Laravel无法识别有效的SMTP服务器,进而 fallback 到默认的localhost发起连接。

2. 配置Gmail账户权限(关键)

Gmail对第三方应用发送邮件有严格限制,需根据账户情况调整:

  • 开启两步验证的账户:必须使用应用专用密码(App Password)替代原密码。操作路径:Google账号 → 安全 → 两步验证 → 应用密码 → 创建一个名为Laravel的专用密码,将其填入MAIL_PASSWORD。
  • 未开启两步验证的账户:需开启“不太安全的应用访问”(注:该选项目前已逐步被Google移除,优先推荐开启两步验证并使用应用密码)。

3. 清除配置缓存

本地环境修改.env后,Laravel可能仍读取缓存的旧配置,执行以下命令清除缓存:

php artisan config:clear
php artisan cache:clear

4. 代码优化与调试建议

  • 替换自定义密码重置逻辑:Laravel自带完整的密码重置系统,可大幅简化代码,直接使用:
    use Illuminate\Support\Facades\Password;
    
    public function forgotPassword(Request $request) {
        $request->validate(['email' => 'required|email']);
    
        $status = Password::sendResetLink(
            $request->only('email')
        );
    
        return $status === Password::RESET_LINK_SENT
            ? response(['message' => __($status), 'status' => 'Success'], 200)
            : response(['message' => __($status), 'status' => 'failed'], 404);
    }
    
  • 邮件发送改用Mailable类:相比Mail::send,Mailable类更易维护和调试,示例:
    // 先创建Mailable类:php artisan make:mail ForgotPasswordMail
    // 在ForgotPasswordMail类中定义视图和传递的token数据
    Mail::to($email)->send(new ForgotPasswordMail($token));
    

额外检查项

  • 确认本地网络未拦截587端口(可通过telnet测试:telnet smtp.gmail.com 587)。
  • 确保MAIL_FROM_ADDRESS与MAIL_USERNAME一致,避免触发Gmail的发件人验证机制。

内容的提问来源于stack exchange,提问作者Anamika Jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:25:57