Невозможно создать черновик с помощью Graph, но прямая отправка почты работает нормально - PullRequest
2 голосов
/ 05 ноября 2019

Недавно Microsoft объявила , что можно отправлять электронные письма с вложениями размером более 4 МБ.

С небольшими вложениями мы смогли сделать все за один запрос. Теперь мы должны создать черновик, загрузить вложения и затем отправить файл.

У меня есть рабочий код, который отправляет почту в одном запросе:

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 Ответ

2 голосов
/ 05 ноября 2019

Вы не указываете, какие области разрешений вы выбрали, но это, скорее всего, проблема.

Для упрощенного /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 (требуется для отправки сообщения)
...