#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
класса в следующих статьях:
- Как: Используйте методы поиска и FindNext для извлечения почтовых элементов Outlook из папки (C#, VB.NET)
- Как: Используйте метод ограничения для извлечения почтовых элементов Outlook из папки
Также вы можете счесть полезным метод 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. Если ответ отвечает на ваш вопрос, пожалуйста, отметьте его как таковой. Спасибо!