我想从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()
一些其他相关信息:该应用程序是单线程的,它是在第一次运行时发生的。
谢谢
尝试在调用注销之前调用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);
}