使用Outlook互操作发送电子邮件时出现COM异常

时间:2018-04-09 21:18:59

标签: c# outlook com office-interop

我尝试使用以下代码在我的WPF应用中发送电子邮件。

private static void ApplicationDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
//Log the exception details here:            
e.Handled = true;

SendEmail();
}

private void SendEmail()
{
try

{
app = new Outlook.Application();

ns = app.GetNamespace("mapi");

ns.Logon(Missing.Value, Missing.Value, true, true);

msg = (Outlook.MailItem)app.CreateItem(Outlook.OlItemType.olMailItem);

...
...
...

await Task.Run(() =>
                {
                    (msg as Outlook._MailItem).Send();
                    AppLogger.Log.Info("Email sent successfully!.");
                });
}

catch(Exception ex)
{
//Handle exception here.
}


finally
            {
                if (ns != null)
                {
                    ns.Logoff();
                }

                msg = null;
                ns = null;
                app = null;
            }
}

此代码似乎工作正常,并且在其他环境中部署时会发送电子邮件。 但今天,当我通过Visua Studio在我的机器上运行代码时,我在此行收到以下错误 - > (msg as Outlook._MailItem).Send();

  

异常:[System.Runtime.InteropServices.InvalidComObjectException:   已与基础RCW分离的COM对象不能   用过的。 COM对象在另一个上面仍在使用时被释放   线程。

想知道为什么我会收到此错误,我该怎么做才能解决它?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

首先,错误意味着您的应用已经释放了COM对象 其次,绝对没有理由在单独的线程中运行MailItem.Send - Send方法无论如何都是异步的。 Outlook只是将邮件标记为准备提交,并将其交给传输提供程序,后者异步发送它。