簡體   English   中英

使用EWS c#計算來自多個Outlook郵箱的未讀電子郵件

[英]Count unread emails from multiple outlook mailboxes using EWS c#

我想使用C#使用Exchange Web服務來計算來自多個Outlook郵箱(通訊組列表)的未讀收件箱計數。 但是代碼會繼續計算我的 收件箱中未讀的電子郵件,而不是我在代碼中提供的郵箱中。

下面是我的代碼,

protected void Page_Load(object sender, EventArgs e)
{
   getunreademailcount_valid();
   getunreademailcount_invalid();
}
public void getunreademailcount_valid()
{
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
    service.AutodiscoverUrl("validdocs@abc.com");
    Mailbox mb = new Mailbox("validdocs@abc.com");
    int unreadCount = 0;

    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));
    SearchFilter folderFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "AllItems"));

    FindFoldersResults inboxFolders = service.FindFolders(WellKnownFolderName.Inbox,
    new FolderView(int.MaxValue));

    if (inboxFolders.Count() == 0)
    { 
        FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, unreadFilter, viewEmails);
        unreadCount += findResults.Count();

        inboxFolders = service.FindFolders(WellKnownFolderName.Inbox, viewFolders);
        foreach (Folder folder in inboxFolders.Folders)
        {
            findResults = service.FindItems(folder.Id, unreadFilter, viewEmails);
            unreadCount += findResults.Count();
            Response.Write(folder.DisplayName + " : " + findResults.Count() + "<br /><br />");
        }
     }
     else 
     {
         foreach (Folder folder in inboxFolders.Folders)
         {
             FindItemsResults<Item> findResults = service.FindItems(folder.Id, unreadFilter, viewEmails);
             Response.Write(folder.DisplayName + " : " + findResults.Count() + "<br /><br />");
         }
     }
}
public void getunreademailcount_invalid()
{
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);

    service.AutodiscoverUrl("invaliddocs@abc.com");
    Mailbox mb = new Mailbox("invaliddocs@abc.com");
   int unreadCount = 0;

    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));
    SearchFilter folderFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "AllItems"));

    FindFoldersResults inboxFolders = service.FindFolders(WellKnownFolderName.Inbox,
    new FolderView(int.MaxValue));

    if (inboxFolders.Count() == 0)
    {
        FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, unreadFilter, viewEmails);
        unreadCount += findResults.Count();

        inboxFolders = service.FindFolders(WellKnownFolderName.Inbox, viewFolders);
        foreach (Folder folder in inboxFolders.Folders)
        {
             findResults = service.FindItems(folder.Id, unreadFilter, viewEmails);
             unreadCount += findResults.Count();
             Response.Write(folder.DisplayName + " : " + findResults.Count() + "<br />");
         }
     }
     else 
     {
         foreach (Folder folder in inboxFolders.Folders)
         {
            FindItemsResults<Item> findResults = service.FindItems(folder.Id, unreadFilter, viewEmails);
            Response.Write(folder.DisplayName + " : " + findResults.Count() + "<br />");
         }
     }
}

我在這里做錯了什么?

您需要使用FolderId重載來指定要訪問的郵箱,否則就屬於您正在使用的憑據的郵箱。 鑒於您要嘗試執行的操作,您的代碼沒有多大意義,例如,如果您要做的只是訪問文件夾中的未讀郵件計數,則可以在該文件夾上使用UnreadCount,而無需使用FindItem。

        Mailbox MailboxYouWantToAccess = new Mailbox("mailbox@yourdomain.com");
        FolderId InboxFolderId = new FolderId(WellKnownFolderName.Inbox, MailboxYouWantToAccess);
        Folder InboxFolder = Folder.Bind(service, InboxFolderId);
        Console.WriteLine(InboxFolder.UnreadCount);

如果要使用AllItems文件夾(僅在使用Outlook Desktop客戶端時才是它們),則可以使用

         SearchFilter AllItemsSF = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "AllItems");
        ExtendedPropertyDefinition PR_FOLDER_TYPE = new ExtendedPropertyDefinition(13825, MapiPropertyType.Integer);
        SearchFilter SearchFoldersOnly = new SearchFilter.IsEqualTo(PR_FOLDER_TYPE, 2);
        SearchFilter sfCol = new SearchFilter.SearchFilterCollection(LogicalOperator.And) { AllItemsSF, SearchFoldersOnly };
        FolderId SearchRootId = new FolderId(WellKnownFolderName.Root, MailboxYouWantToAccess);
        FolderView fvFolderView = new FolderView(100);
        fvFolderView.Traversal = FolderTraversal.Deep;
        FindFoldersResults ffResults = service.FindFolders(SearchRootId, sfCol, fvFolderView);
        if (ffResults.Folders.Count == 1)
        {
            Console.WriteLine(ffResults.Folders[0].UnreadCount);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM