使用 Redemption API 创建的 PST 文件在 Microsoft Outlook 中加载时为空

Created PST file using Redemption API is empty when loaded in Microsoft Outlook

环境:我有一个 windows 控制台应用程序,我正在从命令行 运行 安装 exe。 下面是我的代码:

 static void Main(string[] args)
 {
   CreatePSTUsingRedemption(args[0], args[1]);
 }
 private static void CreatePSTUsingRedemption(string messageFilePath, string pstPath)
 {       
   RDOSession pstSession = new RDOSession();
   RDOPstStore store = null;
   store = pstSession.LogonPstStore(pstPath, 1, "combinedPST");
   //actually there is a loop here to loop through each message files.
   RDOMail rdo_Mail = pstSession.GetMessageFromMsgFile(messageFilePath);
   rdo_Mail.CopyTo(store.IPMRootFolder);
   rdo_Mail.Save();
   store.Save();
   completedCount++;
   Console.WriteLine("FILES_PROCESSED:" + completedCount);
   pstSession.Logoff();
 }

此代码的主要目的是创建一个合并电子邮件 (.msg) 文件的 pst 文件。 现在,当我 运行 exe 时,在给定位置创建了一个 pst 文件,并且其大小随着代码 运行s 不断增加。处理完所有消息文件后,应用程序就存在了。没有任何错误。现在,当我尝试在 Outlook 2013 中加载这个 pst 文件时。Pst 是空的,而且每次它的大小也减少到 265KB。我认为没有任何进程在使用这个 pst,因为我可以将它复制并移动到任何我想要的地方。可能是什么问题?有什么建议吗?

更新 1

private static void CreatePSTUsingRedemption(XmlNodeList nodelist, string pstPath)
    {
        System.Diagnostics.Debugger.Launch();
        RDOSession pstSession = null;
        RDOPstStore store = null;
        RDOFolder folder = null;
        RDOMail rdo_Mail = null;
        try
        {
            pstSession = new RDOSession();
            store = pstSession.LogonPstStore(pstPath, 1, Path.GetFileNameWithoutExtension(pstPath));             
            var enumerator = store.IPMRootFolder.Folders.GetEnumerator(); //DELETE DEFAULT FOLDERS
            while (enumerator.MoveNext())
            {
                var defaultFolders = enumerator.Current as RDOFolder;
                    defaultFolders.Delete();
            }
            int completedCount = 0;
            folder = store.IPMRootFolder;
            foreach (XmlNode node in nodelist)
            {
                rdo_Mail = pstSession.GetMessageFromMsgFile(node["FullPath"].InnerText);              
                rdo_Mail.CopyTo(folder);
                rdo_Mail.Save();
                store.Save();
                completedCount++;
                Console.WriteLine("FILES_PROCESSED:" + completedCount);                              
            }            
        }
        finally
        {
            Marshal.ReleaseComObject(rdo_Mail);
            Marshal.ReleaseComObject(folder);
            Marshal.ReleaseComObject(store);
        }
        pstSession.Logoff();
        Marshal.ReleaseComObject(pstSession);
        GC.Collect();
    }

以上是我的实际循环代码。我正在从 xml 文件加载所有电子邮件文件路径。我仍然遇到与上述相同的问题。

这表明 PST 存储未完全刷新到磁盘,Outlook 通过重置“修复”了 PST 文件。

尝试先明确释放所有 Redemption 对象,然后再注销并调用 GC.Collect()。如果您有一个处理多个文件的循环,请在循环的每一步释放消息。

 private static void CreatePSTUsingRedemption(string messageFilePath, string pstPath)
 {       
   RDOSession pstSession;
   try
   {
     RDOPstStore store;
     RDOFolder folder;
     RDOMail rdo_Mail;
     pstSession = new RDOSession();
     store = pstSession.LogonPstStore(pstPath, 1, "combinedPST");
     //actually there is a loop here to loop through each message files.
     rdo_Mail = pstSession.GetMessageFromMsgFile(messageFilePath);
     folder = store.IPMRootFolder;
     rdo_Mail.CopyTo(folder);
     rdo_Mail.Save();
     store.Save();
     completedCount++;
     Console.WriteLine("FILES_PROCESSED:" + completedCount);
   }
   finally
   {
     Marshal.ReleaseComObject(rdo_Mail);
     Marshal.ReleaseComObject(folder);
     Marshal.ReleaseComObject(store);
   }
   pstSession.Logoff(); 
   Marshal.ReleaseComObject(pstSession);
   GC.Collect();
 }