在我启动Outlook之前,使用Outlook对象模型发送的电子邮件一直保留在发件箱中

本文关键字:Outlook 一直 电子邮件 保留 之前 使用 对象模型 启动 | 更新日期: 2023-09-27 18:29:08

我正在尝试使用Outlook对象模型从.NET应用程序发送电子邮件。

我的应用程序显示Outlook邮件窗口,这样用户就可以看到我们要发送的内容并首先对其进行编辑。当用户点击"发送"按钮时,Outlook窗口将关闭,邮件将被发送。只要Outlook应用程序已经在运行,这就可以完美地工作。

如果Outlook应用程序尚未运行,则邮件会卡在"发件箱"中,并且在我启动Outlook之前不会发送。当我启动Outlook时,我可以看到邮件在"发件箱"文件夹中停留几秒钟,然后它就被发送了。

这是我用来发送电子邮件的代码的简化版本:

Outlook.Application app = new Outlook.Application();
var ns = app.GetNamespace("MAPI");
// (ref: https://msdn.microsoft.com/en-us/library/office/ff861594.aspx)
// If outlook is already running, this does nothing.  If it isn't, this has the 
// side-effect of initializing MAPI to use the default profile and make the object 
// model fully functional
var mailFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
var mailItem = (Outlook.MailItem)ns.Application.CreateItem(Outlook.OlItemType.olMailItem);
mailItem.To = "me@nowhere.com";
mailItem.Subject = "This is a test";
mailItem.HTMLBody = "<html>A bunch of HTML</html>";
mailItem.Display(true);

注意:如果将对mailItem.Display()的调用替换为mailItem.Send(),则无论Outlook是否正在运行,它都可以工作不幸的是,这不是一个选项,因为我需要用户能够在发送消息之前编辑它。

我想我需要一种方法来检测消息何时完成发送,并在此之前保持Outlook.Application对象的活动状态。。。但我不知道该怎么做。我的应用程序是一个控制台应用程序,需要在发送电子邮件后退出。让线程休眠一段时间并不能做到这一点(可能是因为我正在等待的任何事情都发生在同一个线程上)。

在我启动Outlook之前,使用Outlook对象模型发送的电子邮件一直保留在发件箱中

如果不再打开或引用任何窗口(浏览器或检查器),Outlook将退出。

引用检查器对象,从Namespace.SyncObjects中检索第一个SyncObject对象,然后等待SyncObject.SyncEnd事件激发。

insp = mailItem.GetInspector;
insp.Display(true);
//keep insp referenced