2012-10-02 10 views
5

मैं विशिष्ट उपयोगकर्ता के लिए एक्सचेंज से अपठित ईमेल की संख्या प्राप्त करने का प्रयास कर रहा हूं।ईडब्ल्यूएस सभी फ़ोल्डरों से अपठित ईमेल की गिनती

मैं तो जैसे इनबॉक्स से ईमेल की संख्या प्राप्त करने में सक्षम हूँ:

SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); 
ItemView view = new ItemView(int.MaxValue); 
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, sf, view); 
int unreadCount = 0; 
foreach (EmailMessage i in findResults) 
    { 
     unreadCount++; 
    } 
label1.Text = unreadCount.ToString(); 

यह काम करता है महान।
मैं भी सभी सबफ़ोल्डर्स प्राप्त करने में सक्षम हूँ इनबॉक्स है:

FindFoldersResults findResults1 = service.FindFolders(
    WellKnownFolderName.Inbox, 
    new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep }); 

foreach (Folder folder in findResults1.Folders) 
{ 
    Console.WriteLine(folder.DisplayName); 
} 

समस्या है कि मैं इन दोनों को एक साथ गठबंधन करने में सक्षम नहीं हूँ।
मुझे पता है कि मैं नेस्टेड फोरैच लूप कर सकता हूं, लेकिन मैं इससे बचना चाहूंगा।

मुझे ये प्रश्न मिला: Exchange Web Services (EWS) FindItems within All Folders, लेकिन AllItems फ़ोल्डर बनाने के लिए इसे कम से कम Outlook 2010 का उपयोग करने की आवश्यकता है।

मुझे पता है कि मैं SearchFilterCollection बना सकता हूं, लेकिन इसमें नियम कैसे जोड़ सकते हैं ताकि यह इनबॉक्स और सभी उपफोल्डर्स में अपठित ईमेल की खोज करे?

संपादित करें:

यह मैं अब तक क्या करने की कोशिश की है क्या:

private int getEmailCount() 
{ 
    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)); 

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

    FindFoldersResults inboxFolders = service.FindFolders(WellKnownFolderName.Inbox, viewFolders); 

    foreach (Folder folder in inboxFolders.Folders) 
    { 
     findResults = service.FindItems(folder.Id, unreadFilter, viewEmails); 
     unreadCount += findResults.Count(); 
    } 

    return unreadCount; 
    } 

मूल रूप से इस काम करता है, लेकिन जब मैं कई उप-फ़ोल्डर बनाया है यह बहुत धीमी गति से काम करने के लिए शुरू कर दिया।
एक ही परिणाम प्राप्त करने के लिए मैं कई प्रश्नों के बजाय क्या कर सकता हूं?

उत्तर

4

मैं थोड़ा खोज की है और इस समारोह बना लिया है:

public void getEmailCount(Action<int> callback) 
    { 
     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.Root, folderFilter, viewFolders); 

     if (inboxFolders.Count() == 0)//if we don't have AllItems folder 
     { 
      //search all items in Inbox and subfolders 
      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(); 
      } 
     } 
     else //AllItems is avilable 
     { 
      foreach (Folder folder in inboxFolders.Folders) 
      { 
       FindItemsResults<Item> findResults = service.FindItems(folder.Id, unreadFilter, viewEmails); 
       unreadCount += findResults.Count(); 
      } 
     } 

     callback(unreadCount); 
    } 

मूल रूप से यह जाँच करता है अगर हम AllItems फ़ोल्डर avilable है।
यदि YES तो हम एक, सरल क्वेरी करते हैं जो सभी अपठित संदेशों को लौटाता है।
यदि NO तो हम सभी फ़ोल्डरों को इनबॉक्स के अंदर लूप करते हैं। यह धीमा है और हमारे पास कितने फ़ोल्डर्स और स्तर हैं इस पर निर्भर करता है।

किसी भी संशोधन और सुधार के लिए स्वागत है :)

+0

महान कोड, लेकिन इसमें AllItems का उपयोग करते समय हटाए गए आइटम फ़ोल्डर शामिल हैं, जो सभी परिस्थितियों में आदर्श नहीं हो सकता है। – Zone12

+0

@ जोन 12 - मैंने अभी जांच की है और मेरे मामले में 'AllItems' फ़ोल्डर में हटाए गए आइटम शामिल नहीं हैं। मैं यह नहीं कह रहा हूं कि यह हर सर्वर पर है क्योंकि मैं एक्सचेंज विशेषज्ञ नहीं हूं। हो सकता है कि एक्सचेंज पर कॉन्फ़िगरेशन के सॉम नरम हो, 'ऑलइटम' फ़ोल्डर में कौन से आइटम शामिल हैं? – Misiu

+0

क्या आप '' SearchFilterCollection'' उदाहरण बनाने के लिए बाध्य हैं जब आप उनमें केवल एक '' खोज फ़िल्टर 'रखते ​​हैं? यह ओवरकिल दिखता है। (मूल प्रश्न पर भी लागू होता है।) – Chop

4
नहीं

यकीन है कि यह आप के लिए क्या देख रहे थे, लेकिन ... हो रही अपठित ईमेल मायने रखता है (इनबॉक्स/मसौदा आदि):

int x = Folder.Bind(yourService, WellKnownFolderName.Inbox).UnreadCount; 
int y = Folder.Bind(yourService, WellKnownFolderName.Drafts).UnreadCount; 
return x + y; 

