[C#] C#でOutlook(2003/2007)のPSTファイルを読むことはできますか?


Answers

リンクされているSOの質問の1つで既に述べたように、私はRedemptionライブラリを使用することをお勧めします。 私は、Outlookメールを処理し、それらとさまざまなタスクを実行する商用アプリケーションでそれを使用しています。 それは完璧に動作し、迷惑なセキュリティ警告を表示することを防ぎます。 COM Interopを使用することを意味しますが、それは問題ではありません。

このパッケージには、PSTファイルに直接アクセスできるCDO 1.21の代わりにRDOというライブラリがあります。 それから、書くほど簡単です(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
Question

C#を使って.PSTファイルを読むことは可能ですか? 私はスタンドアロンのアプリケーションとして、Outlookのアドイン(可能であれば)としてではなく、このようにしたいと思います。

もしこれsimilar other SO questionsを見たことがあるMailNavigatorMailNavigatorが、私はこれをプログラムでC#でやろうとしています。

私はMicrosoft.Office.Interop.Outlook名前空間を見てきましたが、それはOutlookアドインだけのようです。 LibPSTはPSTファイルを読むことができるようですが、これはC言語です(残念ながらJoel、私は卒業前にCを学んでいませんでした)。

どんな助けでも大変感謝します。ありがとう!

編集:

回答いただきありがとうございます。 Matthew Ruston氏の返答を答えとして受け入れました。最終的に私が探していたコードにつながったからです。 ここでは、私が仕事をしなければならない簡単な例を示します(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がインストールされ、現在のユーザー用に既に構成されていることを前提としています。 これはデフォルトプロファイルを使用します(コントロールパネルの[メール]に移動してデフォルトプロファイルを編集できます)。 このコードの大きな改善点の1つは、デフォルトの代わりに使用する一時的なプロファイルを作成し、完了した後で破棄することです。




私たちはこれを使って、見通しに頼らない解決策を提供しようとしています。

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

非常に高価ですが、開発時間を短縮し、品質を向上させることを願っています。




別のオプションのソリューション: NetPstExtractor

これは、Outlookがインストールされていない Outlook PSTファイルを読み込む.Net APIです。

here.デモ版を見つけることができますhere.




私はこの仕事を完了するのに役立つかもしれないMicrosoftから直接いくつかのリソースを見つけました。 MSDNで検索すると 、次のような結果が得られます。

Microsoft.Office.Interop.Outlookへの参照を追加するときは、COMタブの代わりに.NETタブを使用してドキュメントを作成するようにしてください。




Outlook用のThis .NETコネクタを使用すると、起動できます。







Links