如何通过C#安全访问自有Gmail账号发送邮件(替代低安全应用权限)
老兄,我太懂你这情况了——谷歌早就逐步淘汰「低安全应用访问权限」了,现在那玩意儿基本没法用了。不过别慌,有两个靠谱的安全方案适配C#发送Gmail,完全满足你只发邮件的需求,给你掰扯清楚:
方案一:应用专用密码(适合个人账号,操作最简单)
这个方案只适合已经开启两步验证的Gmail账号,优点是几乎不用改原来的代码,换个密码就行:
- 先确认你的Gmail账号开了两步验证,没开的话先去谷歌账号安全设置里开启
- 登录谷歌账号的「安全」页面,找到「应用专用密码」选项(只有开了两步验证才会显示)
- 新建一个应用专用密码,选「邮件」作为应用类型,设备随便选个「其他」,生成后会得到一串16位的密码
- 把你原来C#代码里的密码替换成这串16位密码,其他配置完全不变,因为你已经用了SSL,代码示例如下:
var smtpClient = new SmtpClient("smtp.gmail.com", 587) { UseDefaultCredentials = false, Credentials = new NetworkCredential("mygmailaccount@gmail.com", "这里填生成的16位应用专用密码"), DeliveryMethod = SmtpDeliveryMethod.Network, EnableSsl = true };
这个方案的安全性比低安全应用高一大截,而且操作成本极低,适合个人日常使用。
方案二:OAuth 2.0(适合开发者/长期稳定场景)
如果你是开发者,或者想长期稳定使用(毕竟谷歌以后可能还会调整政策),推荐用OAuth 2.0配合MailKit(.NET官方推荐替代SmtpClient的邮件库),步骤如下:
- 先去谷歌云平台创建一个项目,启用「Gmail API」
- 创建OAuth 2.0客户端ID,选择「桌面应用」类型,拿到客户端ID和客户端密钥
- 安装NuGet包:
Install-Package MailKit和Install-Package MimeKit(如果用.NET Core/.NET 5+,用dotnet add package命令也行) - 编写发送邮件的代码,示例如下:
using MailKit.Net.Smtp; using MailKit.Security; using MimeKit; using Google.Apis.Auth.OAuth2; using System.Threading.Tasks; public async Task SendGmailWithOAuth() { // 构造邮件内容 var email = new MimeMessage(); email.From.Add(new MailboxAddress("你的名字", "mygmailaccount@gmail.com")); email.To.Add(new MailboxAddress("收件人名字", "recipient@example.com")); email.Subject = "测试邮件(OAuth 2.0)"; email.Body = new TextPart("plain") { Text = "这是用OAuth 2.0+MailKit发送的测试邮件" }; // 获取OAuth 2.0令牌 var credential = GoogleWebAuthorizationBroker.AuthorizeAsync( new ClientSecrets { ClientId = "你的客户端ID", ClientSecret = "你的客户端密钥" }, new[] { "https://mail.google.com/" }, // 申请Gmail的全权限,只发邮件也需要这个 scope "user", System.Threading.CancellationToken.None ).Result; // 发送邮件 using (var smtpClient = new SmtpClient()) { await smtpClient.ConnectAsync("smtp.gmail.com", 587, SecureSocketOptions.StartTls); await smtpClient.AuthenticateAsync(credential.Token); await smtpClient.SendAsync(email); await smtpClient.DisconnectAsync(true); } }
第一次运行的时候会弹出谷歌的授权页面,授权后令牌会自动保存,后续运行就不用再授权了。而且MailKit比旧的SmtpClient功能更全,也更稳定,.NET 5+里SmtpClient已经被标记为过时了,迁移过来更靠谱。
额外注意点
- 如果你用的是.NET Framework旧版本,SmtpClient还能凑合用,但还是建议尽早迁移到MailKit
- 应用专用密码必须要开启两步验证才能用,没开的话要么开两步验证,要么直接用OAuth 2.0
- 谷歌对Gmail的发送量有上限,个人账号每天大概500封,G Suite/Workspace账号上限更高,别超量就行
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

