使用Outlook兑换

时间:2015-08-05 06:52:30

标签: outlook-redemption

使用兑换将msg转换为eml时,Outlook UI线程被阻止

我正在开发一个outlook插件来将电子邮件同步到服务器作为eml。当插件开始时,它将启动一个计时器并检查是否有新的电子邮件,然后上传它们。对于每封电子邮件,我将使用outlook Redemption将它们转换为eml。它工作,但我发现在转换期间,Outlook UI将被阻止。我正在使用以下代码进行转换。我还尝试了RDOSession.GetMessageFromID(mail.EntryID)。一样的。任何人

public static string ToEmlFile(this Outlook.MailItem mail)
        {
            var msgFilename = Path.ChangeExtension(Path.GetTempFileName(), ".msg");
            mail.SaveAs(msgFilename);

            var item = RDOSessionMgr.GetInstance().GetMessageFromMsgFile(msgFilename);
            var emlFilename = Path.ChangeExtension(Path.GetTempFileName(), ".eml");
            item.SaveAs(emlFilename, Redemption.rdoSaveAsType.olRFC822);

            return emlFilename;
        }

 public class RDOSessionMgr
    {
        private static Redemption.RDOSession _session;

        static RDOSessionMgr()
        {
            _session = new Redemption.RDOSession();
            _session.Logon(Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        }

        public static Redemption.RDOSession GetInstance()
        {
            return _session;
        }
    }

1 个答案:

答案 0 :(得分:1)

您应该能够在辅助线程上运行该代码 - 将Application.Session.MAPIOBJECT属性的值保存在全局/类变量中,然后将该值分配给您的RDOSession对象的RDOSession.MAPIOBJECT属性在辅助线程上创建。

在相关的说明中,您也可以在主线程上使用该技术 - 由于您已经拥有Outlook使用的MAPI会话,因此没有理由从Outlook插件中部署RDOSession.LOgon。