无法使用 Graph 创建草稿,但直接发送邮件可以正常工作

Can't create a draft using Graph, but direct sending mail works fine

最近 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 错误:

Access is denied. Check credentials and try again.

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

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

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

但是,创建消息草稿时,您需要 Mail.ReadWrite。这是因为,与 /sendMail 不同,您需要能够创建、更新并然后 发送消息。

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

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

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

  • User.Read(需要验证)
  • Mail.ReadWrite(要求构建草案)
  • Mail.Send(要求发送消息)