调用outlook电子邮件时c#asp.net超时

时间:2015-04-09 12:00:35

标签: c# asp.net .net outlook office-interop

  

我的要求是我需要开发一个网络应用程序,(这是强制性的   成为一个网络应用程序)   此应用程序列出了以前的Outlook模板   直接保存在特定的。
  除了每个模板,还有一个负载   按钮,如果需要,可以说加载链接   代理人(客户端)   单击它,应该使用该模板打开Outlook。

我正试图从我的asp.net应用程序打开outlook。当我点击我的按钮时,我执行此代码

Microsoft.Office.Interop.Outlook._MailItem oMailItem2 = oApp.CreateItemFromTemplate(templateFilePath);
oMailItem2.Display(true);

它正在我的机器上工作,但是当我在服务器上部署它时,我收到了这个错误:

Request timed out.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Web.HttpException: Request timed out.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[HttpException (0x80004005): Request timed out.]

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929

这似乎是一个非常普遍的错误,请问可能是什么问题?我该如何诊断?

注意

我的案例中的邮件正文必须是html,而不是文本。这就是为什么我无法mailto喜欢这个

<a href="mailto:someone@example.com?subject=This%20is%20the%20subject&cc=someone_else@example.com&body=This%20is%20the%20body">Send email</a>

4 个答案:

答案 0 :(得分:2)

Marco,正如我已经在Retrieving the COM class factory for component with CLSID error: 80070005 Access is denied

写给你的那样

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

如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。

作为一种解决方法,您可以使用低级API - 扩展MAPI。或者该API周围的任何其他第三方包装器(例如,Redemption)。

答案 1 :(得分:1)

我认为您遇到了这个问题:您是否曾尝试以Marco身份登录您的PC,然后使用您的帐户设置Outlook。 然后,如果您以其他用户身份登录,则必须使用其电子邮件帐户正确配置Outlook 实际上,当IIS启动你的asp.net应用程序时,它就生活在一个没有用户的地方。会话,并且没有可用于Outlook的设置。
也许,你的调试程序有效,因为它被发布到一个正常的&#34; Marco&#34;会话。

可能的解决方案

  1. 创建真实用户(即&#34;服务器管理员&#34;),与该用户一起登录 服务器和配置Outlook

  2. 打开IIS,获取应用程序的应用程序池,选择&#34;高级设置&#34;然后设置&#34;应用程序池标识&#34;到&#34;自定义帐户&#34;

  3. 我希望这足以让您的计划有效。

答案 2 :(得分:1)

因此,您在服务器上有一个.msg文件,并且您想要编辑它并将其传输给用户。

1)编辑模板

https://www.google.it/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=c%23+edit+.msg+file

有许多第三方工具可以帮助编辑.msg文件
2。将其发送给用户

using (FileStream fs = File.OpenRead(path)) 
{ 
int length = (int)fs.Length; 
byte[] buffer; 

using (BinaryReader br = new BinaryReader(fs)) 
{ 
buffer = br.ReadBytes(length); 
} 

Response.Clear(); 
Response.Buffer = true; 
Response.AddHeader("content-disposition", String.Format("attachment;filename={0}", Path.GetFileName(path))); 
Response.ContentType = "application/" + Path.GetExtension(path).Substring(1); 
Response.BinaryWrite(buffer); 
Response.End() 
}

答案 3 :(得分:0)

这里的基本问题是您尝试在一个应用程序中混合客户端和服务器逻辑。从ASP.NET应用程序服务器端打开Outlook窗口是一个非常糟糕的主意 - 不允许IIS应用程序池与用户桌面交互(从Windows Vista或Windows Server 2008开始,它们在会话0中运行,但没有可见桌面可用)。因此Outlook窗口打开,但没有人会看到它。我假设如果它是一个模态窗口,它会阻止导致超时的父线程,但我不确定,因为我还没有机会检查它。在您的开发计算机上,您有一个IIS Express实例,该实例与当前用户在同一会话中运行,这就是您可以看到Outlook窗口的原因。在与Outlook对话框交互的整个过程中,请求可能会挂起。

我知道您受到时间压力,所以我现在唯一的建议是在您的客户端计算机上安装IIS Express(您可以从这里获取它:http://www.microsoft.com/en-us/download/details.aspx?id=34679)并从中运行您的应用程序。但在此期间重写此逻辑 - 创建一个Web表单以允许用户撰写电子邮件,然后使用SmtpClient类为其发送或使用mailto url打开Outlook窗口并显示有效数据在它。