使用 Outlook/Office365 REST API 从连接的电子邮件地址发送邮件

Use the Outlook/Office365 REST API to send mail from connected email address

我正在尝试使用 Outlook/Office 365 REST API 发送电子邮件,并且我正在尝试将其作为我的 "Connected Account" 地址发送。正在尝试发送消息 returns `` 错误。但是,API 让我用这个地址创建草稿。

此外,我可以很好地发送 API 创建的草稿,我还可以从 Web 界面使用此帐户创建和发送消息。

有没有办法授权 API 能够将消息作为连接帐户的地址发送?

不,API 今天不支持此功能。它与您同意的权限范围有关。 "Allow this app to send mail as you" 包括从您的帐户发送,但不包括从其他帐户发送,即使您已被授予访问权限。

您可以考虑的另一件事是利用仅限应用程序的身份验证。可以将 Azure AD 应用配置为具有仅限应用的身份验证。之后,所有请求都将代表该应用程序 ID,您应该能够委托该应用程序 ID 代表您想要的用户向任何人发送电子邮件。 以下是步骤:

  • 创建 Azure AD 应用程序。
  • 将您的 Azure AD 应用程序配置为允许 App-only 令牌 正在关注 Build service and daemon apps in Office 365。你也是 需要一个证书用于仅应用程序令牌请求。
  • 转到您的 Azure AD 应用程序->配置,单击“添加 申请”添加"Office 365 Exchange Online"。Select“发送邮件 作为任何用户”在 "Application permission" 下拉框下。它允许 您的 Azure AD 应用程序有权代表发送电子邮件 某人。
  • 配置 Azure AD 应用程序后,您可以参考 以下代码代表特定用户发送电子邮件。

    string tenantId = "yourtenant.onmicrosoft.com";
    string clientId = "your client id";
    string resourceId = "https://outlook.office.com/";
    string resourceUrl = "https://outlook.office.com/api/v2.0/users/service@contoso.com/sendmail"; //this is your on behalf user's UPN
    string authority = String.Format("https://login.windows.net/{1}", AUTHORITYURL, tenantId);
    string certificatPath = @"c:\test.pfx"; //this is your certficate location.
    string certificatePassword = "xxxx"; // this is your certificate password
    var itemPayload = new
    {
        Message = new
        {
            Subject = "Test email",
            Body = new { ContentType = "Text", Content = "this is test email." },
            ToRecipients = new[] { new { EmailAddress = new { Address = "test@cotoso.com" } } }
        }
    };
    
    //if you need to load from certficate store, use different constructors. 
    X509Certificate2 certificate = new X509Certificate2(certficatePath, certificatePassword, X509KeyStorageFlags.MachineKeySet);
    AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);
    
    ClientAssertionCertificate cac = new ClientAssertionCertificate(clientId, certificate);
    
    //get the access token to Outlook using the ClientAssertionCertificate
    var authenticationResult = await authenticationContext.AcquireTokenAsync(resourceId, cac);
    string token = authenticationResult.AccessToken;
    
    //initialize HttpClient for REST call
    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
    client.DefaultRequestHeaders.Add("Accept", "application/json"); 
    
    //setup the client post
    HttpContent content = new StringContent(JsonConvert.SerializeObject(itemPayload));
    //Specify the content type. 
    content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;odata=verbose");
    HttpResponseMessage result = await client.PostAsync(url, content);
    if(result.IsSuccessStatusCode)
    {
        //email send successfully.
    }else
    {
        //email send failed. check the result for detail information from REST api.
    }
    

完整的解释请参考我的博客Send email on behalf of a service account using Office Graph API

希望对您有所帮助,如果您有任何疑问,请告诉我。