2016-11-29 6 views
0

제목 줄에 주어진 문자열에 대해받은 편지함과 모든 하위 폴더를 검색하려고합니다. 다음 코드를 온라인 (https://www.add-in-express.com/creating-addins-blog/2012/05/31/outlook-search-csharp-vbnet/) 발견했지만 예상 된 결과가 아닌 0 개의 결과를 반환합니다. C#으로 0을 반환하는 Outlook 용 AdvancedSearch 사용

나는 전망 탐색기에서 결과를 반환 특정 검색어에 대한 전망에보기 설정에서 필터를 보았고,이 쿼리를 가지고 : 나는 연결하면 " 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라는 이벤트가 시작됩니다. 검색을 완료하기 위해 이벤트를 처리하도록 코드에 알려야했습니다. 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?"); 
    } 
0

귀하의 필터가 잘 작동하고, 응용 프로그램를 사용합니다. 아주 잘 쓰여 있습니다.

+0

._Application에서 .Application으로 변경했지만 내 결과는 0입니다. 다른 아이디어가 있습니까? – zenijos10

관련 문제