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 つは、デフォルトの代わりに使用する一時プロファイルを作成し、完了したら破棄することです。