Frage

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

Wenn gesehen haben andere SO Fragen ähnlich diese Erwähnung Mailnavigator aber ich bin suchen diese programmatisch in C # zu tun.

Ich habe auf der Microsoft.Office.Interop .Outlook Namespace, aber das scheint nur für Outlook-Add-In zu sein. libpst scheint in der Lage zu sein, PST-Dateien zu lesen, aber das ist in C (sorry Joel, ich C zu lernen, bevor Abschluss).

Jede Hilfe wäre sehr dankbar, danke!

EDIT:

Vielen Dank für die Antworten! Ich nahm Matthew Ruston Antwort als die Antwort, weil es letztlich mich auf den Code führte ich suchte. Hier ist ein einfaches Beispiel dafür, was habe ich zu arbeiten (Sie müssen einen Verweis auf Microsoft.Office.Interop.Outlook hinzugefügt werden):

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: Dieser Code geht davon aus, dass Outlook installiert ist und bereits für den aktuellen Benutzer konfiguriert. Es verwendet das Standardprofil (Sie können das Standard-Profil bearbeiten, indem Sie in der Systemsteuerung zu E-Mail zu gehen). Eine wesentliche Verbesserung auf diesem Code wäre ein temporäres Profil zu erstellen, anstatt der Standard zu verwenden, dann zerstören sie einmal abgeschlossen.

War es hilfreich?

Lösung

Die Outlook-Interop-Bibliothek ist nicht nur für Add-In. Zum Beispiel könnte es verwendet werden, um eine Konsolenanwendung zu schreiben, das nur alle Ihre Kontakte Outlook liest. Ich bin mir ziemlich sicher, dass die Standard-Microsoft Outlook Interop Bibliothek können Sie die E-Mail lesen -. Wenngleich es wahrscheinlich eine Sicherheitsabfrage in Outlook werfen, dass der Benutzer durch klicken hat

EDITS : Eigentlich Mail Lesung Umsetzung mit Outlook Interop hängt davon ab, was Ihre Definition von 'Standalone' bedeutet. Der Outlook-Interop lib Outlook erfordert auf dem Client-Rechner installiert, um zu funktionieren.

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

Andere Tipps

Ich ging durch und tat 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);
        }
    }

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

Es gibt eine Bibliothek in diesem Paket RDO genannt, die die CDO 1.21 ersetzt, der Zugriff auf Dateien PST kann direkt. 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

Sie können mit pstsdk.net: .NET-Port von PST File Format SDK Bibliothek, die Open-Source ist lesen pst-Datei ohne Outlook installiert ist.

Für diejenigen zu erwähnen, dass sie die Geschäfte Sammlung nicht sehen:

Die Stores Sammlung in Outlook 2007. So hinzugefügt wurde, wenn Sie eine Interop-Bibliothek, die aus einer früheren Version erstellt verwenden (in einem Versuch Version unabhängig zu sein - das ver üblich ist), dann wäre dies, warum werden Sie nicht finden Sie in der Stores Sammlung.

Ihre einzigen Optionen die Shops zu bekommen sind eine der folgenden Aufgaben:

  • Verwenden Sie eine Interop-Bibliothek für Outlook 2007 (dies bedeutet, dass Ihr Code nicht für frühere Versionen von Outlook arbeiten).
  • Aufzählen alle Top-Level-Ordner mit Outlook-Objektmodell, extrahieren Sie die StoreID jeden Ordner und dann CDO oder MAPI-Schnittstellen verwenden, um mehr Informationen über die einzelnen Speicher zu erhalten.
  • die tores Sammlung von CDO-Session-Objekt Auflisten und dann die Felder verwenden Sammlung von Infostore-Objekt, um mehr Informationen zu den einzelnen Speicher zu erhalten.
  • Or (die härteste Art und Weise), verwendet MAPI-Aufruf verlängert (in C ++): IMAPISession :: GetMsgStoresTable.

Eine weitere optionale Lösung: NetPstExtractor

Dies ist ein .NET-API-Outlook-PST-Datei ohne Outlook installiert ist.

lesen

Sie können Demoversion finden Sie hier.

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

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

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

Der MAPI-API ist das, was Sie suchen. Leider verfügbar ist nicht in .Net so fürchte ich Sie rufen nicht verwalteten Code zurückgreifen müssen.

Ein schnell Google mehr Wrapper verfügbar enthüllt, vielleicht sie für Sie arbeitet?

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

Dieser .NET Connector für Outlook können Sie den Start.

Ja, mit Independentsoft PST .NET möglich ist durch ein Passwort lesen / Export geschützt und PST-Datei verschlüsselt.

scroll top