Могу ли я прочитать файл Outlook (2003/2007) PST В C#?
можно ли прочитать a .PST-файл с использованием C#? Я хотел бы сделать это как отдельное приложение, а не как надстройки Outlook (если это возможно).
если видел другоетаквопросыкак к этому упоминанию MailNavigator но я ищу, чтобы сделать это программно в C#.
Я посмотрел на Microsoft.Офис.Взаимодействие.Перспективы пространство имен, но это, кажется, будьте только для надстроек Outlook. LibPST кажется, можно читать PST-файлы, но это в C (извините, Джоэл, я не узнайте C до окончания).
любая помощь будет высоко оценили, спасибо!
EDIT:
спасибо всем за ответы! Я принял ответ Мэтью Растона как ответ, потому что он в конечном итоге привел меня к коду, который я искал. Вот простой пример того, что я получил на работу (вы будете нужно добавить ссылку на Microsoft.Офис.Взаимодействие.Перспективы):
using System;
using System.Collections.Generic;
using Microsoft.Office.Interop.Outlook;
namespace PSTReader {
class Program {
static void Main () {
try {
IEnumerable<MailItem> mailItems = readPst(@"C:tempPSTTest.pst", "Test PST");
foreach (MailItem mailItem in mailItems) {
Console.WriteLine(mailItem.SenderName + " - " + mailItem.Subject);
}
} catch (System.Exception ex) {
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
private static IEnumerable<MailItem> readPst(string pstFilePath, string pstName) {
List<MailItem> mailItems = new List<MailItem>();
Application app = new Application();
NameSpace outlookNs = app.GetNamespace("MAPI");
// Add PST file (Outlook Data File) to Default Profile
outlookNs.AddStore(pstFilePath);
MAPIFolder rootFolder = outlookNs.Stores[pstName].GetRootFolder();
// Traverse through all folders in the PST file
// TODO: This is not recursive, refactor
Folders subFolders = rootFolder.Folders;
foreach (Folder folder in subFolders) {
Items items = folder.Items;
foreach (object item in items) {
if (item is MailItem) {
MailItem mailItem = item as MailItem;
mailItems.Add(mailItem);
}
}
}
// Remove PST file from Default Profile
outlookNs.RemoveStore(rootFolder);
return mailItems;
}
}
}
Примечание: этот код предполагает, что Outlook установлен и уже настроен для текущего пользователя. Он использует профиль по умолчанию (вы можете изменить профиль по умолчанию, перейдя по почте в Панели Управления). Одним из основных улучшений в этом коде было бы создание временного профиля для использования вместо стандартного, а затем его уничтожение после завершения.
13 ответов:
библиотека взаимодействия Outlook предназначена не только для надстроек. Например, его можно использовать для написания консольного приложения, которое просто считывает все ваши контакты Outlook. Я уверен, что стандартная библиотека взаимодействия Microsoft Outlook позволит вам читать почту, хотя она, вероятно, вызовет запрос безопасности в Outlook, который пользователь должен будет щелкнуть.
редактирование: на самом деле реализация чтения почты с помощью Outlook Interop зависит от того, что ваше определение "автономный" означает. Библиотека взаимодействия Outlook требует, чтобы Outlook был установлен на клиентской машине для работы.
// Dumps all email in Outlook to console window. // Prompts user with warning that an application is attempting to read Outlook data. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Outlook = Microsoft.Office.Interop.Outlook; namespace OutlookEmail { class Program { static void Main(string[] args) { Outlook.Application app = new Outlook.Application(); Outlook.NameSpace outlookNs = app.GetNamespace("MAPI"); Outlook.MAPIFolder emailFolder = outlookNs.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); foreach (Outlook.MailItem item in emailFolder.Items) { Console.WriteLine(item.SenderEmailAddress + " " + item.Subject + "\n" + item.Body); } Console.ReadKey(); } } }
Как уже упоминалось в одном из ваших связанных вопросов SO, я бы также рекомендовал использовать Искупление библиотека. Я использую его в коммерческом приложении для обработки почты Outlook и выполнения различных задач с ними. Все работает безупречно и предотвращает появление раздражающих предупреждений безопасности. Это означало бы использование com-взаимодействия, но это не должно быть проблемой.
в этом пакете есть библиотека под названием RDO, которая заменяет CDO 1.21, что позволяет вам доступ к PST-файлам напрямую. Тогда это так же просто, как писать (VB6 код):
set Session = CreateObject("Redemption.RDOSession") 'open or create a PST store set Store = Session.LogonPstStore("c:\temp\test.pst") set Inbox = Store.GetDefaultFolder(6) 'olFolderInbox MsgBox Inbox.Items.Count
Я прошел и сделал рефакторинг для подпапок
private static IEnumerable<MailItem> readPst(string pstFilePath, string pstName) { List<MailItem> mailItems = new List<MailItem>(); Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application(); NameSpace outlookNs = app.GetNamespace("MAPI"); // Add PST file (Outlook Data File) to Default Profile outlookNs.AddStore(pstFilePath); string storeInfo = null; foreach (Store store in outlookNs.Stores) { storeInfo = store.DisplayName; storeInfo = store.FilePath; storeInfo = store.StoreID; } MAPIFolder rootFolder = outlookNs.Stores[pstName].GetRootFolder(); // Traverse through all folders in the PST file Folders subFolders = rootFolder.Folders; foreach (Folder folder in subFolders) { ExtractItems(mailItems, folder); } // Remove PST file from Default Profile outlookNs.RemoveStore(rootFolder); return mailItems; } private static void ExtractItems(List<MailItem> mailItems, Folder folder) { Items items = folder.Items; int itemcount = items.Count; foreach (object item in items) { if (item is MailItem) { MailItem mailItem = item as MailItem; mailItems.Add(mailItem); } } foreach (Folder subfolder in folder.Folders) { ExtractItems(mailItems, subfolder); } }
вы можете использовать pstsdk.net: .NET порт PST формат файла SDK библиотека с открытым исходным кодом для чтения PST файл без Outlook установлен.
для тех, кто упоминает, что они не видят коллекцию магазинов:
коллекция Stores была добавлена в Outlook 2007. Итак, если вы используете библиотеку взаимодействия, созданную из более ранней версии (в попытке быть независимой от версии - это ver common), то именно поэтому вы не увидите коллекцию Stores.
ваши единственные варианты, чтобы получить магазины, чтобы сделать одно из следующих действий:
- использование библиотеки взаимодействия для Outlook 2007 (это означает, что ваш код не будет работать для более ранних версий Outlook).
- перечислите все папки верхнего уровня с помощью объектной модели Outlook, извлеките StoreID каждой папки, а затем используйте интерфейсы CDO или MAPI для получения дополнительной информации о каждом хранилище.
- перечислите коллекцию InfoStores объекта сеанса CDO, а затем используйте коллекцию fields объекта InfoStore для получения дополнительной информации о каждом хранилище.
- или (самый трудный путь) использовать расширенные Вызов MAPI (в C++): IMAPISession:: GetMsgStoresTable.
еще одно необязательное решение: NetPstExtractor
Это .Net API для чтения Outlook PST file без Outlook установлен.
вы можете найти демо-версии здесь.
мы собираемся использовать это, чтобы обеспечить решение, которое не зависит от outlook.
http://www.independentsoft.de/pst/index.html
Это очень дорого, но мы надеемся, что это снизит время разработки и повысит качество.
API MAPI - это то, что вы ищете. К сожалению, он недоступен в .Net, поэтому я боюсь, что вам придется прибегнуть к вызову неуправляемого кода.
быстрый Google показывает несколько обертки доступны, может быть, они работают для вас?
Это также может быть полезно:http://www.wischik.com/lu/programmer/mapi_utils.html
этой .NET connector для Outlook может помочь вам начать работу.
да, с Independentsoft ПСТ .Net-это можно прочитать/экспорт защищенных паролем и зашифрованных .файл PST.
Я нашел некоторые ресурсы непосредственно от Microsoft, которые могут быть полезны для выполнения этой задачи. А поиск на MSDN показывает следующее.
- как использовать библиотеку объектов Microsoft Outlook для получения сообщения из папки "Входящие" с помощью Visual C#
- как использовать библиотеку объектов Microsoft Outlook для получения встречи с помощью Visual C#
обратите внимание, что при добавлении ссылку на Microsoft.Офис.Взаимодействие.Перспективы,документация настаивает на том, что вы делаете это через вкладку .NET вместо вкладки COM.
действительно полезный код. Если у вас есть pst и вы храните свои сообщения в его корне (без какого-либо каталога), то вы можете использовать следующее в методе readPst:
MAPIFolder rootFolder = outlookNs.Stores[pstName].GetRootFolder(); Items items = rootFolder.Items; foreach (object item in items) { if (item is MailItem) { MailItem mailItem = item as MailItem; mailItems.Add(mailItem); } }