我可以用 C # 阅读 Outlook (2003/2007) PST 文件吗?

是否可以阅读。PST 文件使用 C # ?我想这样做作为一个绿色软体,而不是作为一个 Outlook 插件(如果可能的话)。

如果已经看到 其他 那么 问题 相似到这提到 邮件导航员,但我期待这在 C # 的编程。

我已经查看了 Microsoft.Office. Interop. Outlook名称空间,但这似乎只适用于 Outlook 插件。LibPST似乎能够读取 PST 文件,但这是在 C (对不起,乔尔,我没有 毕业前学 C)。

任何帮助都将不胜感激,谢谢!

编辑:

谢谢大家的回应!我接受了 Matthew Ruston 的回答,因为它最终指引我找到了我正在寻找的代码。这里是一个简单的例子,我得到了什么工作(您将需要添加一个参考微软。办公室。互联系统。展望) :

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 已经安装并已为当前用户配置。它使用默认配置文件(您可以通过转到控制面板中的 Mail 来编辑默认配置文件)。此代码的一个主要改进是创建一个临时配置文件来代替默认配置文件,然后在完成后销毁它。

66240 次浏览

您正在寻找的是 MAPI。不幸的是,在。因此,恐怕您将不得不使用调用非托管代码。

一个快速的谷歌显示几个包装可用,也许他们为你工作?

这可能也有帮助: http://www.wischik.com/lu/programmer/mapi_utils.html

OutlookInterop 库不仅适用于插件。例如,它可以用来编写一个控制台应用程序,只读取您所有的 Outlook 联系人。我非常肯定,标准的 Microsoft Outlook Interop 库可以让您阅读邮件——尽管它可能会在 Outlook 中抛出一个安全提示,用户将不得不点击该提示。

EDITS : 实际上使用 Outlook Interop 实现邮件阅读取决于您对“独立”的定义是什么。OutlookInterop 库要求在客户端计算机上安装 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();
}
}
}

这个用于 Outlook 的 . NET 连接器可能会帮助您入门。

是的,你可以使用微软访问,然后你要么导入你的 pst 内容或只是链接它(慢!)。

正如在您的一个链接的 SO 问题中已经提到的,我还建议使用 救赎库。我在一个商业应用程序中使用它来处理 Outlook 邮件和执行各种任务。它的工作完美无缺,并防止显示恼人的安全警报。这将意味着使用 COM 互操作,但这应该不是一个问题。

在这个包中有一个名为 RDO 的库,它取代了 CDO 1.21,它允许您直接访问 PST 文件。然后就像写代码(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

我完成了子文件夹的重构

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

我们将利用这一点,提供一个不依赖前景的解决方案。

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

这是非常昂贵的,但我们希望这将降低开发时间和提高质量。

对于那些提到他们没有看到 Stores 收藏的人:

Stores 集合是在 Outlook2007中添加的。因此,如果您正在使用从早期版本创建的互操作库(试图独立于版本-这是非常常见的) ,那么这就是为什么您不会看到 Stores 集合的原因。

您获得商店的唯一选择是执行下列操作之一:

  • 对 Outlook2007使用互操作库(这意味着您的代码不能用于早期版本的 Outlook)。
  • 使用 Outlook 对象模型枚举所有顶级文件夹,提取每个文件夹的 StoreID,然后使用 CDO 或 MAPI 接口获取关于每个存储的更多信息。
  • 枚举 CDO 会话对象的 InfoStores 集合,然后使用 InfoStore 对象的字段集合以获取有关每个存储的更多信息。
  • 或者(最难的方法)使用扩展的 MAPI 调用(在 C + + 中) : IMAPISsession: : GetMsgStoresTable。

是的,使用独立软件 PST. NET 可以读取/导出受密码保护和加密的. PST 文件。

我发现一些资源直接从微软可能有助于完成这项任务。在 MSDN 上搜索揭示了以下内容。

请注意,在添加对 Microsoft 的引用时。办公室。互联系统。展望,文件坚持您这样做通过。NET 选项卡而不是 COM 选项卡。

您可以使用开源的 NET: . NET 端口的 PST 文件格式 SDK库来读取已安装的 pst 文件 没有 Outlook。

试试 Pstxy

它提供.Net API 来读取安装 Outlook 所需的 OutlookPST 和 OST 文件 没有

它有一个免费的版本来提取邮件内容(text,html & rtf)。

非常有用的代码。如果有 pst 并将消息存储在根目录中(没有任何目录) ,那么可以在 readPst 方法中使用以下内容:

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