C#调用Gmail SMTP发信失败 低安全应用访问方案咨询
问题根因
你碰到的5.7.0 Authentication Required报错,核心原因就是Google已经全面下线Gmail的「低安全应用访问」入口,不再支持第三方应用直接通过账号+登录密码的方式调用SMTP服务,你加的SmtpServer.UseDefaultCredentials = false;属于基础配置项,解决不了Google侧的权限限制,所以改完依然报错。
继续使用Gmail发信的修复方案
方案1:应用专用密码(改造成本最低,5分钟即可落地)
这个方案要求你的Gmail账号已经开启两步验证(2FA),未开启两步验证的账号不会显示应用专用密码入口:
- 登录Google账号,进入「管理Google账号」-「安全性」页面
- 在「登录Google」板块找到「应用专用密码」选项
- 应用类型选「其他」,自定义备注名比如「生产车间报表通知程序」,点击生成16位专用密码
- 调整原代码的两个问题:
- 把
UseDefaultCredentials = false的赋值移到Credentials赋值前面——这是SmtpClient的已知坑:如果先给Credentials赋值,再设置UseDefaultCredentials=false,之前赋的凭据会被直接清空,必然报认证错误 - 把Credentials里传入的原账号登录密码,替换成刚生成的16位应用专用密码,其他SMTP参数(smtp.gmail.com、587端口、开启SSL)无需改动
- 把
修正后的可运行代码:
try { MailMessage mail = new MailMessage(); System.Net.Mail.SmtpClient SmtpServer = new System.Net.Mail.SmtpClient("smtp.gmail.com"); string sender = "user@gmail.com"; mail.From = new MailAddress(sender); mail.To.Add("receiver@plastikon.com"); mail.Priority = MailPriority.High; mail.Subject = subject; mail.IsBodyHtml = true; mail.Body = ($"{body} \n Name of computer: { HostName} "); SmtpServer.Port = 587; // 注意赋值顺序:先关闭默认凭据,再设置自定义凭据 SmtpServer.UseDefaultCredentials = false; SmtpServer.EnableSsl = true; // 密码替换为生成的16位应用专用密码,不要填原账号登录密码 SmtpServer.Credentials = new System.Net.NetworkCredential("user@gmail.com", "xxxxxxxxxxxxxxxx"); SmtpServer.Send(mail); }
方案2:Gmail API OAuth2认证(Google官方推荐方案)
如果对安全性要求更高,可以去Google Cloud控制台创建项目,启用Gmail API,配置OAuth2.0客户端凭据,程序走OAuth授权流程拿到访问令牌后调用API发信。这个方案不需要使用固定密码,权限粒度更细,但配置流程比应用专用密码复杂,适合长期维护的正式生产系统使用。
额外提醒:微软已经把System.Net.Mail.SmtpClient标记为过时类,存在不少已知的协议兼容性bug,新写代码建议换成开源的MailKit库实现邮件发送,对TLS、现代认证方式的支持更好,踩坑概率低很多。
生产场景更推荐的替代发信方案
车间生产系统的核心要求是稳定,不要因为第三方平台规则调整、网络波动导致通知中断,更推荐下面这些方案:
- 换用企业自有邮箱SMTP:从你代码里的收件人域名看,你们公司有自己的企业邮箱,直接找IT部门索要企业邮的SMTP地址、端口、发信账号密码即可,企业邮一般不会随意调整密码认证规则,内网访问稳定性也更高。
- 接入第三方事务邮件服务:海外的SendGrid、Mailgun,国内的腾讯云SES、阿里邮件推送这类服务,都提供标准SMTP和HTTP API两种发信方式,有明确的服务可用性承诺,自带发信日志、失败重试、告警能力,发信送达率也有保障,免费额度足够覆盖内部报表通知的发信量。
- 内网部署邮件转发服务:如果车间网络对公网访问有严格限制,可以在内网服务器搭Postfix之类的轻量邮件转发服务,本地程序只需要把邮件发给内网转发节点,由转发节点统一完成公网投递,避免公网服务波动直接影响生产线的程序运行。
内容的提问来源于stack exchange,提问作者hugodavidx
相关产品推荐
相关产品推荐

