c# - Kann ich eine Outlook (2003/2007) PST-Datei in C # lesen?





outlook-2007 outlook-2003 (12)


Wir werden dies nutzen, um eine Lösung zu bieten, die nicht auf Outlook basiert.

http://www.independentsoft.de/pst/index.html

Es ist sehr teuer, aber wir hoffen, dass dadurch die Entwicklungszeit verkürzt und die Qualität erhöht wird.

Ist es möglich, eine PST-Datei mit C # zu lesen? Ich möchte das als eigenständige Anwendung machen, nicht als Outlook-Add-In (wenn das möglich ist).

Wenn ich other SO questions similar , MailNavigator ich MailNavigator aber ich möchte das programmatisch in C # machen.

Ich habe den Microsoft.Office.Interop.Outlook Namespace angeschaut, aber anscheinend nur für Outlook-Addins. LibPST scheint in der Lage zu sein, PST-Dateien zu lesen, aber das ist in C (sorry Joel, ich habe C vor dem Abschluss nicht gelernt ).

Jede Hilfe würde sehr geschätzt werden, danke!

BEARBEITEN:

Vielen Dank für die Antworten! Ich habe Matthew Rustons Antwort als Antwort akzeptiert, weil sie mich schließlich zu dem Code geführt hat, nach dem ich gesucht habe. Hier ist ein einfaches Beispiel für meine Arbeit (Sie müssen einen Verweis auf Microsoft.Office.Interop.Outlook hinzufügen):

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;
        }
    }
}

Hinweis: In diesem Code wird davon ausgegangen, dass Outlook für den aktuellen Benutzer installiert und bereits konfiguriert ist. Es verwendet das Standardprofil (Sie können das Standardprofil bearbeiten, indem Sie in der Systemsteuerung zu Mail wechseln). Eine wichtige Verbesserung dieses Codes besteht darin, ein temporäres Profil zu erstellen, das anstelle des Standards verwendet wird, und es anschließend zu zerstören.




This .NET-Connector für Outlook könnte Ihnen den Einstieg erleichtern.




Ja, mit Independentsoft PST .NET ist es möglich, passwortgeschützte und verschlüsselte .pst-Dateien zu lesen / exportieren.




Eine weitere optionale Lösung: NetPstExtractor

Dies ist eine .NET-API zum Lesen der Outlook-PST-Datei ohne installiertem Outlook.

Sie können eine Demoversion here.




Ja, Sie können MS Access verwenden und dann importieren Sie entweder Ihren PST-Inhalt oder verknüpfen ihn einfach (langsam!).




Ich habe einige Ressourcen direkt von Microsoft gefunden, die hilfreich sein können, um diese Aufgabe zu erledigen. Eine Suche auf MSDN zeigt Folgendes.

Beachten Sie, dass beim Hinzufügen eines Verweises auf Microsoft.Office.Interop.Outlook die Dokumentation darauf besteht, dass Sie dies über die Registerkarte .NET anstelle der Registerkarte COM tun.




Wirklich nützlicher Code. Wenn Sie pst haben und Ihre Nachrichten in ihrem Stammverzeichnis (ohne Verzeichnis) speichern, können Sie Folgendes in der Methode readPst verwenden:

 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);
      }
 }



Wie bereits in einer deiner verbundenen SO-Fragen erwähnt, würde ich dir auch empfehlen, die Redemption Bibliothek zu verwenden. Ich benutze es in einer kommerziellen Anwendung für die Verarbeitung von Outlook-Mails und die Durchführung verschiedener Aufgaben mit ihnen. Es funktioniert einwandfrei und verhindert, dass die lästigen Sicherheitswarnungen angezeigt werden. Es würde bedeuten, COM Interop zu verwenden, aber das sollte kein Problem sein.

In diesem Paket befindet sich eine Bibliothek namens RDO, die den CDO 1.21 ersetzt, mit dem Sie direkt auf PST-Dateien zugreifen können. Dann ist es so einfach wie das Schreiben (VB6-Code):

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



Für diejenigen, die erwähnen, dass sie die Stores-Sammlung nicht sehen:

Die Stores-Sammlung wurde in Outlook 2007 hinzugefügt. Wenn Sie also eine Interop-Bibliothek verwenden, die aus einer früheren Version erstellt wurde (um zu versuchen, versionsunabhängig zu sein - dies ist häufig), würden Sie die Stores nicht sehen Sammlung.

Ihre einzigen Optionen, um die Stores zu erhalten, sind eine der folgenden Möglichkeiten:

  • Verwenden Sie eine Interop-Bibliothek für Outlook 2007 (das bedeutet, dass Ihr Code für frühere Versionen von Outlook nicht funktioniert).
  • Zählen Sie alle Ordner der obersten Ebene mit dem Outlook-Objektmodell auf, extrahieren Sie die StoreID jedes Ordners und verwenden Sie CDO- oder MAPI-Schnittstellen, um weitere Informationen zu jedem Geschäft zu erhalten.
  • Zählen Sie die InfoStores-Auflistung des CDO-Sitzungsobjekts auf, und verwenden Sie dann die Fields-Auflistung des InfoStore-Objekts, um weitere Informationen zu jedem Geschäft zu erhalten.
  • Oder (am schwierigsten) verwenden Sie den erweiterten MAPI-Aufruf (In C ++): IMAPISession :: GetMsgStoresTable.



Ich ging durch und machte das Refactoring für Unterordner

    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);
        }
    }



Die MAPI-API ist, was Sie suchen. Leider ist es in .Net nicht verfügbar. Daher müssen Sie leider auf den Aufruf von nicht verwaltetem Code zurückgreifen.

Eine schnelle Google zeigt mehrere Wrapper zur Verfügung, vielleicht arbeiten sie für Sie?

Dies könnte auch hilfreich sein: http://www.wischik.com/lu/programmer/mapi_utils.html




Ich denke, dass du der beste hackische Weg ist, die Komposition im Gegensatz zur Vererbung zu betrachten.

Oder Sie könnten eine Schnittstelle mit den gewünschten Mitgliedern erstellen, die abgeleitete Klasse diese Schnittstelle implementieren und für die Schnittstelle programmieren.







c# outlook outlook-2007 outlook-2003 pst