任务是将多个项目从一个文件夹移动到另一个文件夹而不使用任何循环(基本上一次移动1个项目,然后一次又一次地重复该过程)。事实上,我在谈论C#相当于在Outlook中选择文件夹中的多个项目并将它们移动到其他地方。有没有办法做到这一点,或者我仍然坚持循环在这里?提前谢谢。
答案 0 :(得分:2)
是的,您可以使用EWS API在不使用循环的情况下移动项目。此处使用的do while
循环是遍历页面,因为ItemView
的页面大小为100.您可以将此逻辑更改为你希望。但我还没有通过findResults
这是一组电子邮件。
这里我假设文件夹“测试”'在根文件夹下。如果该文件夹是收件箱下的子文件夹,请将其更改为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);
答案 1 :(得分:0)
虽然能够一次移动一堆邮件有时会很好,但简单的答案是你做不到。
EWS API不提供一次性移动消息列表的方法,只提供将单个消息移动到其他文件夹的方法。因此,您不得不循环浏览消息并单独移动它们。
顺便提一下,Outlook似乎是如何做到的......所以在这方面你至少满足了这个要求:)
答案 2 :(得分:0)
我认为您需要一个循环,例如 foreach ,而来遍历所选邮件的集合。
答案 3 :(得分:0)
Outlook对象模型不提供一次移动多个项目的任何方法。使用MailItem类的Move方法移动循环中的项目。
答案 4 :(得分:0)
在扩展MAPI级别(仅限C ++或Delphi)上,IMAPIFolder::CopyMessages(MESSAGE_MOVE )获取条目ID列表,因此允许在一次调用中移动或复制多条消息。
Outlook对象模型只允许一次复制或移动一条消息。如果使用Redemption(任何语言)是一个选项,它会公开RDOFolder.Items.MoveMultiple / CopyMultiple
个方法,这些方法会列出“;”或CR / LF分隔的条目ID或条目ID或项目数组。