You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF项目用MailKit+OAuth连接Office365 SMTP/IMAP认证故障求助

WPF连接Office 365实现SMTP/IMAP的OAuth2认证问题

背景

我刚启动一个新的WPF项目,需要连接Office 365以实现SMTP和IMAP功能。已从Entra获取以下信息:

  • ClientID
  • TenantID
  • SecretValue
  • SecretID

先从基础认证开始尝试,以下代码可正常运行:

Public Function SendMail(MailBody As String, MailSubject As String, SendTo As String, SentFrom As String) As String
Try
    Dim vEmail = New MimeMessage()
    vEmail.From.Add(MailboxAddress.Parse(SentFrom))
    vEmail.To.Add(MailboxAddress.Parse(SendTo))
    vEmail.Subject = MailSubject
    vEmail.Body = New TextPart(TextFormat.Html) With {.Text = MailBody}
    Using vClient = New SmtpClient
        vClient.Connect("smtp-legacy.office365.com", 587, SecureSocketOptions.StartTls)
        vClient.Authenticate(MailUserName, MailPasssword)
        vClient.Send(vEmail)
        vClient.Disconnect(True)
    End Using
    Return "Email was sent!"
Catch ex As Exception
    EmailError(ex)
    Return "Email sending failed"
End Try
End Function

首次OAuth2尝试及错误

随后参考MailKit官网示例尝试OAuth2认证,代码如下:

Public Function SendAuthMail(MailBody As String, Mailsubject As String, SendTo As String, SentFrom As String) As String
Try
    Dim vEmail = New MimeMessage()
    vEmail.From.Add(MailboxAddress.Parse(SentFrom))
    vEmail.To.Add(MailboxAddress.Parse(SendTo))
    vEmail.Subject = Mailsubject
    vEmail.Body = New TextPart(TextFormat.Html) With {.Text = MailBody}
    Dim options = New PublicClientApplicationOptions With {.ClientId = vClientID,
    .TenantId = vTenantID,
    .RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient"}
    Dim scopes = New String() {"email", "offline_access", "https://outlook.office.com/SMTP.Send"}
    Dim publicClientApplication = PublicClientApplicationBuilder.CreateWithApplicationOptions(options).Build()
    Dim authToken = publicClientApplication.AcquireTokenInteractive(scopes).ExecuteAsync()
    Dim v2 = New SaslMechanismOAuth2(authToken.Account.Username, authToken.AccessToken)

    Using vClient = New SmtpClient
        vClient.Connect("smtp.office365.com", 587, SecureSocketOptions.StartTls)
        vClient.Authenticate(v2)
        vClient.Send(vEmail)
        vClient.Disconnect(True)
    End Using
    Return "Email was sent"
Catch ex As Exception
    EmailError(ex)
    Return "Email sending failed"
End Try
End Function

但authToken.Account.Username和authToken.AccessToken均报错,提示*'Account' 不是 'Task(Of AuthenticationResult)' 的成员以及'AccessToken' 不是 'Task(Of AuthenticationResult)' 的成员*。

编辑更新:改用ConfidentialClientApplication

尝试使用ConfidentialClientApplication实现认证,代码如下:

Dim AuthClient = ConfidentialClientApplicationBuilder.Create(vClientID).
                                 WithAuthority(AzureCloudInstance.AzurePublic, vTenantID).
                                 WithClientSecret(SecretValue).
                                 Build
Dim AuthResult = AuthClient.AcquireTokenForClient({"https://outlook.office365.com/.default"}).ExecuteAsync.Result
Dim vAuth As New SaslMechanismOAuth2(SentFrom, AuthResult.AccessToken)

现在能看到“authentication failed”的提示,但没有明确的失败原因。

进一步更新:认证环节细节问题

主要问题集中在认证环节,与SaslMechanismOAuth2和认证令牌有关。根据查阅的所有示例,AuthenticationResult应该暴露.Account.UserName和.AccessToken属性,但这些属性实际不可用。

查看IMAP连接对话日志:

Connected to imap://outlook.office365.com:993/?starttls=always
Connected to imap://outlook.office365.com:993/?starttls=always
Connected to imap://outlook.office365.com:993/?starttls=always
Connected to imaps://outlook.office365.com:993/
S: * OK The Microsoft Exchange IMAP4 service is ready. [TABPADQAUAAxADIAMwBDAEEAMAAxADAAMgAuAEcAQgBSAFAAMQAyADMALgBQAFIATwBEAC4ATwBVAFQATABPAE8ASwAuAEMATwBNAA==]
C: A00000000 CAPABILITY
S: * CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+
S: A00000000 OK CAPABILITY completed.
C: A00000001 AUTHENTICATE XOAUTH2 ********
S: A00000001 NO AUTHENTICATE failed.

日志显示:使用starttls时服务器会断开连接,但使用SSL可以连接;不过AUTHENTICATE XOAUTH2认证失败,本该传递的长字符串未正常生成。


内容的提问来源于stack exchange,提问作者gchq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:25:14