2016-11-29 10 views
0

件名の文字列の受信トレイとすべてのサブフォルダを検索しようとしています。私は次のコードをオンラインで見つけましたが(https://www.add-in-express.com/creating-addins-blog/2012/05/31/outlook-search-csharp-vbnet/)、期待した結果ではないゼロの結果を返します。アドバンストサーチfor OutlookをC#でゼロの結果を返します。

私は見通しエクスプローラで結果を返し、このクエリを持って与えられた検索語の見通しで、ビュー設定でフィルタを見

:私は以下のコードにしていることを接続すると、「http://schemas.microsoft.com/mapi/proptag/0x0037001f」LIKE「%のチケット%」 同様にゼロの結果が得られます。

LINQを使用してこれらのフォルダを照会すると(LINQが実際のソリューションになるには遅すぎます)、結果が得られるので、advancedsearchで構文エラーが発生していると思います。ウェブ上での使用例を見つけるのは難しいです。私は私を助けることができる誰にも感謝します。 MSDN "備考" に_Applicationとアプリケーションを使用する方法について

private Search RunAdvancedSearch(Outlook.Application OutlookApp, string wordInSubject) 

https://msdn.microsoft.com/en-us/library/office/microsoft.office.interop.outlook.application.aspx

読む:

 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というイベントが発生します。検索が完了するのを待つために、イベントを処理するコードを伝えなければなりませんでした。ここで

Application.AdvancedSearchComplete += Application_AdvancedSearchComplete; 

が全体のことである:RunAdvancedSearchで

私はこれを試してみてくださいにこれを行います。

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?"); 
    } 
0

あなたのフィルタが良い取り組んでいる、アプリケーションを使用しています。非常によく書かれています。

+0

.Applicationから.Applicationに変更しましたが、結果は同じです。おそらく他のアイデアはありますか? – zenijos10

関連する問題