为什么在.NET中通过Gmail发送电子邮件令人头疼(以及如何避免)
\n\n如果你曾经尝试在.NET应用程序中配置通过Gmail发送邮件,你就会知道:这看起来很简单,但实际上却变成了一项艰巨任务。你写了10行代码,运行它——然后得到一个带有神秘“不安全应用”信息的SmtpException。熟悉吗?
在Stack Overflow上,“在.NET中通过Gmail发送电子邮件”这个问题获得了数千次浏览和数百个回答。多年来人们一直在与这个问题作斗争。在本文中,我们将介绍4种实际的C#方法,从经典方法到现代解决方案,并找出在2025年应该使用哪一种。
\n\n剧透:你在2015年的博客中找到的代码很可能已经不能用了。Google不断收紧安全策略。但别担心——我们会展示可行的方案。
\n\n方法1:经典的SmtpClient(以及它为何过时)
\n\n最直接的方法是使用来自System.Net.Mail的内置SmtpClient。以下是它在“黄金时代”的样子:
using System.Net;\nusing System.Net.Mail;\n\nvar message = new MailMessage("your@gmail.com", "recipient@example.com")\n{\n Subject = "来自.NET的测试邮件",\n Body = "你好!这是测试。"\n};\n\nusing var client = new SmtpClient("smtp.gmail.com", 587)\n{\n Credentials = new NetworkCredential("your@gmail.com", "your-password"),\n EnableSsl = true\n};\n\nclient.Send(message);\n\n在2010-2015年间,这是可行的。但如今,Google已阻止大多数账户使用普通密码登录。你需要:
\n- \n
- 应用密码——但仅在启用两步验证时可用 \n
- 或者允许“访问安全性较低的应用”——Google已经移除了此选项 \n
此方法的缺点:
\n- \n
SmtpClient在.NET 5+中被标记为Obsolete\n - 不支持现代身份验证协议(OAuth 2.0) \n
- 应用密码并非永久有效——需要手动更新 \n
何时使用:仅用于快速原型或内部工具,安全性要求不高时。
\n\n方法2:MailKit——现代且强大
\n\n如果你想要一个工业级解决方案,请使用来自Mono开发者的MailKit库。它不仅有效,而且正在积极开发中。
\n\n首先安装包:
\ndotnet add package MailKit\n\n现在使用应用密码的代码:
\n\nusing MailKit.Net.Smtp;\nusing MimeKit;\n\nvar message = new MimeMessage();\nmessage.From.Add(new MailboxAddress("你的名字", "your@gmail.com"));\nmessage.To.Add(new MailboxAddress("收件人", "recipient@example.com"));\nmessage.Subject = "通过MailKit发送的邮件";\nmessage.Body = new TextPart("plain") { Text = "来自.NET的问候!" };\n\nusing var client = new SmtpClient();\nawait client.ConnectAsync("smtp.gmail.com", 587, MailKit.Security.SecureSocketOptions.StartTls);\nawait client.AuthenticateAsync("your@gmail.com", "你的-应用-密码");\nawait client.SendAsync(message);\nawait client.DisconnectAsync(true);\n\n为什么MailKit比SmtpClient更好?
\n- \n
- 异步方法——不会阻塞线程 \n
- 支持MIME、签名、加密 \n
- 在所有.NET平台上运行(包括.NET MAUI和Unity) \n
- 未被标记为过时 \n
但这种方法也有局限性:应用密码是一个临时解决方案。如果你的Google账户被入侵,攻击者可以以你的名义发送邮件。
\n\n方法3:Google API + OAuth 2.0(用于严肃项目)
\n\n最正确且安全的方法是使用