在 Outlook 文件夹之间移动多个项目 - C#

本文关键字:项目 移动 Outlook 文件夹 之间 | 更新日期: 2023-09-27 18:33:21

任务是在不使用任何循环的情况下将多个项目从一个文件夹移动到另一个文件夹(基本上一次移动 1 个项目,然后一次又一次地重复该过程)。实际上,我说的是C#等效于在Outlook中选择文件夹中的多个项目并将它们移动到其他地方。有没有办法做到这一点,或者我在这里被循环困住了?提前谢谢。

在 Outlook 文件夹之间移动多个项目 - C#

是的,您可以使用 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);

虽然偶尔能够一次移动一堆消息会很好,但简单的答案是你不能。

EWS API 不提供一次移动所有邮件列表的方法,仅提供将单个邮件移动到其他文件夹的方法。 因此,您只能循环浏览消息并单独移动它们。

顺便说一下,这就是 Outlook 似乎这样做的方式......所以在这方面,你至少满足了这个要求:)

我认为你需要一个像foreach这样的循环,同时循环访问所选邮件项目的集合。

Outlook 对象模型不提供一次移动多个项目的任何方法。使用 MailItem 类的 Move 方法在循环中移动项目。

在扩展 MAPI 级别(仅限 C++ 或 Delphi)上,IMAPIFolder::CopyMessages(MESSAGE_MOVE ) 获取条目 ID 列表,因此允许在单个调用中移动或复制多个邮件。

但是,Outlook 对象模型一次只允许复制或移动一封邮件。如果使用 Redemption(我是它的作者 - 任何语言)是一个选项,它会公开 RDOFolder.Items.Move多个/CopyMultiple 方法,这些方法采用";"或 CR/LF 分隔的条目 ID 列表或条目 ID 或条目 ID 或项数组。