是否可以使用 C# 读取 .PST 文件?我想将其作为独立的应用程序来执行,而不是作为 Outlook 插件(如果可能的话)。
如果见过other SO 问题 similar提到这一点邮件导航器但我希望在 C# 中以编程方式执行此操作。
我看过Microsoft.Office.Interop.Outlook名称空间,但这似乎仅适用于 Outlook 插件。LibPST似乎能够读取 PST 文件,但这是用 C 语言编写的(抱歉乔尔,我没有毕业前学C).
任何帮助将不胜感激,谢谢!
EDIT:
谢谢大家的回复!我接受 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;
}
}
}
Note:此代码假定 Outlook 已安装并已为当前用户配置。它使用默认配置文件(您可以通过转到控制面板中的邮件来编辑默认配置文件)。此代码的一项重大改进是创建一个临时配置文件来代替默认配置文件,然后在完成后将其销毁。
Outlook Interop 库不仅仅适用于插件。例如,它可用于编写一个仅读取所有 Outlook 联系人的控制台应用程序。我非常确定标准的 Microsoft Outlook Interop 库可以让您阅读邮件 - 尽管它可能会在 Outlook 中抛出安全提示,用户必须单击才能通过。
EDITS:实际使用 Outlook Interop 实现邮件阅读取决于您对“独立”的定义。 Outlook Interop 库需要在客户端计算机上安装 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();
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)