2016-11-29 29 views
0

我試圖搜索我的收件箱和主題行中給定字符串的所有子文件夾。我在線發現了以下代碼(https://www.add-in-express.com/creating-addins-blog/2012/05/31/outlook-search-csharp-vbnet/),但它返回的結果不是預期結果。使用AdvancedSearch for Outlook和C#返回零結果

我看着器下的視圖設置在Outlook中,在Outlook中的探險家返回結果給定的搜索詞,得到這個查詢:當我插上「http://schemas.microsoft.com/mapi/proptag/0x0037001f」 LIKE「%票務%」 在下面代碼我同樣得到零結果。

當我使用LINQ來查詢這些文件夾(LINQ太慢而不能成爲真正的解決方案)時,我可以得到結果,所以我猜測我正在用advancedsearch發出語法錯誤。在網上很難找到使用的例子。我會感謝任何能夠幫助我的人。

 private Search RunAdvancedSearch(Outlook._Application OutlookApp, string wordInSubject) 
     { 
     string advancedSearchTag = "New Search"; 
     string scope = "Inbox"; 
     string filter = "\"urn:schemas:mailheader:subject\" LIKE '%"+ wordInSubject +"%'"; 

     Outlook.Search advancedSearch = null; 
     Outlook.MAPIFolder folderInbox = null; 
     Outlook.MAPIFolder folderSentMail = null; 
     Outlook.NameSpace ns = null; 
     try 
     { 
      ns = OutlookApp.GetNamespace("MAPI"); 
      folderInbox = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
      folderSentMail = ns.GetDefaultFolder(
              Outlook.OlDefaultFolders.olFolderSentMail); 
      scope = "\'" + folderInbox.FolderPath + 
              "\',\'" + folderSentMail.FolderPath + "\'"; 
      advancedSearch = OutlookApp.AdvancedSearch(
              scope, filter, true, advancedSearchTag); 
      System.Diagnostics.Debug.WriteLine(advancedSearch.Results.Count); 

     } 
     catch (System.Exception ex) 
     { 
      MessageBox.Show(ex.Message, "An exception is thrown!"); 
     } 
     finally 
     { 
      if (advancedSearch != null) Marshal.ReleaseComObject(advancedSearch); 
      if (folderSentMail != null) Marshal.ReleaseComObject(folderSentMail); 
      if (folderInbox != null) Marshal.ReleaseComObject(folderInbox); 
      if (ns != null) Marshal.ReleaseComObject(ns); 
     } 


     return advancedSearch; 
    } 

回答

0

我沒有等待足夠長的結果。當AdvancedSearch(在單獨的線程中運行)完成時,它會觸發一個名爲AdvancedSearchComplete的事件。我不得不告訴代碼來處理事件,以等待搜索完成。

在RunAdvancedSearch我這樣做是與此嘗試:

Application.AdvancedSearchComplete += Application_AdvancedSearchComplete; 

這裏是整個事情。

string advancedSearchTag = "MY FOOFOO Search"; 
    //SEARCH Function 
    Search RunAdvancedSearch(Outlook.Application Application, string wordInSubject) 
    { 
     string scope = "Inbox"; 
     string filter = "urn:schemas:mailheader:subject LIKE \'%" + wordInSubject + "%\'"; 
     Outlook.Search advancedSearch = null; 
     Outlook.MAPIFolder folderInbox = null; 
     Outlook.MAPIFolder folderSentMail = null; 
     Outlook.NameSpace ns = null; 
     try 
     { 
      ns = Application.GetNamespace("MAPI"); 
      folderInbox = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
      folderSentMail = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail); 
      scope = "\'" + folderInbox.FolderPath + "\',\'" + 
                 folderSentMail.FolderPath + "\'"; 
      advancedSearch = Application.AdvancedSearch(
               scope, filter, true, advancedSearchTag); 
      Application.AdvancedSearchComplete += Application_AdvancedSearchComplete; 
     } 
     catch (System.Exception ex) 
     { 
      MessageBox.Show(ex.Message, "An eexception is thrown"); 
     } 
     return advancedSearch; 
     finally 
     { 
      if (advancedSearch != null) Marshal.ReleaseComObject(advancedSearch); 
      if (folderSentMail != null) Marshal.ReleaseComObject(folderSentMail); 
      if (folderInbox != null) Marshal.ReleaseComObject(folderInbox); 
      if (ns != null) Marshal.ReleaseComObject(ns); 
     } 

    } 
    //Handle AdvancedSearchComplete event 
    void Application_AdvancedSearchComplete(Outlook.Search SearchObject) 
    { 
     Outlook.Results advancedSearchResults = null; 
     Outlook.MailItem resultItem = null; 
     System.Text.StringBuilder strBuilder = null; 
     try 
     { 
      if (SearchObject.Tag == advancedSearchTag) 
      { 
       advancedSearchResults = SearchObject.Results; 
       System.Diagnostics.Debug.WriteLine("Count: " + advancedSearchResults.Count); 
       if (advancedSearchResults.Count > 0) 
       { 
        strBuilder = new System.Text.StringBuilder(); 
        strBuilder.AppendLine("Number of items found: " + 
              advancedSearchResults.Count.ToString()); 
        foreach (MailItem item in advancedSearchResults) 
        { 
         System.Diagnostics.Debug.WriteLine(item.Subject); 
        } 
        for (int i = 1; i <= advancedSearchResults.Count; i++) 
        { 
         resultItem = advancedSearchResults[i] as Outlook.MailItem; 
         if (resultItem != null) 
         { 
          strBuilder.Append("#" + i.ToString()); 
          strBuilder.Append(" Subject: " + resultItem.Subject); 
          strBuilder.Append(" \t To: " + resultItem.To); 
          strBuilder.AppendLine(" \t Date: " + 
                resultItem.SentOn.ToString()); 
          Marshal.ReleaseComObject(resultItem); 
         } 
        } 
        if (strBuilder.Length > 0) 
         System.Diagnostics.Debug.WriteLine(strBuilder.ToString()); 
        else 
         System.Diagnostics.Debug.WriteLine(
                "There are no Mail items found."); 

       } 
       else 
       { 
        System.Diagnostics.Debug.WriteLine("There are no items found."); 
       } 
      } 
     } 
     catch (System.Exception ex) 
     { 
      MessageBox.Show(ex.Message, "An exception is occured"); 
     } 
     finally 
     { 
      if (resultItem != null) Marshal.ReleaseComObject(resultItem); 
      if (advancedSearchResults != null) 
       Marshal.ReleaseComObject(advancedSearchResults); 
     } 
    } 
    private void btnOutlookSrch_Click(object sender, EventArgs e) 
    { 
     Outlook.Application OLook = new Outlook.Application(); 
     RunAdvancedSearch(OLook, "Hello?"); 
    }