C# поиск в папке «Входящие» писем определенной тематики

#c# #visual-studio #outlook

Вопрос:

Я пытаюсь найти конкретные электронные письма с определенной темой.

 Outlook.Folder inbox = new Outlook.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
            Outlook.Items items = inbox.Items;
            Outlook.MailItem mailItem = null;
            object folderItem;
            string subjectName = string.Empty;
            string filter = "[Subject] > 's' And [Subject] <'u'";
            folderItem = items.Find(filter);
            while (folderItem != null)
            {
                mailItem = folderItem as Outlook.MailItem;
                if (mailItem != null)
                {
                    subjectName  = "n"   mailItem.Subject;
                }
                folderItem = items.FindNext();

            }
            subjectName = "The follow e-mail messages were found: "   subjectName;
            MessageBox.Show(subjectName);
 

Я получаю сообщение об ошибке :
«Код серьезности Описание Состояния Подавления Строки Файла проекта
Ошибка CS0426 Имя типа «ActiveExplorer» не существует в типе «Приложение»»

Ответ №1:

Сначала необходимо создать новый Application экземпляр, если вы разрабатываете автономное приложение, в котором Outlook автоматизирован, или используете встроенное свойство, если вы разрабатываете надстройку на основе VSTO вместо следующего кода:

 Outlook.Folder inbox = new Outlook.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
 

Отдельное приложение должно создать новый экземпляр Outlook:

 Outlook.Application app = new Outlook.Application();
Outlook.Explorer explorer = app.ActiveExplorer();
Outlook.Namespace ns = app.GetNamespace("MAPI");
Outlook.Folder inbox = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
 

В случае надстройки VSTO вы можете использовать Application свойство ThisAddin класса:

 Outlook.Explorer explorer = Application.ActiveExplorer();
Outlook.Namespace ns = app.GetNamespace("MAPI");
Outlook.Folder inbox = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
 

Вы можете прочитать больше о методах Find/FindNext или Restrict Items класса в следующих статьях:

Также вы можете счесть полезным метод AdvancedSearch. Ключевыми преимуществами использования этого AdvancedSearch метода в Outlook являются:

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

Ответ №2:

Я не уверен, почему вы вообще получаете доступ ActiveExplorer — вы его не используете, и если Outlook не был запущен ранее, не будет никаких открытых исследователей (и инспекторов), поэтому ActiveExplorer в любом случае вернет значение null.

Также имейте в виду, что Application.Session это будет равно нулю, если Outlook уже не запущен — сначала вам нужно войти в систему.

В — третьих, вы не вызываете конструктор-это было бы new Outlook.Application().Blah (примечание () ).

Измените свой код на

 Outlook.Application app = new Outlook.Application();
Outlook.Namespace session = app.GetNamespace("MAPI");
session.Logon();
Outlook.Folder inbox = session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
 

Комментарии:

1. Тем временем я изменил его так, как вы ответили. У меня проблема с доступом к информации из самой электронной почты, я могу просто создавать папки в папке «Входящие», считая электронную почту из папки «Входящие», но не могу получить доступ foreach(Outlook.MailItem item in mails) { string subj = item.Subject;} внутри каждого(…) Я получаю исключение, у меня есть проблема в другом вопросе, если вы хотите взглянуть. Спасибо!

2. Если ответ отвечает на ваш вопрос, пожалуйста, отметьте его как таковой. Спасибо!