
本文详解 laravel 应用连接 gmail smtp 时出现“username and password not accepted”错误的完整解决方案,涵盖两步验证启用、app password 生成、.env 配置修正及代码注意事项。
本文详解 laravel 应用连接 gmail smtp 时出现“username and password not accepted”错误的完整解决方案,涵盖两步验证启用、app password 生成、.env 配置修正及代码注意事项。
当 Laravel 项目使用 Gmail 作为 SMTP 服务发送邮件时,报错 Failed to authenticate on SMTP server... 535-5.7.8 Username and Password not accepted 是典型的身份认证失败提示。根本原因在于:Gmail 已全面停用「普通密码登录」SMTP 的方式,必须改用「应用专用密码(App Password)」配合两步验证(2-Step Verification)启用后才能通过 SMTP 认证。
✅ 正确配置步骤(Gmail + Laravel)
1. 启用 Google 账户两步验证
- 登录 Google 账户安全中心
- 找到 “两步验证” → 点击“开启”并完成设置(需手机或安全密钥验证)
- ⚠️ 注意:必须使用独立的 Gmail 测试账号(如 phptest01072003@gmail.com),切勿使用已绑定重要服务的主账号。
2. 生成 App Password(关键!)
- 在开启两步验证后,返回同一安全页面 → 找到 “应用专用密码”(App passwords)
- 点击生成 → 选择应用类型为 “邮件”,设备选 “其他(自定义名称)”(例如填 Laravel-SMTP)
- Google 将生成一个 16 位一次性密码(如 abcd efgh ijkl mnop),复制此密码(不含空格) —— 这才是 .env 中应填写的 MAIL_PASSWORD
❗ 错误做法:直接使用 Gmail 账户登录密码(会失败);或未开启两步验证就尝试生成 App Password(选项不可见)。
3. 修正 .env 配置(重点格式与值)
MAIL_MAILER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=phptest01072003@gmail.com # ✅ 必须是完整邮箱地址(非别名) MAIL_PASSWORD=abcd1234efgh5678 # ✅ 替换为上一步生成的16位App Password(无空格) MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=phptest01072003@gmail.com # ✅ 建议显式设置(避免null导致from校验失败) MAIL_FROM_NAME="HJ KING"
- MAIL_USERNAME 和 MAIL_FROM_ADDRESS 必须一致且为真实 Gmail 地址;
- MAIL_PASSWORD 绝对不可包含空格或特殊字符(App Password 本身不含空格,粘贴时请手动删除所有空格);
- 若仍失败,可临时尝试 MAIL_PORT=465 + MAIL_ENCRYPTION=ssl 组合(但推荐优先用 587/tls)。
4. 优化邮件发送代码(修复潜在问题)
您原始代码中存在两个风险点:
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- 是 Cloudflare 邮箱保护混淆写法,实际 .env 中应为纯文本邮箱;
- Mail::send() 中 from() 使用了 HTML 标签包裹的邮箱,会导致发信身份被 Gmail 拒绝。
✅ 修正后的控制器方法示例:
public function html_email()
{
$data = ['name' => 'HJ KING'];
try {
Mail::send('layout.forgotpasswordmodel', $data, function ($message) {
$message->to(session('forgotemail'), 'HII, ' . session('forgotfname'))
->subject('ForgotPassword')
->from(env('MAIL_FROM_ADDRESS'), env('MAIL_FROM_NAME')); // ✅ 显式读取.env配置
});
return redirect()->back()->with('success', 'MAIL SENT SUCCESSFULLY');
} catch (\Exception $e) {
\Log::error('Email sending failed: ' . $e->getMessage());
return redirect()->back()->withErrors(['email' => 'Failed to send email. Check SMTP config.']);
}
}
5. 其他必要检查项
- ✅ 确认 Gmail 账号未开启「安全性较低的应用访问权限」(该选项已弃用,不再有效);
- ✅ 检查是否误启用了「Captcha 验证」——若近期频繁失败登录,Google 可能临时锁定 SMTP 访问,需访问 https://www.php.cn/link/1d166f79c869c8d4a03e578e0e4e8ad8 解锁;
- ✅ Laravel 缓存配置:修改 .env 后务必执行
php artisan config:clear php artisan cache:clear composer dump-autoload
? 提示:生产环境建议使用专业邮件服务(如 Mailgun、Postmark 或 SendGrid),既规避 Gmail 限制,又提升送达率与可监控性。
通过以上四步严格配置,99% 的 Gmail SMTP 认证失败问题均可解决。核心口诀:开两步验证 → 生 App Password → 配一致邮箱 → 清缓存重试。










