使用AdvancedSearch for Outlook和C#返回零结果

时间:2016-11-29 13:23:03

标签: c# search outlook advanced-search

我试图在我的收件箱和所有子文件夹中搜索主题行中的给定字符串。我在网上找到了以下代码(https://www.add-in-express.com/creating-addins-blog/2012/05/31/outlook-search-csharp-vbnet/),但它返回的结果为零,这不是预期的结果。

我查看了Outlook中查看设置下的过滤器,查看了在outlook资源管理器中返回结果的给定搜索字词并获得了此查询:" http://schemas.microsoft.com/mapi/proptag/0x0037001f"喜欢'%票价%' 当我将其插入下面的代码时,我同样得到零结果。

当我使用LINQ来查询这些文件夹时(LINQ太慢而不能成为真正的解决方案)我可以得到结果,因此我猜测我在使用高级搜索时出现语法错误。很难在网上找到使用示例。我会感激任何可以帮助我的人。

        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;
    }

2 个答案:

答案 0 :(得分:0)

您的过滤器工作正常,请使用应用

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

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

了解在msdn“备注”中使用_Application和Application。写得非常好。

答案 1 :(得分:0)

我没有等到结果的时间。当AdvancedSearch(在单独的线程中运行)完成后,它会触发一个名为AdvancedSearchComplete的事件。我必须告诉代码处理事件,以便等待搜索完成。

在RunAdvancedSearch中,我在Try with this中执行此操作:

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