DeleteMode.HardDelete не работает должным образом - PullRequest
1 голос
/ 06 февраля 2020

В настоящее время у меня есть процесс, который предназначен для итерации через папку «Входящие», разбора электронных писем, содержащихся в нем, выгрузки их в файл JSON и удаления электронных писем. Они не могут go в папку DeletedItems и должны быть немедленно удалены с сервера (таким образом, здесь можно удалить DeleteMode.HardDelete).

Существует администратор, который отслеживает Входящие, чтобы убедиться, что процесс действительно удалив электронные письма, и утром я предупредил меня, что папка RecoverableItems заполняется. Я проконсультировался с этим , чтобы узнать, сделал ли я что-то не так. Кроме того, я просмотрел Режимы удаления с EWS API.

Теперь у меня есть соответствующий фрагмент кода:

Boolean moreItems = true;
        int loopNumber = 0;
        while (moreItems)
        {
            string filepath = "Outputs/";
            string filename = "some_filename.json";
            using (StreamWriter sw = new StreamWriter(filepath + filename))
            {
                int itemsParsed = 0;
                while (moreItems && itemsParsed < 50000)
                // I want to split up the files into 50k item files. 
                {
                    try 
                    {
                        FindItemsResults<Item> itemSet = i.GetItemSet();
                        foreach (Item x in itemSet.Items)
                        {
                            //Console.WriteLine($"Getting mailitem {x.Id}");
                            try 
                            {
                                x.Load(itemSetProperties);
                                EmailMessage email = em.BindEmail(service , x.Id);
                                metadata.Id = x.Id.ToString();
                                metadata.Subject = x.Subject.ToString();
                                metadata.Sender = email.From.Address.ToString();
                                metadata.Body = x.Body.ToString();
                                metadata.DateTimeReceived = x.DateTimeReceived;
                                metadata.DateTimeSent = x.DateTimeSent;
                                metadata.HasAttachments = email.HasAttachments;
                                serializer.Serialize(sw , metadata);
                                moreItems = itemSet.MoreAvailable;
                                itemsParsed += 1;
                                x.Delete(DeleteMode.HardDelete);
                            }
                            catch (ServiceRequestException sre)
                            { 
                                Console.WriteLine("\nTimeout caught.\n");
                                //Connection keeps getting reset every once in a while
                            }
                            catch (XmlException xle) 
                            {
                                x.Delete(DeleteMode.HardDelete);
                                // There are emails with incomplete xml in the body. These can be deleted
                            }
                            catch(Exception ex)
                            {
                                Console.WriteLine($"Caught new exception: \n{ex.Message}");
                                Environment.Exit(0);
                                // I want to catch new exceptions and figure out why they're happening
                            }
                            Console.WriteLine($"Parsed {itemsParsed} items");
                        }
                    }
                    catch (ServiceRequestException exterior_sre)
                    {
                        Console.WriteLine("Caught exterior exception");
                        // Still haven't figured this out yet, but it occurs once 
                        // in a rare while, and continuing does not affect the overall process
                    }
                }
            }
            loopNumber += 1;
            Console.WriteLine($"Moving to loop number {loopNumber}");
        }

Проблема в том, что удаляемые элементы все еще отправляются в папку RecoverableItems в мусорном баке. Тем временем я попросил, чтобы администратор рассмотрел вопрос об изменении политики хранения для RecoverableItems, чтобы он был очищен раньше, чем по умолчанию. Мой главный вопрос: почему это происходит? Похоже, сообщения электронной почты получают SoftDelete, поэтому я знаю, что вызов на удаление EWS происходит успешно, но HardDelete, похоже, игнорируется.

Я все еще относительно неопытен с EWS API и C# в целом, поэтому заранее прошу прощения за любое невежество с моей стороны.

Обновление Я подтвердил администратору, что элементы не попадают в папку «Очистки», где они должны быть посадка. Я также проверил этот фрагмент документации , в котором описывается необходимость настройки политик хранения в папке «Элементы для восстановления».

Я буду добавлять изменения для этого, как я go .

1 Ответ

0 голосов
/ 07 февраля 2020

Я полагаю, что все работает так, как было разработано с помощью Hard Delete -

Hard delete

Элемент или папка окончательно удалены.

Hard-delete Элементы помещаются в папку «Очистка» корзины. Это похоже на то, когда мусоровоз опустошает ваш контейнер для отходов. Доступ к элементам невозможен из почтового клиента, такого как Outlook или Outlook Web App, и, если для почтового ящика не установлено удержание, элементы будут удалены безвозвратно по истечении установленного периода времени.

Вы можете прочитать Подробнее об удержании элементов см. в статье «Настройка квот хранения удаленных элементов и извлекаемых элементов».

ПРИМЕЧАНИЕ. Папки не помещаются в папку «Очистки», если их трудно удалить. Папки с жестким удалением удаляются из почтового ящика.

https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/deleting-items-by-using-ews-in-exchange

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...