2016-02-04 3 views
-1

Задача состоит в перемещении нескольких элементов из одной папки в другую без использования каких-либо циклов (которые в основном перемещают по одному элементу за раз, а затем повторяют процесс снова и снова). На самом деле, я говорю о эквиваленте C# для выбора нескольких элементов в папке в Outlook и перемещения их в другом месте. Есть ли способ сделать это, или я все-таки зациклился на петлях? Заранее спасибо.Перемещение нескольких элементов между папками Outlook - C#

+1

Возникает ли это из-за какого-то теста? – kayess

ответ

0

Хотя иногда было бы хорошо иметь возможность перемещать кучу сообщений сразу, простой ответ - вы не можете.

API EWS не предоставляет способ перемещения списка сообщений одновременно, а только способ перемещения отдельного сообщения в другую папку. Таким образом, вы застреваете в своих сообщениях и перемещаете их по отдельности.

Который, кстати, как перспективы, кажется, это сделать ... так что в этом отношении вы по крайней мере выполнения этого требования :)

+0

Очевидно, Outlook делает это с каким-то другим алгоритмом, чем простой цикл. Если вы пропустите 100 сообщений, чтобы удалить их через item.Delete(), для прохождения через все из них требуется от 10 до 15 секунд. Если вы выберете 100 сообщений в папке «Входящие» и нажмите «Удалить» - они сразу перейдут в «Удаленные элементы». Это миссия - добиться аналогичной производительности. – Onewinged

+0

@Onewinged Если вы удалите несколько тысяч записей сразу, требуется время, чтобы пройти через все их. Он делает это довольно быстро, но это не мгновенно. Если он работает быстрее, вероятно, потому, что Microsoft имеет закрытый API, который использует Outlook. На протяжении многих лет они строили всевозможные вещи в своих системах, поэтому меня не удивило бы, что Outlook имеет свой собственный способ общения с Exchange, который никто не может использовать. – Corey

0

Я думаю, вам нужен цикл, как Еогеасп, в то время как для повторного набора коллекции выбранных вами почтовых элементов.

0

Объектная модель Outlook не предоставляет способ перемещения нескольких элементов одновременно. Используйте метод Move класса MailItem для перемещения элементов в цикле.

0

На расширенном уровне MAPI (только C++ или Delphi) IMAPIFolder::CopyMessages(MESSAGE_MOVE) принимает список идентификаторов ввода и, таким образом, позволяет перемещать или копировать несколько сообщений за один раз.

Модель объекта Outlook, однако, позволяет копировать или перемещать только одно сообщение за раз. Если используется Redemption (любой язык), он предоставляет методы RDOFolder.Items.MoveMultiple/CopyMultiple, которые принимают список «;» или CR/LF, или массив идентификаторов или элементов ввода.

2

Да, вы можете перемещать элементы без использования цикла с использованием EWS API. Цикл do while, используемый здесь, состоит в том, чтобы прокручивать страницы, так как ItemView имеет размер 100. Вы можете изменить эту логику по своему усмотрению. Но я не зациклился на findResults, который представляет собой набор электронных писем.

Здесь я предполагаю, что папка «Test» находится под корневой папкой. Если папка является подпапкой под Inbox, измените ее на WellKnownFolderName.Inbox

List<SearchFilter> searchFilterCollection = new List<SearchFilter>(); 
searchFilterCollection.Add(new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); 
SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection); 

ItemView view = new ItemView(100); 
view.PropertySet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject); 
view.Traversal = ItemTraversal.Shallow; 

FindItemsResults<Item> findResults; 
do 
{ 
    findResults = service.FindItems(new FolderId(WellKnownFolderName.Inbox, new Mailbox(user)), searchFilter, view);  

    var itemIds = from item in findResults 
       select item.Id; 

    service.MoveItems(itemIds, 
        (Folder.Bind(service, WellKnownFolderName.MsgFolderRoot) 
        .FindFolders(new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Test"), new FolderView(1)) 
        .FirstOrDefault(x => x.DisplayName == "Test")).Id); 

     view.Offset = Convert.ToInt32(findResults.NextPageOffset); 

} while (findResults.MoreAvailable); 
Смежные вопросы