C # Interop.Outlook найти сообщения с конкретным словом в теме - PullRequest
0 голосов
/ 26 июня 2018

У меня есть приложение, которое должно искать заданное слово в теме электронных писем во входящих. Мой код выглядит так:

 outlook = new OL.Application();
        outlookNameSpace = outlook.GetNamespace("mapi");

        outlookNameSpace.Logon(Type.Missing, Type.Missing, false, true);

        inbox = outlookNameSpace.GetDefaultFolder(OL.OlDefaultFolders.olFolderInbox);
        inboxItems = inbox.Items;


        string filter = "@SQL =\"http://schemas.microsoft.com/mapi/proptag/0x0037001f\" LIKE 'Michigan'";
        OL.Search advancedSearch = outlook.AdvancedSearch("'inbox'", filter);

Когда я выполняю последний оператор (advancedSearch = ....), я получаю следующее сообщение об ошибке.

Произошло необработанное исключение типа 'System.Runtime.InteropServices.COMException'

Дополнительная информация: операция не удалась.

Я новичок в расширенном поиске и DASL-запросах в целом, поэтому моя ошибка может быть очень простой.

Я могу перебирать inboxItems, чтобы найти соответствующие элементы, но это довольно медленно для большой папки входящих сообщений (6700 элементов в моем случае)

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Если вы используете встроенное свойство из объектной модели Outlook, вы можете использовать следующее пространство имен:

 urn:schemas:httpmail:subject

Итак, фильтр может выглядеть так:

 string filter = "urn:schemas:mailheader:subject LIKE \'%"+ wordInSubject +"%\'"; 

Пример кода приведен ниже:

using Outlook = Microsoft.Office.Interop.Outlook;
// ...
string advancedSearchTag = "Our first advanced search in Outlook";

private void RunAdvancedSearch(Outlook._Application OutlookApp, 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 = 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 );
  }
  catch(Exception ex)
  {
     MessageBox.Show(ex.Message, "An eexception 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);
  }                
}

private void adxOutlookEvents_AdvancedSearchComplete(object sender, object hostObj)
{
  Outlook.Search advancedSearch = null;
  Outlook.Results advancedSearchResults = null;
  Outlook.MailItem resultItem = null;
  System.Text.StringBuilder strBuilder = null;
  try
  {
    advancedSearch = hostObj as Outlook.Search;
    if (advancedSearch.Tag == advancedSearchTag)
    {
        advancedSearchResults = advancedSearch.Results;
        if (advancedSearchResults.Count > 0)
        {
            if (HostMajorVersion > 10)
            {
                object folder = advancedSearch.GetType().InvokeMember("Save", 
                                   System.Reflection.BindingFlags.Instance |
                                   System.Reflection.BindingFlags.InvokeMethod | 
                                   System.Reflection.BindingFlags.Public,
                                   null, advancedSearch, 
                                   new object[] { advancedSearchTag });

            }
            else
            {
                strBuilder = new System.Text.StringBuilder();
                strBuilder.AppendLine("Number of items found: " +
                          advancedSearchResults.Count.ToString());                            
                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 Importance: " + 
                                           resultItem.Importance.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 (Exception ex)
    {
       MessageBox.Show(ex.Message, "An exception is occured");
    }
    finally
    {
      if (resultItem != null) Marshal.ReleaseComObject(resultItem);
      if (advancedSearchResults != null) 
                 Marshal.ReleaseComObject(advancedSearchResults); 
    }
  }

Подробнее о методе AdvancedSearch класса Application в расширенном поиске в Outlook можно получить программным способом: статья на C #, VB.NET .

0 голосов
/ 26 июня 2018

Попробуйте использовать PR_NORMALIZED_SUBJECT свойство (имя DASL http://schemas.microsoft.com/mapi/proptag/0x0E1D001F) вместо PR_SUBJECT.

Кроме того, вы не указываете подстановочные знаки для оператора LIKE.

...