【问题标题】:Get open outlook email as MailItem in Windows service在 Windows 服务中获取打开的 Outlook 电子邮件作为 MailItem
【发布时间】:2015-06-06 07:31:50
【问题描述】:

对于桌面应用程序,如果我执行以下代码行来打开一封电子邮件,然后获取相关的 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 服务中当前打开的电子邮件?

【问题讨论】:

    标签: c# service outlook


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多