我可以在 C# 中读取 Outlook (2003/2007) PST 文件吗? [英] Can I read an Outlook (2003/2007) PST file in C#?

查看:40
本文介绍了我可以在 C# 中读取 Outlook (2003/2007) PST 文件吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以使用 C# 读取 .PST 文件?我想作为一个独立的应用程序来做这个,而不是作为一个 Outlook 插件(如果可能的话).

Is it possible to read a .PST file using C#? I would like to do this as a standalone application, not as an Outlook addin (if that is possible).

如果看过其他SO 问题 类似于 与此提及 MailNavigator 但我是希望在 C# 中以编程方式执行此操作.

If have seen other SO questions similar to this mention MailNavigator but I am looking to do this programmatically in C#.

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

I have looked at the Microsoft.Office.Interop.Outlook namespace but that appears to be just for Outlook addins. LibPST appears to be able to read PST files, but this is in C (sorry Joel, I didn't learn C before graduating).

非常感谢任何帮助,谢谢!

Any help would be greatly appreciated, thanks!

谢谢大家的回复!我接受了 Matthew Ruston 的回答作为答案,因为它最终让我找到了我正在寻找的代码.这是我开始工作的一个简单示例(您需要添加对 Microsoft.Office.Interop.Outlook 的引用):

Thank you all for the responses! I accepted Matthew Ruston's response as the answer because it ultimately led me to the code I was looking for. Here is a simple example of what I got to work (You will need to add a reference to 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:	empPSTTest.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.它使用默认配置文件(您可以通过转到控制面板"中的邮件"来编辑默认配置文件).此代码的一项主要改进是创建一个临时配置文件来代替默认配置文件,然后在完成后销毁它.

Note: This code assumes that Outlook is installed and already configured for the current user. It uses the Default Profile (you can edit the default profile by going to Mail in the Control Panel). One major improvement on this code would be to create a temporary profile to use instead of the Default, then destroy it once completed.

推荐答案

Outlook Interop 库不仅适用于插件.例如,它可用于编写仅读取所有 Outlook 联系人的控制台应用程序.我很确定标准的 Microsoft Outlook Interop 库可以让您阅读邮件 - 尽管它可能会在 Outlook 中引发用户必须点击的安全提示.

The Outlook Interop library is not just for addins. For example it could be used to write a console app that just reads all your Outlook Contacts. I am pretty sure that the standard Microsoft Outlook Interop library will let you read the mail - albeit it will probably throw a security prompt in Outlook that the user will have to click through.

编辑:实际使用 Outlook Interop 实现邮件阅读取决于您对独立"的定义.Outlook Interop 库需要在客户端计算机上安装 Outlook 才能运行.

EDITS: Actually implementing mail reading using Outlook Interop depends on what your definition of 'standalone' means. The Outlook Interop lib requires Outlook to be installed on the client machine in order to function.

// 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 + "
" + item.Body);
        }
        Console.ReadKey();
    }
}
}

这篇关于我可以在 C# 中读取 Outlook (2003/2007) PST 文件吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