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

Get open outlook email as MailItem in Windows service

如果是桌面应用程序,如果我执行以下代码行来打开电子邮件,然后获取相关的 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() returns NULL...没有 window(检查器)打开。

所以问题是:如何link一个MailItem实例到Windows服务中当前打开的邮件?

事实上,Microsoft 目前不推荐也不支持从任何无人值守的非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务),因为当 Office 在此环境中 运行 时,Office 可能表现出不稳定的行为 and/or 死锁。

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

您可以在 Considerations for server-side Automation of Office 文章中阅读更多相关信息。

考虑改用低级 API - 扩展 MAPI 允许 运行 来自 Windows 服务或任何其他第三方包装器的代码围绕 API(例如,救赎)。

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