使用与运行应用程序相同的凭据打开Outlook

时间:2015-05-12 09:50:16

标签: c# wpf windows outlook

我正在编写一个程序,需要打开Microsoft Outlook并在用户点击按钮时为其创建邮件项目。但是,当我这样做时,我收到以下错误:

由于以下错误,检索CLSID为{0006F03A-0000-0000-C000- 000000000046}的组件的COM类工厂失败:80080005服务器执行失败(HRESULT异常:0x80080005(CO_E_SERVER_EXEC_FAILURE))。 在研究了这个错误之后,我发现我的程序和MS Outlook都必须以管理员或普通权限级别运行。

所以这就是我的问题......如何使用与当前正在运行的程序相同的权限级别通过C#代码打开MS Outlook。我需要获取当前权限级别,然后使用该权限级别打开Outlook。到目前为止,我对此研究没有运气。任何帮助表示赞赏!

这是我打开MS Outlook以及如何使用它的代码(当前):

Application outlookApp = new Application();

MailItem mailItem = outlookApp.CreateItem(OlItemType.olMailItem);
mailItem.Subject = "Blah";
mailItem.HTMLBody= @"Various HTML stuff";

foreach (string documentPath in this.documentPaths)
{
    mailItem.Attachments.Add(documentPath, 1, 1, documentPath);
}

mailItem.Display(true);

我正在使用Microsoft.Office.Interop.Outlook。 如果outlook已经与管理员一起运行。然后我没有收到任何错误。

请建议。

2 个答案:

答案 0 :(得分:0)

我使用SimpleMAPI.NET打开标准电子邮件应用程序并发送电子邮件。我甚至调整它来打开一个特定的电子邮件应用程序,不同于在Windows中配置的应用程序。到目前为止适用于MS Outlook,甚至可以与其他电子邮件软件一起使用。

SimpleMAPI.NET可以从这里获得: http://www.codeproject.com/Articles/2048/Simple-MAPI-NET

如果您认为这种方法适用于您,只需发表评论,我将通过一些代码示例和我对SimpleMAPI.NET关于Outlook的修改扩展我的答案(上面的原始版本存在一些问题)。

我在这里提出这个建议,因为我的团队最初是通过COM使用Outlook(就像你现在一样),遇到了几个问题,然后选择了我的MAPI解决方案。它被证明是一种多功能的稳定性,如果只有一个"只有"想通过外部应用程序发送电子邮件......

答案 1 :(得分:0)

Outlook is a singleton, so to make sure it is running on the same trust level as your app, your app must be the one that starts it.

  1. You can try to kill Outlook first (not very nice and the user won't appreciate it) before restarting it from your app.

  2. You can use Extended MAPI (C++ or Delphi) or Redemption (it wraps Extended MAPI and can be used from any language) - MAPI is loaded in-proc, so it will work even if Outlook is already running. But you will not be able to display the items: outlook.exe is the one that ends up displaying messages even if you use MAPI, so you are back where you started.

Why do your app and Outlook end up running in different security contexts?