У нас есть код, который успешно работает уже несколько месяцев, а вчера внезапно он дает сбой.
По сути, у нас есть процесс, который входит в почтовые ящики через 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, но возникла та же проблема.
graphServiceClient
, отмечая сообщение как прочитанное, вы выполняетеMe
конечную точку, а при ее получении вы вызываетеUser[mailbox]
. Если сеансы разные, то идентификатор сообщения будет указывать на другой почтовый ящик, и там оно не сработает. - person Ivan Franjic   schedule 13.09.2019