如何正确设置 Windows 桌面应用程序以通过 Office 365 发送电子邮件?

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

我们有一个桌面应用程序,可以代表用户发送电子邮件(用于发票、收据等)。此前,我们为此使用基本 SMTP 身份验证,但现在我们为需要 OAuth 2.0 的服务(例如 Exchange 365 在线)添加了对 OAuth 2.0 的支持。因此,应用程序需要针对用户运行的任意 Exchange 365 服务器进行身份验证,并将带有附件的电子邮件发送给任意数量的收件人(其客户)。这对我们来说是全新的,所以我想确保我们的设置正确。

这是我到目前为止所做的:

  1. 应用程序已在我们的公司 Azure AD 网站上注册。我已为其分配了 Mail.Send 权限(以及其他权限)。

  2. 我们使用 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()
    
  3. 然后我们使用 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 上授予其他权限吗? (这对我们来说都是新鲜事)

email azure-active-directory office365 desktop-application mailkit
1个回答
0
投票

代码很好。测试帐户的 SMTP 已禁用。

对不起大家。保留问答以防其他人陷入同样的陷阱。

© www.soinside.com 2019 - 2024. All rights reserved.