如果Outlook未以管理权限运行,则Outlook.Interop电子邮件创建将不起作用

时间:2018-09-17 06:10:53

标签: c# outlook interop

因此,问题如下:

下面的代码在Outlook应用程序未运行的情况下在我的桌面应用程序中运行良好。当Outlook以管理员权限运行时,它也可以正常工作。但是,当Outlook正常运行时,代码确实会引发错误。现在另一个问题是,不能要求用户以管理员身份继续运行Outlook,因为这样即时搜索将停止工作。

我的应用程序以对我的应用程序具有强制性的管理权限运行。

平台: Microsoft.NET Framework 4.6.2 展望2016 Windows 10

 public static void CreateOutlookEmail(string email, string subject, string body, string cc, string fileName)
    {
        try
        {
            Microsoft.Office.Interop.Outlook.Application app;
            try
            {
                app = (Microsoft.Office.Interop.Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
            }
            catch
            {
                app = new Microsoft.Office.Interop.Outlook.Application();
            }

            if (app == null)
            {
                return;
            }

            Microsoft.Office.Interop.Outlook.MailItem mailItem = app.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem) as
                                                                 Microsoft.Office.Interop.Outlook.MailItem;
            mailItem.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML;
            mailItem.Importance = Microsoft.Office.Interop.Outlook.OlImportance.olImportanceHigh;
            mailItem.Subject = subject;
            mailItem.To = email;
            mailItem.HTMLBody = body;
            mailItem.CC = cc;

            var fileInfo = new FileInfo(fileName);

            mailItem.Attachments.Add(fileName, Microsoft.Office.Interop.Outlook.OlAttachmentType.olByValue, 1,
                                     fileInfo.Name);
            //mailItem.Display();


            ((Microsoft.Office.Interop.Outlook._MailItem)mailItem).Send();

        }
        catch (Exception eX)
        {
            XtraMessageBox.Show(eX.Message + "\n" + eX.StackTrace + "\n" + eX.Source + "\n" + eX.InnerException);
        }
    }

1 个答案:

答案 0 :(得分:0)

COM系统不会在不同安全上下文中运行的应用程序(例如,常规应用程序和以管理员身份提升权限的应用程序)之间封送调用。它是如何设计的。

一种可能的解决方法是避免使用Outlook对象模型(进程外)并使用扩展MAPI(进程内加载了扩展MAPI),但这将您限制为C ++或Delphi。您还可以使用包装的扩展MAPI(例如Microsoft不再支持的CDO 1.21)或Redemption(其RDOSession对象类似于CDO 1.21中的Session或OOM中的命名空间对象)。请注意,您仍然遇到问题,因为PST和缓存的Exchange存储提供程序将无法共享在同一配置文件中使用的PST和OST文件,但在不同安全上下文中运行的进程之间将使用不同的MAPI会话。