无法使用Graph创建草稿,但直接发送邮件效果很好

时间:2019-11-05 14:24:24

标签: c# microsoft-graph microsoft-graph-sdks microsoft-graph-mail

最近Microsoft announced可以发送附件大于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错误:

  

访问被拒绝。检查凭据,然后重试。

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

1 个答案:

答案 0 :(得分: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(发送消息的要求)