我们已经在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);
}
答案 0 :(得分:0)
“我遵循正确的方法”
不。 Outlook互操作将仅在本地计算机上工作。您将要做的就是检查AppPool的收件箱,该收件箱将不存在。
答案 1 :(得分:0)
Microsoft当前不建议并且不支持从任何无人参与的非交互客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT Services)自动化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。