刚刚启动了一个新的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)
我现在可以得到“身份验证失败”的信息 - 但它并没有真正告诉我原因。
您应该等待
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