在Windows服务中打开outlook电子邮件作为MailItem

本文关键字:电子邮件 MailItem outlook Windows 服务 | 更新日期: 2023-09-27 17:53:54

在桌面应用程序的情况下,如果我执行以下代码行打开电子邮件,然后获得相关的MailItem,一切正常:

 string file = @"C:'TestEML'EmlMail.eml";
 System.Diagnostics.Process.Start(file);
 Outlook.Application oApp = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
 Outlook.MailItem oItem = (Outlook.MailItem)oApp.ActiveInspector().CurrentItem; // now oItem is the COM object that represents our .eml file

但是如果是Windows服务呢?前面的代码不起作用,因为oApp.ActiveInspector()返回NULL…没有窗口(检查器)打开。

那么问题是:如何在Windows服务中将MailItem实例链接到当前打开的邮件?

在Windows服务中打开outlook电子邮件作为MailItem

事实是,微软目前不推荐,不支持,微软办公自动化应用程序从任何无人值守,交互的客户机应用程序或组件(包括ASP, ASP。. NET、DCOM和NT服务),因为在这种环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁。

如果您正在构建一个在服务器端上下文中运行的解决方案,那么您应该尝试使用那些对于无人值守执行是安全的组件。或者,您应该尝试找到至少允许部分代码在客户端运行的替代方案。如果从服务器端解决方案使用Office应用程序,则该应用程序将缺乏成功运行所需的许多功能。此外,您将在整个解决方案的稳定性方面承担风险。

您可以在Office服务器端自动化的注意事项文章中了解更多信息。

考虑使用低级API——扩展的MAPI,它允许从Windows服务或任何其他第三方包装器运行该API的代码(例如,Redemption)。

Windows服务的全部意义在于让你的代码在没有用户登录的情况下运行。但是,如果你试图访问Outlook中当前打开的邮件,为什么你甚至需要作为服务运行呢?将代码移到COM插件中,它将在每次Outlook运行时运行。