在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中實現郵件發送功能。