通过Gmail在.NET中发送电子邮件:4种C#代码方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么在.NET中通过Gmail发送电子邮件令人头疼(以及如何避免)

\n\n

如果你曾经尝试在.NET应用程序中配置通过Gmail发送邮件,你就会知道:这看起来很简单,但实际上却变成了一项艰巨任务。你写了10行代码,运行它——然后得到一个带有神秘“不安全应用”信息的SmtpException。熟悉吗?

\n\n

在Stack Overflow上,“在.NET中通过Gmail发送电子邮件”这个问题获得了数千次浏览和数百个回答。多年来人们一直在与这个问题作斗争。在本文中,我们将介绍4种实际的C#方法,从经典方法到现代解决方案,并找出在2025年应该使用哪一种。

\n\n

剧透:你在2015年的博客中找到的代码很可能已经不能用了。Google不断收紧安全策略。但别担心——我们会展示可行的方案。

\n\n

方法1:经典的SmtpClient(以及它为何过时)

\n\n

最直接的方法是使用来自System.Net.Mail的内置SmtpClient。以下是它在“黄金时代”的样子:

\n\n
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

此方法的缺点:

\n
    \n
  • SmtpClient在.NET 5+中被标记为Obsolete
  • \n
  • 不支持现代身份验证协议(OAuth 2.0)
  • \n
  • 应用密码并非永久有效——需要手动更新
  • \n
\n\n

何时使用:仅用于快速原型或内部工具,安全性要求不高时。

\n\n

方法2:MailKit——现代且强大

\n\n

如果你想要一个工业级解决方案,请使用来自Mono开发者的MailKit库。它不仅有效,而且正在积极开发中。

\n\n

首先安装包:

\n
dotnet add package MailKit
\n\n

现在使用应用密码的代码:

\n\n
using 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
\n\n

但这种方法也有局限性:应用密码是一个临时解决方案。如果你的Google账户被入侵,攻击者可以以你的名义发送邮件。

\n\n

方法3:Google API + OAuth 2.0(用于严肃项目)

\n\n

最正确且安全的方法是使用

博客

书籍推荐