Можно ли прочитать PST-файл Outlook (2003/2007) в C #? - PullRequest
63 голосов
/ 23 февраля 2009

Можно ли прочитать файл .PST с помощью C #? Я хотел бы сделать это как отдельное приложение, а не как надстройку Outlook (если это возможно).

Если вы видели другое SO вопросы похожие на это упоминание MailNavigator но я хочу сделать это программно в C #.

Я посмотрел на пространство имен Microsoft.Office.Interop.Outlook , но, похоже, это только для надстроек Outlook. LibPST , кажется, может читать файлы PST, но это на C (извините, Джоэл, я не изучил C до окончания ).

Любая помощь будет принята с благодарностью, спасибо!

РЕДАКТИРОВАТЬ:

Спасибо всем за ответы! Я принял ответ Мэтью Растона как ответ, потому что в конечном итоге он привел меня к коду, который я искал. Вот простой пример того, что я получил для работы (вам нужно будет добавить ссылку на Microsoft.Office.Interop.Outlook):

using System;
using System.Collections.Generic;
using Microsoft.Office.Interop.Outlook;

namespace PSTReader {
    class Program {
        static void Main () {
            try {
                IEnumerable<MailItem> mailItems = readPst(@"C:\temp\PST\Test.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 установлен и уже настроен для текущего пользователя. Он использует профиль по умолчанию (вы можете редактировать профиль по умолчанию, перейдя в раздел «Почта» на панели управления). Одним из основных улучшений в этом коде будет создание временного профиля для использования вместо Default, а затем его уничтожение после завершения.

Ответы [ 13 ]

0 голосов
/ 23 февраля 2009

Да, вы можете использовать MS Access, а затем либо импортировать контент PST, либо просто связать его (медленно!).

0 голосов
/ 23 февраля 2009

Этот .NET-соединитель для Outlook может помочь вам начать работу.

0 голосов
/ 23 февраля 2009

MAPI API - это то, что вы ищете. К сожалению, он недоступен в .Net, поэтому, боюсь, вам придется прибегать к вызову неуправляемого кода.

Быстрый Google показывает несколько доступных упаковщиков, может быть, они работают для вас?

Это также может быть полезно: http://www.wischik.com/lu/programmer/mapi_utils.html

...