从c#应用程序访问Outlook的问题

时间:2014-11-14 19:24:38

标签: c# outlook console-application marshalling office-interop

我正在编写一个控制台应用程序,用于检查Outlook邮箱的内容,以便将特定电子邮件的内容读入数据库。

无论Outlook是否开放,此应用程序在Visual Studio中都能正常运行。

如果我构建应用程序并从exe运行它,它只在Outlook打开时才有效,这不是一个真正的问题。

但是,我需要从计划任务运行它,因为它必须每隔几分钟运行一次。这根本不起作用。

我使用以下代码:

System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("OUTLOOK");

int collCount = processes.Length;

if (collCount != 0)
{
    OutlookApp = Marshal.GetActiveObject("Outlook.Application") as Application;  
}
else
{
    OutlookApp = new Application();
} 

我收到的错误消息是:

  

System.Runtime.InteropServices.COMException(0x800401E3):操作   不可用(来自HRESULT的异常:0x800401E3(MK_E_UNAVAILABLE))
  在System.Runtime.InteropServices.Marshal.GetActiveObject(Guid&   rclsid,IntPtr reserved,Object& pp。)   System.Runtime.InteropServices.Marshal.GetActiveObject(String progID)   在ImportCruiseEmails.Program.Main()

在线:

Marshal.GetActiveObject("Outlook.Application") as Application;

Outlook和控制台应用程序都在我的用户帐户下运行,该帐户具有管理员权限。我整个下午一直把头发拉出来。任何人都可以对此有所了解吗?干杯!

1 个答案:

答案 0 :(得分:5)

即使用户帐户相同,安全上下文也不同,因为调度程序作为服务运行。并且不能在服务中使用Office应用程序。

您的选择

  1. 如果是Exchange Server,请使用EWS访问邮箱。

  2. 扩展MAPI(仅限C ++或Delphi)

  3. Redemption(任何语言) - 它包装扩展MAPI,并且可以从服务中使用其RDO系列对象。