如何解决Gmail SMTP服务器需安全连接或客户端未认证报错
问题根因
你遇到的SMTP身份验证报错,是谷歌2022年5月30日正式下线「低安全性应用访问」功能导致的——下线后所有直接使用账号主密码登录Gmail SMTP服务的第三方请求,都会被谷歌安全策略直接拦截,和你本地代码逻辑本身没有关系。
修复方案
你现有代码改动量最小的修复方式是改用谷歌应用专用密码做SMTP身份验证,不需要重构发送逻辑:
- 前置条件:用于发信的Gmail账号必须先开启两步验证,没有开启两步验证的账号无法生成应用专用密码
- 操作步骤:
- 登录对应Gmail的谷歌账号,进入「管理你的谷歌账号-安全」设置页
- 在「登录Google」板块找到「应用专用密码」入口,选择应用类型为「邮件」,设备根据你部署网站的服务器类型选择即可
- 点击生成后会拿到一组16位的应用专用密码,直接替换你原有代码里SMTP认证部分的主密码即可,其他代码完全不需要改动
核心代码替换参考:
// 仅替换密码部分,其他SMTP配置(地址、端口、SSL开启状态)保持原有即可 smtpClient.Credentials = new System.Net.NetworkCredential("sendemail@gmail.com", "替换为你生成的16位应用专用密码,无需保留生成时的空格");
替换完成后即可正常发信,应用专用密码是谷歌给第三方服务单独颁发的授权凭证,不会触发低安全性应用拦截,权限和主账号密码隔离,安全性比原来直接用主密码更高。
如果你的Gmail账号没有开启两步验证的条件,也可以选择改用Gmail API配合OAuth2.0授权的方式发信,但这个方案需要先在谷歌云平台创建项目、开通Gmail API权限、走OAuth授权流程拿凭证,代码改动量很大,不是特殊情况不推荐用。
额外优化建议
你现有代码还有两个可以顺手修复的问题:
- 直接拼接用户输入内容到HTML邮件正文的写法存在XSS注入风险,建议对
txt_name、txt_number、txt_email、txt_message几个输入框的内容先做HTML特殊字符转义,再拼接到邮件正文里,避免恶意用户提交脚本内容引发安全问题 - 不要在代码里硬编码邮箱账号和密码,建议把这类敏感配置存到站点的
web.config配置文件中做加密处理,避免源码泄露后邮箱被盗用 - 如果替换密码后依然报错,先检查部署网站的服务器到
smtp.gmail.com的587端口是否被防火墙、安全组规则拦截,确认网络连通性正常
内容的提问来源于stack exchange,提问作者suraj
相关产品推荐
相关产品推荐

