Microsoft Graph API - невозможно получить доступ к отдельному сообщению (исключение)

У нас есть код, который успешно работает уже несколько месяцев, а вчера внезапно он дает сбой.

По сути, у нас есть процесс, который входит в почтовые ящики через Graph API C # SDK (v1.12.0), получает непрочитанные сообщения, выполняет итерацию по каждому из них, выполняет некоторую обработку, а затем пытается пометить каждое сообщение как «прочитанное».

Вот соответствующий код:

var graphserviceClient = new GraphServiceClient(_metaData.GraphBaseURL,
                  new DelegateAuthenticationProvider(
                  (requestMessage) =>
                  {
                      requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
                      requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                      requestMessage.Headers.Add("Prefer", "outlook.body-content-type='text'");

                      return Task.FromResult(0);
                  }));

                var unreadMails = graphserviceClient
                                .Users[_metaData.MailBox]
                                .MailFolders
                                .Inbox
                                .Messages
                                .Request()
                                .Filter("isRead eq false")
                                .Top(1000)
                                .Select("Body, Subject")
                                .GetAsync()
                                .Result;

                emailRetrievalCount = unreadMails.Count();

                // Determine if any results were returned
                if (unreadMails.Count > 0)
                {
                    // Create loop to process each item in the newResult object
                    foreach (var unreadMail in unreadMails)
                    {
                        // Set the isRead flag of the message to true
                        var readMail = graphserviceClient
                                       .Me
                                       .Messages[unreadMail.Id] //BREAKS HERE!!!
                                       .Request()
                                       .Select("IsRead")
                                       .UpdateAsync(new Message { IsRead = true })
                                       .Result;
                     }
                }

Сообщение об исключении:

Microsoft.Graph.ServiceException: Код: ErrorInternalServerError \ r \ nСообщение: произошла внутренняя ошибка сервера. Операция не удалась., Не удается открыть почтовый ящик.

Мы проверили разрешения для почтового ящика или учетной записи, ничего не изменилось. Кроме того, похоже, что это не проблема с разрешениями, поскольку мы можем получить токен, войти в систему и получить список сообщений в порядке. Просто когда мы пытаемся получить конкретное сообщение для обновления статуса «Чтение», это не удается. Кроме того, мы попытались обновить SDK до последней версии v1.19.0, но возникла та же проблема.


person EkoostikMartin    schedule 12.09.2019    source источник
comment
Единственное, что выделяется в вашем коде, - это когда вы вызываете graphServiceClient , отмечая сообщение как прочитанное, вы выполняете Me конечную точку, а при ее получении вы вызываете User[mailbox]. Если сеансы разные, то идентификатор сообщения будет указывать на другой почтовый ящик, и там оно не сработает.   -  person Ivan Franjic    schedule 13.09.2019
comment
На самом деле не рекомендуется использовать .Result в асинхронном методе. Вам действительно стоит использовать ожидание, если это возможно. Особенно, если вы запускаете это на сайте ASP.NET.   -  person Darrel Miller    schedule 17.09.2019


Ответы (1)


Мне удалось подтвердить, что произошло изменение поведения службы, которое теперь предотвращает доступ к сообщению электронной почты из другого почтового ящика. Это было некорректным поведением, и оно было исправлено. Изменив вызов для доступа к .Users[_metaData.MailBox].Messages[unreadMail.Id], проблема должна быть решена.

person Darrel Miller    schedule 18.09.2019
comment
Спасибо, мы внесли это изменение в код, и оно устранило часть доступа к нашему почтовому ящику, однако несколько других почтовых ящиков необходимо было полностью перестроить в O365, прежде чем они заработали. - person EkoostikMartin; 27.09.2019
comment
Вы решили проблему со всеми почтовыми ящиками? У меня такая же проблема с некоторыми почтовыми ящиками, а не с другими, очень странно! - person jcq; 31.05.2021