使用MailKit从WPF应用程序通过oAuth连接到o365

问题描述 投票:0回答:1

刚刚启动了一个新的WPF项目,需要连接到365进行SMPT和IMAP。

我从 Entra 获得了以下信息 客户端ID 租户ID 秘密值 秘密ID

但是我很难将它们组合在一起,所以首先从基本身份验证开始......

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

这有效。

根据 MailKit 站点上的示例尝试了此操作...

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)”的成员

任何指点将不胜感激 - 事实证明桌子比我的头硬得多!

==============编辑==========

使用...

  Dim AuthClient = ConfidentialClientApplicationBuilder.Create(vClientID).
                                     WithAuthority(AzureCloudInstance.AzurePublic, vTenantID).
                                     WithClientSecret(SecretValue).
                                     Build

暗淡验证结果 = AuthClient.AcquireTokenForClient({"https://outlook.office365.com/.default"}).ExecuteAsync.Result 暗淡 vAuth 作为新 SaslMechanismOAuth2(SentFrom,AuthResult.AccessToken)

我现在可以得到“身份验证失败”的信息 - 但它并没有真正告诉我原因。

wpf mailkit
1个回答
0
投票

您应该等待

Task(Of T)
方法返回
ExecuteAsync

Public Async Function SendAuthMail(MailBody As String, Mailsubject As String, SendTo As String, SentFrom As String) As Task(Of String)
    Try
        ...
            Dim authToken = Await publicClientApplication.AcquireTokenInteractive(scopes).ExecuteAsync()
        ...
            Return "Email was sent"
    Catch ex As Exception
        EmailError(ex)
        Return "Email sending failed"
    End Try
End Function
© www.soinside.com 2019 - 2024. All rights reserved.