在VB.NET中通过代码发送邮件时,确实会遇到邮箱服务的身份认证(Authentication)要求。特别是微软Outlook/Hotmail等服务,已经逐步禁用传统的“基本身份验证”(Basic Authentication),转而强制要求使用更安全的 OAuth 2.0 认证。
下面我将为你说明如何处理身份认证问题,并提供代码示例。
⚠️ 重要提醒:认证方式的变化
微软已多次宣布并推迟禁用基本身份验证的时间线。根据我目前看到的信息,最新的计划是:
-
2026年3月1日开始逐步淘汰通过SMTP AUTH发送电子邮件的基本身份验证。
-
2026年4月30日预计将完全停用此方法9。
尽管目前基本认证可能仍有效,但从长远和稳定的角度出发,强烈建议为新项目或重要应用直接采用OAuth 2.0认证。
下面的表格汇总了不同邮箱类型推荐使用的认证方式和关键参数:
邮箱类型 | 推荐认证方式 | SMTP 服务器 | 端口 (推荐) | 加密方式 | 注意事项 |
---|---|---|---|---|---|
Outlook/Hotmail | OAuth 2.0 | smtp.office365.com | 587 | STARTTLS | 需在Azure AD注册应用并配置权限。未来必须使用OAuth19。 |
基本认证 (过渡) | smtp.office365.com | 587 | STARTTLS | 目前可能有效,但会被逐步淘汰。需在账户设置中启用SMTP认证并可能使用应用密码。 | |
QQ邮箱 | 基本认证 (应用密码) | smtp.qq.com | 465 或 587 | SSL 或 STARTTLS | 需在邮箱设置中开启SMTP服务并获取授权码(即应用密码),不要在代码中直接使用你的QQ密码。 |
163邮箱 | 基本认证 (应用密码) | smtp.163.com | 465 或 994 | SSL | 需在邮箱设置中开启SMTP服务并获取授权码(即应用密码),不要在代码中直接使用你的邮箱密码。 |
下面是针对不同认证方式的代码示例。
🔐 方法一:使用 OAuth 2.0 认证 (Outlook/Hotmail 推荐)
这是微软推荐的、面向未来的方式,但设置相对复杂。
前期准备(在Azure Portal中配置):
-
注册应用程序:访问 Azure Portal (https://portal.azure.com),在“Azure Active Directory”中注册一个新应用程序。
-
添加客户端密码:在应用的“证书和密码”部分,创建一个新的客户端密码,并妥善保存其值(稍后代码中会用到)。
-
配置API权限:在应用的“API权限”中,添加
SMTP.Send
权限(属于 Office 365 Exchange Online),并代表你的组织授予管理员同意。
VB.NET 代码示例 (使用 MailKit 库)
.NET Framework 内置的 SmtpClient
对 OAuth 2.0 的支持不佳,推荐使用更现代且支持更好的 MailKit 库。你可以通过NuGet包管理器安装 MailKit
和 MimeKit
。
Imports MailKit.Net.Smtp
Imports MailKit.Security
Imports MimeKit
Imports System.Threading' 注意:此示例需要安装 MailKit 和 MimeKit NuGet 包。
Public Async Function SendEmailViaOAuthAsync() As TaskDim message As New MimeMessage()message.From.Add(New MailboxAddress("你的名字", "your_email@outlook.com")) ' 你的Outlook邮箱message.To.Add(New MailboxAddress("收件人名字", "recipient@example.com")) ' 收件人邮箱message.Subject = "这是一封测试邮件"message.Body = New TextPart("plain") With {.Text = "这是一封使用VB.NET和OAuth 2.0发送的测试邮件。"}Using client As New MailKit.Net.Smtp.SmtpClient()Try' 连接到Outlook SMTP服务器Await client.ConnectAsync("smtp.office365.com", 587, SecureSocketOptions.StartTls)' 请注意:这里的密码是你在Azure应用中创建的“客户端密码”,不是你的邮箱密码!Dim oauth2 As New SaslMechanismOAuth2("your_email@outlook.com", "你的客户端密码")' 进行OAuth 2.0认证Await client.AuthenticateAsync(oauth2)' 发送邮件Await client.SendAsync(message)Console.WriteLine("邮件发送成功!")Catch ex As ExceptionConsole.WriteLine("发送失败: " & ex.ToString())FinallyAwait client.DisconnectAsync(True)End TryEnd Using
End Function
🔓 方法二:使用基本认证 (传统方式,可能逐步淘汰)
对于QQ、163等邮箱,目前通常仍使用基本认证,但需使用应用专用密码(授权码)。对于Outlook/Hotmail,此方式未来会失效。
VB.NET 代码示例 (使用 System.Net.Mail.SmtpClient)
Imports System.Net.Mail
Imports System.NetPublic Sub SendEmailViaBasicAuth()Using smtpClient As New SmtpClient("smtp.office365.com") ' 对于Outlook。QQ邮箱用 "smtp.qq.com", 163邮箱用 "smtp.163.com"smtpClient.Port = 587 ' Outlook端口。QQ也可用587或465,163常用465或994smtpClient.Credentials = New NetworkCredential("your_email@outlook.com", "你的密码或授权码") ' 对于Outlook,如果开启了双因素认证,这里可能需要应用密码。对于QQ/163,此处填授权码。smtpClient.EnableSsl = True ' 启用加密连接。对于端口465,有时可能需要其他配置。Dim mailMessage As New MailMessage()mailMessage.From = New MailAddress("your_email@outlook.com")mailMessage.To.Add("recipient@example.com")mailMessage.Subject = "VB.NET 基本认证测试"mailMessage.Body = "这是一封使用基本认证发送的测试邮件。"TrysmtpClient.Send(mailMessage)Console.WriteLine("邮件发送成功!")Catch ex As ExceptionConsole.WriteLine("发送失败: " & ex.ToString())End TryEnd Using
End Sub
⚠️ 发送邮件时的其他注意事项
除了认证方式,以下几点也需要留意:
-
端口与加密:不同的邮箱服务商可能支持不同的端口和加密方式(SSL/TLS)。如果默认端口不行,可以尝试其他常用端口。
-
授权码/应用密码:对于QQ、163等邮箱,为了安全,务必在邮箱设置中开启SMTP服务并获取专用的授权码,不要在代码中直接使用你的邮箱登录密码。
-
服务器限制:免费邮箱通常对每日发信数量、频率有限制,大量发送需注意。
-
垃圾邮件风险:注意邮件内容格式,避免被收件方服务器误判为垃圾邮件。对于大批量发件人,微软等提供商还要求配置SPF、DKIM、DMARC等记录以提高发信信誉和成功率7。
💎 总结与建议
在VB.NET中发送邮件,处理认证的关键是:
-
认清邮箱类型:确认你使用的是Outlook/Hotmail还是国内邮箱(QQ、163)。
-
选择认证方式:
-
Outlook/Hotmail:首选 OAuth 2.0(尽管设置稍复杂,但一劳永逸)。暂时可测试基本认证,但需知它终将失效。
-
QQ/163等国内邮箱:使用基本认证,但密码处填写你在邮箱设置中获取的授权码。
-
-
使用合适的库和参数:对于OAuth 2.0,推荐使用
MailKit
库。对于基本认证,System.Net.Mail.SmtpClient
基本够用,但请注意微软也已建议使用MailKit
等替代方案。
希望这些信息能帮助你顺利地在VB.NET中实现邮件发送功能。