Flutter使用Mailer包发Gmail遇谷歌登录拦截,开启低安全权限仍无效
核心拦截原因
你碰到的印度用户端触发的「登录尝试被阻止」,本质是谷歌SMTP的风险校验规则触发,和你之前开启的「允许低安全应用访问」权限没有实际关联——谷歌在2022年就已经下线了这个开关对绝大多数个人Gmail账号的实际生效能力。尤其印度地区不少运营商的出口IP在谷歌的风险IP黑名单内,只要从这些IP发起SMTP连接,系统会直接拦截请求,根本不会走到你设置的低安全权限校验分支。
必须完成的配置调整
1. 替换认证方式,使用应用专用密码替代账号常规密码
- 想正常使用第三方SMTP认证,发信所用的谷歌账号必须先开启两步验证(2SV),未开启两步验证的账号,根本无法生成可用的SMTP认证凭证
- 开启两步验证后,进入账号安全板块的「应用专用密码」功能区,生成16位长度的专用密码,将代码中原本填写的谷歌账号明文密码,全部替换为该专用密码
- 这个专用密码仅对指定应用生效,就算泄露也不会影响账号本身的登录权限,是目前谷歌官方认可的、第三方应用通过SMTP发信的唯一合规方式
- 之前你在安卓模拟器上测试能正常发信,纯粹是因为测试环境的IP地址、网络行为和你账号的常用登录环境匹配,没有触发风险判定;当印度用户从本地网络发起连接时,和你之前的测试环境地理跨度极大,会直接被系统判定为账号被盗用,拦截请求
2. 调整SMTP连接参数,降低异常判定概率
- 固定使用SSL加密直连端口
465建立SMTP连接,不要沿用示例代码中常用的587(STARTTLS)端口,印度地区不少运营商会对587端口的流量做探测,被谷歌识别为非加密连接后会直接触发拦截 - 代码中明确指定认证机制为
AuthenticatorPlain(),避免部分跨境网络场景下的认证协商失败,被判定为异常连接请求 - 保留mailer包默认的User-Agent标识,不要自定义和浏览器、爬虫类工具类似的UA字符串,避免被系统识别为恶意批量连接
3. 高风险场景的兜底处理
- 完成前面的配置后,如果仍有部分用户触发拦截,需要在应用的发信失败逻辑中加入提示,引导用户进入自己谷歌账号的「安全-最近安全活动」板块,手动确认本次登录为本人操作
- 不要在代码中硬编码单个公共发信账号作为全局发信池,这类账号通常会在1-2周内被谷歌限制全区域的SMTP发信权限
常见踩坑提醒
- 不要再花费时间寻找「允许低安全应用访问」的配置入口,目前该入口对99%的普通Gmail账号处于隐藏状态,就算通过旧路径手动开启,也不会对新的跨区域连接请求生效
内容的提问来源于stack exchange,提问作者Thumbeti Sivaramaiah
相关产品推荐
相关产品推荐

