73

C# を使用して .PST ファイルを読み取ることは可能ですか? これを Outlook アドインとしてではなく、スタンドアロン アプリケーションとして実行したいと考えています (可能であれば)。

この言及MailNavigatorに似た他の SOの 質問 を見たことがありますが、C#でプログラムでこれを行うことを検討しています。

Microsoft.Office.Interop.Outlook名前空間を確認しましたが、これは Outlook アドイン専用のようです。LibPSTは PST ファイルを読み取ることができるように見えますが、これは C で書かれています (申し訳ありませんが、ジョエル、私は卒業する前に 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 つは、デフォルトの代わりに使用する一時プロファイルを作成し、完了したら破棄することです。

4

13 に答える 13

30

Outlook Interop ライブラリはアドインだけのものではありません。たとえば、すべての Outlook 連絡先を読み取るだけのコンソール アプリを作成するために使用できます。標準の Microsoft Outlook Interop ライブラリを使用すると、メールを読むことができると確信していますが、ユーザーがクリックする必要があるセキュリティ プロンプトが Outlook に表示される可能性があります。

編集: Outlook Interop を使用して実際にメールの読み取りを実装することは、「スタンドアロン」の定義が何を意味するかによって異なります。Outlook Interop lib が機能するには、Outlook がクライアント マシンにインストールされている必要があります。

// 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();
    }
}
}
于 2009-02-23T15:12:14.627 に答える
6

サブフォルダーのリファクタリングを行いました

    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);
        }
    }
于 2009-11-28T21:24:39.533 に答える
6

リンクされた 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
于 2009-02-23T19:12:36.563 に答える
4

pstsdk.net: Outlook がインストールされていないpst ファイルを読み取るためのオープン ソースである PST ファイル形式 SDK ライブラリの .NET ポートを使用できます。

于 2011-04-01T09:54:14.620 に答える
3

Pstxyを試してください。

Outlook がインストールされていなくても、 Outlook PST および OST ファイルを読み取る .Net API を提供します。

メール コンテンツ (テキスト、html、rtf) を抽出するための無料バージョンがあります。プラス版はアタッチメントもサポートしています。

于 2015-03-03T01:31:50.263 に答える
2

Storesコレクションが表示されないことに言及している場合:

StoresコレクションはOutlook2007で追加されました。したがって、以前のバージョンから作成された相互運用ライブラリを使用している場合(バージョンに依存しないようにするため、これは非常に一般的です)、これがStoresが表示されない理由です。コレクション。

ストアを取得するための唯一のオプションは、次のいずれかを実行することです。

  • Outlook 2007の相互運用ライブラリを使用します(これは、以前のバージョンのOutlookではコードが機能しないことを意味します)。
  • Outlookオブジェクトモデルを使用してすべての最上位フォルダーを列挙し、各フォルダーのStoreIDを抽出してから、CDOまたはMAPIインターフェイスを使用して各ストアに関する詳細情報を取得します。
  • CDOセッションオブジェクトのInfoStoresコレクションを列挙してから、InfoStoreオブジェクトのfieldsコレクションを使用して、各ストアに関する詳細情報を取得します。
  • または(最も難しい方法)拡張MAPI呼び出しを使用します(C ++の場合):IMAPISession::GetMsgStoresTable。
于 2010-03-26T06:22:34.437 に答える
1

このタスクを完了するのに役立つ可能性のあるリソースを Microsoft から直接見つけました。MSDN で検索すると、次のことがわかります。

Microsoft.Office.Interop.Outlook への参照を追加する場合、ドキュメントでは COM タブではなく .NET タブを使用するように指示されていることに注意してください。

于 2011-03-14T20:26:19.233 に答える
1

これを使用して、Outlook に依存しないソリューションを提供します。

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

非常に高価ですが、開発期間の短縮と品質の向上につながることを願っています。

于 2010-02-16T11:47:38.330 に答える
0

はい、Independentsoft PST .NETを使用すると、パスワードで保護され暗号化された.pstファイルを読み取り/エクスポートできます。

于 2010-12-03T17:27:58.890 に答える
0

MAPI API は、あなたが探しているものです。残念ながら、.Net では使用できないため、アンマネージ コードを呼び出す必要があると思います。

簡単な Google でいくつかのラッパーが利用可能であることがわかります。

これも役立つかもしれません: http://www.wischik.com/lu/programmer/mapi_utils.html

于 2009-02-23T15:11:16.410 に答える
0

このOutlook 用 .NET コネクタを使用すると、作業を開始できます。

于 2009-02-23T15:12:20.137 に答える
-1

はい、MS Access を使用して、pst コンテンツをインポートするか、リンクするだけです (遅い!)。

于 2009-02-23T15:17:43.337 に答える