[调用RDOSession.LogOff时,Outlook赎回卡住

问题描述 投票:0回答:1

我想从Outlook收件箱中获取电子邮件。我正在安装Outlook 2016的Windows 10上使用最新版本的Redemption 5.21.0.5378。

[不幸的是,执行该操作的程序,我还没有编写,只是得到了使它正常工作的任务。我之前也没有使用过兑换。

这是代码(我删除了一些行,我认为这些行并不重要,如果您需要完整的方法,请说:):

        AMS.Profile.Xml mailboxesxml;
        Redemption.RDOSession rdo;
        Redemption.RDOFolder inbox;
        Redemption.RDOMail msg;
        Redemption.RDOAttachment att;

        string[] mailboxes;

        try
        {
            mailboxesxml = new AMS.Profile.Xml(appPath + "mailboxes.xml");

            rdo = new Redemption.RDOSession();
            mailboxes = mailboxesxml.GetSectionNames();
            if (mailboxes != null) 
            {
                foreach (string me in mailboxes) {

                    sserver = mailboxesxml.GetValue(me, "server", "");
                    suser = mailboxesxml.GetValue(me, "user", ""); //Environment.UserName);
                    spassword = mailboxesxml.GetValue(me, "password", ""); 
                    sfolder = mailboxesxml.GetValue(me, "folder", "");
                    stargetdir = mailboxesxml.GetValue(me, "targetdirectory", appPath);
                    stargetdir = IncludeBackslash(stargetdir);
                    sfilename = mailboxesxml.GetValue(me, "filename", "$$EntryID$$");

                    //LOGON
                    rdo.LogonHostedExchangeMailbox(sserver, suser, spassword);
                    inbox = rdo.GetFolderFromPath(sfolder);


                    Redemption.RDOItems mails;
                    mails = inbox.Items;

                    while (mails.Count > 0) {

                        msg = mails.Item(1);
                        fn = "Test"
                        msg.SaveAs(fn, exportFormat); 


                        msg.MarkRead(true);
                        msg.Delete(Redemption.redDeleteFlags.dfHardDelete);
                        Marshal.ReleaseComObject(msg);

                    }
                    writeLog(@"cleanup...1", 2);
                    Marshal.ReleaseComObject(inbox);
                    writeLog(@"cleanup...2", 2);
                    Marshal.ReleaseComObject(mails);
                    writeLog(@"cleanup...3", 2);
                    GC.Collect();
                    writeLog(@"cleanup...4", 2);
                    rdo.Logoff();
                    writeLog(@"cleanup...5", 2);

                }
            }
            Marshal.ReleaseComObject(rdo);
            writeLog(@"cleanup...6", 2);

        }
        catch (Exception ex)
        {
            writeLog(@"error retrieving mails: " + ex, 0);
            GC.Collect();
        }
        finally
        {
            GC.Collect();
            writeLog(@"cleanup...7", 2);
        }

程序成功登录到Outlook,获取邮件,将邮件标记为已读并删除邮件。但是当它调用rdo.Logoff();时方法,它只会卡住,甚至不会引发异常。

所以我从没收到过“ cleanup ... 5”日志。

也许与这个问题类似?Process gets stuck in oSession.Logoff()

一些其他相关信息:该应用程序是单线程的,它是在第一次运行时发生的。

谢谢

mapi outlook-redemption
1个回答
0
投票

尝试在调用注销之前调用GC.Collect()-调用注销时,您仍然具有实时的赎回对象(内部引用各种MAPI对象)。

您可能还想确定RDOSession以外的变量的范围,以确保GC.Collect()可以释放它们:

    Redemption.RDOSession rdo;
    try
    {
         MS.Profile.Xml mailboxesxml;
         Redemption.RDOFolder inbox;
         Redemption.RDOMail msg;
         Redemption.RDOAttachment att;
         string[] mailboxes;
         ...
    }
    catch (Exception ex)
    {
        writeLog(@"error retrieving mails: " + ex, 0);
        Marshal.ReleaseComObject(rdo);
        GC.Collect();
    }
    finally
    {
        GC.Collect();
        rdo.Logoff();
        Marshal.ReleaseComObject(rdo);
        writeLog(@"cleanup...7", 2);
    }
© www.soinside.com 2019 - 2024. All rights reserved.