如果是桌面应用程序,如果我执行以下代码行打开电子邮件然后获取相关的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 ...没有窗口(检查器)打开。
所以问题是:如何将MailItem实例链接到Windows服务中的当前打开的电子邮件?
答案 0 :(得分:0)
事实是, Microsoft目前不建议并且不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序),因为Office在此环境中运行时可能会出现不稳定的行为和/或死锁。
如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。
您可以在Considerations for server-side Automation of Office文章中详细了解相关内容。
考虑使用低级API - 扩展MAPI,它允许从Windows服务或该API周围的任何其他第三方包装器运行代码(例如,Redemption)。
答案 1 :(得分:0)
Windows服务的重点是在没有用户登录时运行代码。但是如果您尝试访问Outlook中当前打开的消息,为什么甚至需要作为服务运行?将代码移动到COM插件,它将在Outlook运行时运行。