我在从ASP.Net应用程序发送大量电子邮件时遇到问题。我不会发布代码,而是解释发生了什么。该代码应该向4000个收件人发送电子邮件,但似乎停留在385/387。
代码以字符串形式创建电子邮件的内容。
然后选择要发送到的电子邮件地址列表。
通过数据加载器循环访问数据,它会选择电子邮件地址并发送电子邮件。
电子邮件发送是通过一个单独的方法完成的,该方法可以处理失败并返回结果。
在发送每条记录时,我在XML文档中生成一个XML节点,以记录每个特定的发送尝试。
循环似乎过早结束,XML文档保存到磁盘。
现在我知道代码有效了。我使用相同的SMTP机器在本地运行它,它可以正常工作500条记录。虽然内容较少,但我看不出这会有什么不同。
我不认为页面本身超时,但即使它确实如此,我确信.Net会继续处理页面,即使用户看到页面超时错误。
任何建议都会欣赏,因为我很难过。
答案 0 :(得分:4)
您正在发送大量电子邮件。在单个请求的范围内?如果请求花费的时间超过某个(可配置的)时间,IIS将终止请求。
您需要使用单独的流程来执行此类操作。无论是从global.asax开始的Timer,还是检查数据库/ app_data目录中的电子邮件列表的线程,或者是通过WCF发送请求的服务,还是这些服务的某些组合。
答案 1 :(得分:2)
我过去处理这个问题的方法是将电子邮件排队到SQL Server表中,然后启动另一个线程来实际处理/发送电子邮件。另一个aspx实用程序页面可以为我提供队列状态或重新启动处理。
如果您要向公众发送邮件,我也高度建议您为SMTP服务器使用现有的,合法的第三方邮件服务。否则,您将面临ISP关闭邮件访问权限的风险,或者(更糟糕的是)您自己的服务器被列入黑名单。
答案 2 :(得分:0)
如果Web服务器有超时设置,如果页面运行时间过长,它将终止该页面。
答案 3 :(得分:0)
我建议您检查HttpServerUtility.ScriptTimeout的值 - 如果已设置,那么当脚本运行了这段时间后,它将被关闭。
你可以做的事情就是完全老去 - 将一些Response.Writes
和一些Response.Flush
结合起来将一些数据发送回客户端浏览器,这样可以保持脚本的活着(肯定在我们曾经使用的旧的ASP.NET 1.1网站上工作。
此外,您需要考虑何时运行此脚本 - 服务器也可能已配置为执行应用程序重置(默认情况下,此设置为IIS中每隔29小时),如果您的服务器已设置对于24小时这样的事情,这与你的脚本运行的时间一致,你也可以看到它 - 虽然脚本记录它的响应的事实可能会规定 - 除非你的XML文档形成错误?
所有这一切,我将Will's answer使用单独的进程(不仅仅是网站托管的线程),或Bryan said,使用适当的邮件服务,将帮助您进行反弹,点击跟踪,报告,打开计数等等。