Как найти письмо из всех папок в магазине, используя Linq Outlook C # - PullRequest
0 голосов
/ 01 июля 2019

Я выполняю настраиваемое действие для всех входящих ответов через надстройку VSTO. Надстройка будет сравнивать ConversationID входящего ответа с существующим электронным письмом. Это работает нормально, если мне нужно искать внутри одной папки, но моя проблема в том, что электронная почта может быть в любой папке в магазине. Вот мой код.

void items_ItemAdd(object Item)
        {
            Outlook.Application application = new Outlook.Application();
            string filter = "RE: ";
            Outlook.MailItem mail = (Outlook.MailItem)Item;
            Outlook.Folder folder = mail.Parent as Outlook.Folder;
            if (Item != null)
            {
                if (mail.MessageClass == "IPM.Note" && mail.Subject.ToUpper().Contains(filter.ToUpper()))
                {
                    var RequiredMail = (from e in folder.Items.Cast<Outlook.MailItem>().OrderBy(X => X.ReceivedTime).Where(C => C.ConversationID == mail.ConversationID) select mail).FirstOrDefault();

                    // Perform custom action
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }

Кроме того, я прочитал, что поиск электронной почты с использованием Linq не очень эффективен. Есть ли другой, более эффективный способ получить RequiredMail?

Любая помощь будет высоко оценена.

Спасибо.

1 Ответ

1 голос
/ 01 июля 2019

Прежде всего, вы должны знать, что событие ItemAdd не может быть запущено, если в коллекцию добавлено более шестнадцати элементов.Это известная проблема в Outlook.В следующих сериях статей описаны возможные обходные пути для этого:

Смешивание объектов LINQ и COM не очень хорошая идея.Вы должны немедленно освободить базовые COM-объекты, чтобы предотвратить любые известные проблемы.

Если вам нужно искать элементы во всех папках, вы можете использовать метод AdvancedSearch класса Application, который позволяет выполнять поиск на основе заданной строки поиска DAV (Поиск и определение местоположения (DASL)).

Основные преимущества использования метода AdvancedSearch в Outlook:

  • Поиск выполняется в другой теме.Вам не нужно запускать другой поток вручную, так как метод AdvancedSearch запускает его автоматически в фоновом режиме.
  • Возможность поиска любых типов элементов: почта, встреча, календарь, заметки и т. Д. В любом месте,т.е. выходит за рамки определенной папки.Методы Restrict и Find / FindNext можно применять к определенной коллекции элементов (см. Свойство Items класса Folder в Outlook).
  • Полная поддержка запросов DASL (пользовательские свойства могут бытьиспользуется для поиска тоже).Подробнее об этом можно прочитать в статье Filtering в MSDN.Для повышения эффективности поиска можно использовать ключевые слова мгновенного поиска, если для магазина включен мгновенный поиск (см. Свойство IsInstantSearchEnabled класса Store).
  • Вы можете остановить процесс поиска в любой момент, используяStop метод класса Search.

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

...