2

最近微软宣布可以发送带有大于 4MB 附件的电子邮件。

使用较小的附件,我们可以在一个请求中完成所有操作。现在我们必须创建一个草稿,上传附件,然后发送文件。

我有一个在单个请求中发送邮件的工作代码:

var confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithTenantId(tenant)
    .Build();

var authenticationProvider = new ClientCredentialProvider(confidentialClientApplication);
var graphClient = new GraphServiceClient(authenticationProvider);

var email = new Message
{
    Body = new ItemBody
    {
      Content = i + " Works fine! " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
      ContentType = BodyType.Html,
    },
    Subject = "Test" + (j == 0 ? "" : " " + j),
    ToRecipients = recipientList,
    Attachments = att
};

await graphClient
    .Users["test@test.onmicrosoft.com"]
    .SendMail(email, true)
    .Request()
    .WithMaxRetry(5)
    .PostAsync();

上面的代码工作正常,但是当我将最后一行更改为:

Message draft = await graphClient
    .Users["test@test.onmicrosoft.com"]
    .MailFolders
    .Drafts
    .Messages
    .Request()
    .AddAsync(mail);

或者:

Message draft = await graphClient
    .Users["test@test.onmicrosoft.com"]
    .Messages
    .Request()
    .AddAsync(mail);

我收到一个ErrorAccessDenied错误:

访问被拒绝。检查凭据并重试。

为什么在单个请求中发送电子邮件但创建草稿会失败?我需要任何特殊权限吗?

4

1 回答 1

2

您没有指定您选择了哪些权限范围,但这很可能是问题所在。

简化版/sendMail需要Mail.Send许可。这是一个相当轻量级的范围,旨在为应用程序提供一种无需访问邮箱本身即可发送电子邮件的机制。

但是,在创建草稿消息时,您需要Mail.ReadWrite. 这是因为,与 不同/sendMail,您需要创建、更新和发送消息的能力

这些是所需的步骤和权限:

  1. POST /me/messages创建草稿消息 ( Mail.ReadWrite)。
  2. PATCH /me/messages/{id}添加/更改草稿的内容 ( Mail.ReadWrite)
  3. POST /me/messages/{id}/attachments将附件添加到草稿 ( Mail.ReadWrite)。
  4. POST /me/messages/{id}/send发送消息 ( Mail.Send)。

因此,对于您正在查看的场景,您需要以下范围:

  • User.Read(要求进行身份验证)
  • Mail.ReadWrite(要求建立草案)
  • Mail.Send(要求发送消息)
于 2019-11-05T15:48:31.853 回答