我尝试使用以下代码在我的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对象在另一个上面仍在使用时被释放 线程。
想知道为什么我会收到此错误,我该怎么做才能解决它?
感谢您的帮助。
答案 0 :(得分:2)
首先,错误意味着您的应用已经释放了COM对象
其次,绝对没有理由在单独的线程中运行MailItem.Send
- Send
方法无论如何都是异步的。 Outlook只是将邮件标记为准备提交,并将其交给传输提供程序,后者异步发送它。