【问题标题】:Access users outlook email from IIS application从 IIS 应用程序访问用户 Outlook 电子邮件
【发布时间】:2018-07-19 08:58:58
【问题描述】:

我们在 IIS 服务器上托管了一个 .net 应用程序。 此应用程序尝试从当前登录用户的 Outlook 中读取电子邮件。

我正在使用库using Microsoft.Office.Interop.Outlook;,下面是我的代码。

当这段代码从我的 VS 运行时,我可以查看电子邮件。 当我在 IIS 上部署此应用程序时,我无法阅读任何电子邮件。

这是记录的错误。

由于以下错误,检索具有 CLSID {0006F03A-0000-0000-C000-000000000046} 的组件的 COM 类工厂失败:80070005 访问被拒绝。 (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))。

我是否遵循正确的方法来访问电子邮件,或者是否有任何不同的方法来存档?请赐教。

下面是整个代码。

try
        {

            outlookApplication = new Application();
            outlookNamespace = outlookApplication.GetNamespace("MAPI");
            inboxFolder = outlookNamespace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
            mailItems = inboxFolder.Items;

            foreach (object item in inboxFolder.Items)
            {

              if (item is Microsoft.Office.Interop.Outlook.MailItem)
                {
                        Microsoft.Office.Interop.Outlook.MailItem mailitem = (Microsoft.Office.Interop.Outlook.MailItem)item;
                        if(mailitem.ReceivedTime.Date ==DateTime.Today)
                        {
                            TempEmail objTempEmail = new TempEmail();
                            objTempEmail.From = mailitem.SenderEmailAddress;
                            objTempEmail.To = mailitem.To;
                            objTempEmail.CC = mailitem.CC;
                            objTempEmail.Subject = mailitem.Subject;
                            objTempEmail.Body = mailitem.Body;

                            lTempEmail.Add(objTempEmail);
                            Marshal.ReleaseComObject(mailitem);
                        }
                }

            }

        }
        catch (System.Exception ex)
        {
            log.Error(ex.Message + "" + ex.InnerException);
        }
        finally
        {
            ReleaseComObject(mailItems);
            ReleaseComObject(inboxFolder);
            ReleaseComObject(outlookNamespace);
            ReleaseComObject(outlookApplication);
        }

【问题讨论】:

  • 'inboxFolder' 将指向托管 IIS 的本地计算机上的文件夹,而不是登录的用户文件夹,除非您遗漏了一些代码
  • 您无法访问客户端设备上的数据!
  • 您可能需要考虑交换 Web 服务而不是 Outlook 互操作,您需要直接与使用当前用户凭据进行身份验证的交换服务器对话。
  • @StephenMuecke 注明。
  • @Charleh 将对此进行研究。谢谢

标签: c# .net asp.net-mvc iis office-interop


【解决方案1】:

“我是否遵循正确的方法”

没有。 Outlook 互操作只能在本地计算机上运行。您将实现的只是检查 AppPool 的收件箱,该收件箱将不存在。

【讨论】:

    【解决方案2】:

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

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

    如果您处理基于 Exchange 的邮箱,作为一种解决方法,您可以考虑使用 EWS 或 Outlook REST API。有关更多信息,请参阅EWS Managed API, EWS, and web services in Exchange

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 2012-12-09
      • 2012-08-11
      • 2016-02-19
      • 1970-01-01
      相关资源
      最近更新 更多