Outlook Redemption застревает при вызове RDOSession.LogOff - PullRequest
0 голосов
/ 20 ноября 2019

Я хочу получать электронные письма из почтового ящика Outlook. Я использую новейшую версию Redemption 5.21.0.5378 в Windows 10 с установленным Outlook 2016.

К сожалению, Программа, которая делает это, я не написал, я просто получил задачу, чтобы она заработала. Я также не использовал Redemption раньше.

Вот код (я удалил несколько строк, которые, я думаю, не важны, если вам нужен полный метод, просто скажите):

        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".

Может, это что-то похожее на этот вопрос? Процесс застревает в oSession.Logoff ()

Еще одна важная информация: приложение является однопоточным и происходит при первом запуске.

Спасибо

1 Ответ

0 голосов
/ 21 ноября 2019

Попытайтесь вызвать GC.Collect() перед вызовом Logoff - у вас все еще есть живые объекты Redemption (которые внутренне ссылаются на различные объекты MAPI), когда вы вызываете Logoff.

Возможно, вы также захотите охватить переменные, отличные от 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);
    }
...