इस मामले में, सेवा को दो बार कहा जाता है, लेकिन कॉल क्रमशः जारी किए जाते हैं - पर्याप्त पर्याप्त नहीं है।

हालांकि, आप दोनों अनुरोधों एक ही समय पर जारी कर सकते हैं और अपने अनुप्रयोग के प्रतिक्रिया समय वृद्धि हुई है।

this या किसी ट्यूटोरियल बताते हैं कि कैसे दो TPLकार्यों का दृष्टांत उन्हें कार्य अनुसूचक लिए भेज देखें, इंतजार दोनों के लिए (WaitAll()) को पूरा करने और अंत में, करने के लिए , उनके परिणाम :)

पुनः प्राप्त और, यदि आप कुछ कस्टम फिल्टर (नहीं तुच्छ 'अपठित' फिल्टर) लागू करने के बाद ईमेल मायने रखता है पाने के लिए चाहते हैं, तो सुनिश्चित करें कि आपके ItemView वस्तु ItemView है (1), आइटम व्यू (int.MaxValue)। फिर, कुल गणना प्राप्त करें:

int n = findItemsResults.TotalCount; 

docs for TotalCount property देखें। सही यह केवल एक आइटम हैं, लेकिन उसकी (प्रतिक्रिया) भी कुल गणना किया जाता है ... यही कारण है कि तुम क्या चाहते हो, -

इस तरह, सेवा प्रतिक्रिया काफी छोटा है?

+1

कोड के लिए धन्यवाद, मैं निश्चित रूप से इसे जांचूँगा :) – Misiu

0

फ़ोल्डर और उनकी गणना लाने के लिए कोड उदाहरण। इस उदाहरण में, हम सभी प्रथम-स्तरीय फ़ोल्डरों को सूचीबद्ध कर रहे हैं, और उन्हें फ़ोल्डर्स की एक सामान्य श्रेणी सूची में जोड़ रहे हैं, जिसमें न्यूमेसेजकाउंट ऑब्जेक्ट है। कुंजी फ़ोल्डर है। बाइंड (myService, folder.Id) .UnreadCount खंड।

public List<Common.MailFolder> ListFolders() 
    { 
     try 
     { 
      List<Common.MailFolder> myFolders = new List<Common.MailFolder>(); 
      Common.MailFolder myFolder; 

      List<ExchangeFolder> myExchangeFolders = new List<ExchangeFolder>(); 

      FolderView myView = new FolderView(10); 
      myView.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, FolderSchema.DisplayName, FolderSchema.Id); 
      myView.Traversal = FolderTraversal.Shallow; 

      FindFoldersResults myResults = myService.FindFolders(WellKnownFolderName.MsgFolderRoot, myView); 

      foreach (Folder folder in myResults) 
      { 
       myFolder = new Common.ICE.MailFolder(); 
       myFolder.NewMessageCount = Folder.Bind(myService, folder.Id).UnreadCount; 
       myFolder.FolderId = folder.Id.ToString(); 
       myFolder.FolderName = folder.DisplayName; 
       myFolders.Add(myFolder); 
      } 

      return myFolders; 
     } 
     catch (Exception ex) 
     { 
      Logger.Log.Error("Exchange Helper - List Folders", ex, Utility.GetUserId()); 
      return null; 
     } 
    } 
1

यहाँ एक मेलबॉक्स की कुल पढ़े गए की संख्या प्राप्त करने में कठिनाई के लिए कोड है।

  1. गहरी ट्रेवर्सल
  2. सीमा
  3. कैलेंडर जैसे फ़ोल्डर में से कुछ आईडी, UNREADCOUNT, DisplayName (forinformational उद्देश्य) के लिए प्रत्येक फ़ोल्डर के लिए गुणों के सेट के साथ सभी फ़ोल्डर का पता लगाएं, संपर्क इस की जरूरत नहीं है

      : संपत्ति ताकि मामले इस कोड स्निपेट के साथ

    सीमाएं संभाल

  4. मेलबॉक्स जानकारी की दुकान के शीर्ष के तहत 1000 से अधिक फ़ोल्डर हैं, तो आप नहीं पूरा कुल पढ़े गए की संख्या
  5. उस मामले को संभालने के लिए मिल जाएगा करने के एक पाश में finditems तक वहां एक ही तर्क
साथ कोई और अधिक आइटम हैं

यह केवल एक खोजकर्ता कॉल करता है और परिणामों पर काम करता है।

public static int GetTotalUnreadCount(ExchangeService ewsConnector) 
{ 
    int pagedView = 1000; 
    FolderView fv = new FolderView(pagedView) { Traversal = Microsoft.Exchange.WebServices.Data.FolderTraversal.Deep }; 
    fv.PropertySet = new PropertySet(BasePropertySet.IdOnly, FolderSchema.UnreadCount, FolderSchema.DisplayName); 

    FindFoldersResults findResults = ewsConnector.FindFolders(WellKnownFolderName.MsgFolderRoot, fv); 

    int totalUnreadCount = 0; 
    foreach (Folder f in findResults.Folders) 
    { 
     try 
     { 
      totalUnreadCount += f.UnreadCount; 
      Console.WriteLine("Folder [" + f.DisplayName + "] has [" + f.UnreadCount.ToString() + "] unread items."); 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine("Folder [" + f.DisplayName + "] does not have the unread property."); 
     } 
    } 

    Console.WriteLine("Mailbox has [" + totalUnreadCount.ToString() + "] unread items."); 

    return totalUnreadCount; 
} 
संबंधित मुद्दे