无法为此会话加载Outlook数据文件(.pst)

Ram*_*Ali 6 c# outlook

我正在使用Microsoft.Office.Interop.Outlook版本12.0.0.0来读取我的outlook pst文件,但是当编译器到达此代码时, outlookNs.AddStore(pstFilePath); 它会出现"Outlook数据文件(.pst)无法为此会话加载"的异常.我也试过,outlookNs.AddStoreEx(pstFilePath);但错误是相同的....任何sugession?

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sur*_*dra 1

我遇到了同样的问题,以下是我所做的。

当您说 OutlookNs.AddStore 时,您必须给出路径和文件名。然后在 OutlookNs.Stores 中,变量 pstName 应该具有 .pst 扩展名,您必须将其删除。

下面是我如何让它工作的示例。

public class Mail
{
    public MailItem mailItem { get; set; }
    public String path { get; set; }
}


public static class Mails
{
    public static List<Mail> readPst(string pstFilePath, string pstName)
    {
        List<Mail> mail = new List<Mail>();
        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 + pstName);

        string storeInfo = null;

        foreach (Store store in outlookNs.Stores)
        {
            storeInfo = store.DisplayName;
            storeInfo = store.FilePath;
            storeInfo = store.StoreID;
        }

        MAPIFolder rootFolder = outlookNs.Stores[pstName.Substring(0,pstName.Length-4)].GetRootFolder();

        // Traverse through all folders in the PST file
        Folders subFolders = rootFolder.Folders;

        foreach (Folder folder in subFolders)
        {
            ExtractItems(mail, folder);
        }
        // Remove PST file from Default Profile
        outlookNs.RemoveStore(rootFolder);
        return mail;
    }

    private static void ExtractItems(List<Mail> 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;
                Mail mail = new Mail();
                mail.mailItem = mailItem;
                mail.path = folder.FolderPath + folder.Name;
                mailItems.Add(mail);
            }
        }

        foreach (Folder subfolder in folder.Folders)
        {
            ExtractItems(mailItems, subfolder);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)