it-swarm.com.de

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

Kann eine .PST-Datei mit C # gelesen werden? Ich möchte dies als eigenständige Anwendung tun, nicht als Outlook-Add-In (sofern möglich). 

Wenn andereSOFragenähnlich zu dieser Erwähnung MailNavigator gesehen haben,/aber ich schaue, dies programmgesteuert in C # zu tun.

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

Jede Hilfe wäre sehr dankbar, danke!

EDIT: 

Vielen Dank für die Antworten! Ich akzeptierte Matthew Rustons Antwort als Antwort, weil sie mich letztendlich zu dem Code führte, nach dem ich suchte. Hier ist ein einfaches Beispiel für das, was ich arbeiten muss (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: Bei 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 unter "Mail" nachsehen.) Dieser Code würde darin bestehen, ein temporäres Profil zu erstellen, das anstelle des Standardwerts verwendet werden soll, und es nach der Fertigstellung zu löschen.

63
Andy May

Die Outlook Interop-Bibliothek ist nicht nur für Addins gedacht. Es könnte zum Beispiel verwendet werden, um eine Konsolenanwendung zu schreiben, die alle Ihre Outlook-Kontakte liest. Ich bin mir ziemlich sicher, dass Sie mit der standardmäßigen Interop-Bibliothek von Microsoft Outlook die E-Mails lesen können. Es wird jedoch wahrscheinlich eine Sicherheitsabfrage in Outlook ausgelöst, die der Benutzer durchklicken muss.

EDITITS: Die eigentliche Implementierung des E-Mail-Lesens mit Outlook Interop hängt davon ab, was Ihre Definition von "eigenständig" bedeutet. Die Outlook-Interop-Bibliothek erfordert, dass Outlook auf dem Clientcomputer installiert ist, damit es funktionieren kann.

// 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();
    }
}
}
25
Matthew Ruston

Wie bereits in einer Ihrer verknüpften SO - Fragen erwähnt, würde ich auch die Verwendung der Bibliothek Redemption empfehlen. Ich verwende es in einer kommerziellen Anwendung, um Outlook-Mails zu verarbeiten und verschiedene Aufgaben mit ihnen auszuführen. Es funktioniert einwandfrei und verhindert, dass lästige Sicherheitswarnungen angezeigt werden. Es würde bedeuten, COM Interop zu verwenden, aber das sollte kein Problem sein.

Das Paket enthält eine Bibliothek namens RDO, die CDO 1.21 ersetzt, sodass 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
6
MicSim

Ich ging durch und übernahm 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);
        }
    }
5
Tom Kidd

Sie können pstsdk.net: .NET - Port des PST - Dateiformats SDK library verwenden, das Open Source zum Lesen der Pst - Datei ohne Outlook ist.

4
Giorgi

Eine weitere optionale Lösung: NetPstExtractor

Dies ist eine .NET-API zum Lesen der Outlook-PST-Datei ohne Outlook, das installiert ist.

Sie finden die Demo-Version hier.

2
neolei

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

Die Stores-Auflistung wurde in Outlook 2007 hinzugefügt. Wenn Sie also eine Interop-Bibliothek verwenden, die aus einer früheren Version erstellt wurde (versucht, versionsunabhängig zu sein - dies ist üblich), werden die Stores daher nicht angezeigt Sammlung.

Ihre einzige Möglichkeit, die Stores zu erhalten, besteht darin, eine der folgenden Aktionen auszuführen:

  • 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 anschließend die CDO- oder MAPI-Schnittstellen, um weitere Informationen zu jedem Speicher zu erhalten.
  • Zählen Sie die InfoStores-Auflistung des CDO-Sitzungsobjekts auf, und verwenden Sie dann die Feldauflistung des InfoStore-Objekts, um weitere Informationen zu jedem Speicher zu erhalten.
  • Oder (am schwierigsten) verwenden Sie einen erweiterten MAPI-Aufruf (in C++): IMAPISession :: GetMsgStoresTable. 
2
Ryan Farley

Wir werden dies nutzen, um eine Lösung bereitzustellen, die nicht auf Outlook angewiesen ist. 

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

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

1
Chris Barry

Ich habe einige Ressourcen direkt von Microsoft gefunden, die für die Durchführung dieser Aufgabe hilfreich sein können. Eine Suche auf MSDN enthüllt das Folgende.

Wenn Sie einen Verweis auf Microsoft.Office.Interop.Outlook hinzufügen, besteht die Dokumentation darauf, dass Sie dies über die Registerkarte .NET anstelle der Registerkarte COM tun.

0
HappyNomad

Die MAPI-API ist das, wonach Sie suchen. Leider ist es nicht in .Net verfügbar. Ich fürchte, Sie müssen also auf den Aufruf von nicht verwaltetem Code zurückgreifen.

Ein schnelles Google enthüllt mehrere verfügbare Wrapper. Vielleicht arbeiten sie für Sie?

Dies kann auch hilfreich sein: http://www.wischik.com/lu/programmer/mapi_utils.html

0
Gerrie Schenck

Dieser .NET-Connector für Outlook kann Ihnen den Einstieg erleichtern.

0
Chris Ballance

Wirklich nützlicher Code. Wenn Sie pst haben und Ihre Nachrichten im 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);
      }
 }

Ja, mit Independentsoft PST .NET können kennwortgeschützte und verschlüsselte PST-Dateien gelesen/exportiert werden.

0
AlanSB