我们有一个桌面应用程序,可以代表用户发送电子邮件(用于发票、收据等)。此前,我们为此使用基本 SMTP 身份验证,但现在我们为需要 OAuth 2.0 的服务(例如 Exchange 365 在线)添加了对 OAuth 2.0 的支持。因此,应用程序需要针对用户运行的任意 Exchange 365 服务器进行身份验证,并将带有附件的电子邮件发送给任意数量的收件人(其客户)。这对我们来说是全新的,所以我想确保我们的设置正确。
这是我到目前为止所做的:
我们使用 Microsoft Identity Client 库进行身份验证。所有函数调用似乎都有效,我收到登录提示,登录并在手机的身份验证器应用程序上验证登录。这些函数返回一个令牌。鉴于我们想要针对 Office 365 上的任何组织/域进行身份验证,我认为我们需要使用“通用”TenantID,这是正确的吗?
Dim Options As New PublicClientApplicationOptions
Options.ClientId = pClientID
Options.TenantId = pTenantID
Options.RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient"
Dim publicClientApplication As IPublicClientApplication = PublicClientApplicationBuilder.CreateWithApplicationOptions(Options).Build
Dim scopes() As String = {
"email",
"offline_access",
"https://outlook.office.com/Mail.Send"
}
Try
Dim CM_EmailServerSetting As ICM_EmailServerSetting = CCM_EmailServerSettingServices.GetEmailServerSettingForApplication()
Dim authToken As AuthenticationResult = Await publicClientApplication.AcquireTokenInteractive(scopes).WithParentActivityOrWindow(Me).WithLoginHint(CM_EmailServerSetting.EmailAddress).ExecuteAsync()
然后我们使用 SMTP 协议但使用 OAuth2 对象连接到指定的服务器。
Dim oauth2 作为 MailKit.Security.SaslMechanism Dim EmailClient 作为新的 Net.Smtp.SmtpClient() EmailClient.Connect(CM_EmailServerSetting.SMTP服务器地址,CM_EmailServerSetting.端口)
If (EmailClient.AuthenticationMechanisms.Contains("OAUTHBEARER")) Then
oauth2 = New MailKit.Security.SaslMechanismOAuthBearer(authToken.Account.Username, authToken.AccessToken)
Else
oauth2 = New MailKit.Security.SaslMechanismOAuth2(authToken.Account.Username, authToken.AccessToken)
End If
Await EmailClient.AuthenticateAsync(oauth2)
上面对 AuthenticateAsync 的调用会引发异常,表明租户的 SMTP AUTH 已禁用。我们似乎正在尝试使用 OAuth2 协议进行连接,那么我缺少什么?我还需要在 Azure 上授予其他权限吗? (这对我们来说都是新鲜事)
代码很好。测试帐户的 SMTP 已禁用。
对不起大家。保留问答以防其他人陷入同样的陷阱。