启用2步验证后Gmail API发件出现SMTP ERROR 454 4.7.0问题
解决SMTP ERROR 454 4.7.0 Too many login attempts问题(自定义域名Gmail+PHPMailer)
核心原因
这个错误是Google触发了登录/请求频率限制,即便使用XOAUTH2或应用密码,短时间内的高频请求、异常重试逻辑都可能触发该限制。
排查与解决步骤
检查脚本重试与并发逻辑
- 排查PHPMailer脚本是否存在无限制重试机制:比如发送失败后立即循环重试,短时间内大量请求直接触发限制。需添加指数退避重试,示例逻辑:
$retryCount = 0; $maxRetries = 3; $delay = 1; // 初始延迟1秒 do { try { $mail->send(); break; } catch (Exception $e) { $retryCount++; if ($retryCount >= $maxRetries) throw $e; sleep($delay); $delay *= 2; // 每次延迟翻倍 } } while ($retryCount < $maxRetries); - 确认是否存在多进程/多用户并发发送场景:比如网站批量触发邮件发送,导致瞬间请求量超限。可添加请求队列,控制每秒发送的邮件数量。
- 排查PHPMailer脚本是否存在无限制重试机制:比如发送失败后立即循环重试,短时间内大量请求直接触发限制。需添加指数退避重试,示例逻辑:
核查Google账号与Workspace设置
- 登录Google账号,进入「安全」页面查看最近登录活动:确认是否有异常登录记录,若有立即撤销所有非信任的应用授权。
- 应用密码验证:若使用应用密码,确保生成时选择的应用类型为「邮件」,且仅用于当前PHPMailer脚本,未在其他场景复用。
- 联系Google Workspace管理员:检查组织级别的邮件发送限制,是否有额外的频率管控策略。
优化PHPMailer的XOAUTH2配置
- 更新PHPMailer至最新稳定版:旧版本可能存在XOAUTH2令牌刷新的bug,导致重复请求触发限制。
- 缓存访问令牌:不要每次发送邮件都刷新令牌,访问令牌有效期约1小时,缓存有效令牌,仅在过期时使用刷新令牌获取新令牌,避免高频刷新请求。
- 确认客户端ID、密钥、刷新令牌的正确性:确保未被修改、重置,且权限范围包含
https://www.googleapis.com/auth/gmail.send。
等待限制解除与配额核查
- 若多次触发限制,Google的临时封禁可能超过24小时,需停止邮件发送2-3天,让限制完全解除后再测试。
- 确认账号发送配额:Google免费Gmail与Workspace账号的发送频率限制不同,Workspace账号配额更高,但短时间发送量突增仍会触发限制,核查是否超出当前账号的发送配额。
替代方案
- 改用Gmail API发送:PHPMailer支持Gmail API调用,API的请求限制更宽松,且能更好地跟踪请求状态。
- 切换第三方邮件服务:如SendGrid、Mailgun等,专门的邮件服务可避免Google的限制,同时支持自定义域名配置。
内容的提问来源于stack exchange,提问作者Z912118
相关产品推荐
相关产品推荐

