【问题标题】:Get multiple mailboxes from a master mailbox using EWS使用 EWS 从主邮箱获取多个邮箱
【发布时间】:2015-10-15 14:08:37
【问题描述】:

我们希望能够从我们交换服务器中包含的所有邮箱中获取未读邮件。从那里,我们将在我们的应用程序中处理它们,然后将它们删除。未读邮件的数量总是很小的比例。

我们的第一个想法是创建一个主邮箱,让他(通过 EPS)完全访问其他邮箱,并通过 EWS 获取未读邮件。我们试过这个:

        //Define the service 
        ExchangeService service = new ExchangeService(SERVICE_VERSION);
        service.Url = new Uri(SERVICE_URL);
        service.Credentials = new WebCredentials("MyAdmin", "MyPassword");

        //define our search
        FolderView viewFolders = new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep, PropertySet = new PropertySet(BasePropertySet.IdOnly) };
        ItemView viewEmails = new ItemView(int.MaxValue) { PropertySet = new PropertySet(BasePropertySet.IdOnly) };
        SearchFilter unreadFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));

        //search all items in Inbox and subfolders
        FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Root, unreadFilter, viewEmails);

        //bind the result
        ServiceResponseCollection<GetItemResponse> responseList =
               service.BindToItems(findResults.Select(item => item.Id), new PropertySet(BasePropertySet.FirstClassProperties,EmailMessageSchema.ReceivedBy, EmailMessageSchema.From, EmailMessageSchema.Subject, EmailMessageSchema.Attachments));

但是,这只会从 MyAdmin 邮箱中获取未读邮件。经过进一步调查,我们发现这种方式可以从另一个特定邮箱中获取未读邮件:

        //Define the service 
        ExchangeService service = new ExchangeService(SERVICE_VERSION);
        service.Url = new Uri(SERVICE_URL);
        service.Credentials = new WebCredentials("MyAdmin", "MyPassword");

        //define our search
        FolderView viewFolders = new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep, PropertySet = new PropertySet(BasePropertySet.IdOnly) };
        ItemView viewEmails = new ItemView(int.MaxValue) { PropertySet = new PropertySet(BasePropertySet.IdOnly) };
        SearchFilter unreadFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));

        //define the user mailbox
        var userMailbox = new Mailbox("MyUser@Domain.com");
        var folderId = new FolderId(WellKnownFolderName.Inbox, userMailbox);

        //search all items in Inbox
        var userItems = service.FindItems(folderId, unreadFilter, viewEmails);

这个方案的问题是针对3000个邮箱,然后我们必须查询3000次EWS来获取每个邮箱的未读邮件(知道很多不会有未读邮件)。

有没有办法在一次调用中从交换服务器的每个邮箱中获取所有未读邮件?我们正在使用带有最新 EWS 的 Exchange 2013。

提前致谢

【问题讨论】:

  • 我认为不可能。我认为您必须为每个用户提供服务。 SO中有没有关注按钮,我想继续看这个。投票赞成。
  • 这里是如何在 SO 中关注问题。感谢您的支持。 meta.stackexchange.com/questions/86877/…
  • 您可以使用 eDiscovery msdn.microsoft.com/en-us/library/office/… 进行多邮箱搜索,但是 IsRead 未编入索引,因此您无法进行查询,因此您唯一的选择是执行 3000 个请求。

标签: c# exchangewebservices


【解决方案1】:

我设法找到了一种方法来满足我的要求,即 - 几乎 - 将所有未读邮件都集中到一个电话中。

这就是诀窍。我使用 ECP 添加了一条传输规则,以便为每封传入的电子邮件将 MyAdmin 放入密件抄送中。从那里,我根据需要在一个呼叫中处理所有邮箱的每封未读电子邮件。我还将在我的数据库中跟踪我的例程中已处理的电子邮件,并且在一天结束时,我将创建另一个例程,该例程将销毁我已处理的所有其他邮箱中的电子邮件。

简单但干净且有效。希望对大家有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多