SMTP通过ASP.Net 2会话大小问题

时间:2009-03-09 17:35:24

标签: asp.net session error-handling smtp

我们长期以来写过一个群发邮件组件的问题,难度的确切性质,如何衡量它以及如何减轻它都是难以捉摸的。

这些问题变得越来越严重,我需要一些直接的答案,所以我希望有人可以提供这些问题。

基本上,这个群发邮件小部件只会将一封电子邮件中的大约25k封电子邮件一次发送到邮件列表。这是我们首选的消息,因为这意味着每个收件人都会收到一封发给他们的邮件,所以我们对这个循环感到满意。

我们不满意的是,如果您在大约6k封电子邮件之后离开程序进行处理,我们会收到“达到最大会话大小”并且不会再发送邮件的错误。

我们目前还没有真正了解它所涉及的邮件的方式,我们唯一的限制方法是基于猜测工作,并且需要通过手动按键每90秒发送1k封电子邮件。

我一直在搜索,直到我的脑袋酸痛,以显示如何在外出时跟踪电子邮件,如何测量会话大小或某些内容以仅允许按钮按下按钮以及小部件是自我扼杀,但似乎没有人想在网上谈论它。

我对相关查询提出了一些建议,建议完全重新设计小部件,甚至编写一个定制的群发邮件应用程序。

最后,我们要做的就是限制外发邮件,这样就不会导致错误,或者,如果这是不可避免的,请允许它计算发送的邮件,并给我们一些线索,以便在哪里拿起,甚至优雅地处理错误。一些东西。任何东西。

有没有人有实际的建议来跟踪.Net 2.0生成的电子邮件是否来自原始服务器?

3 个答案:

答案 0 :(得分:1)

为什么会话在增长?你是在请求的一生中做到这一点吗?

我假设您通过保留有关在会话状态内发送的电子邮件的信息来“跟踪”。我写了一个跟踪器,可以将跟踪信息批量写入外部存储,例如磁盘上的xml文件或sql数据库。

如果跟踪部分不是什么导致问题,但是一次一封的电子邮件(或发送它们的小部件)是,您可以尝试批量处理电子邮件和BCC,而不是一次发送一封。 Blind Carbon Copies总是由我个人处理,不向收件人透露它是大量邮寄的。您只需要弄清楚您可以通过BCC发送的电子邮件数量限制。

第三个选项是,在您的网络应用中,将生成这些电子邮件所需的内容放入公共存储位置,并拥有一个Windows服务应用程序(或计划任务应用程序),定期检查新的电子邮件作业并在外部处理它们你的网络应用程序...甚至可能在你的网络应用程序的主机服务器之外。当然,这种东西在共享主机服务器上不起作用......

答案 1 :(得分:0)

我们做同样的事情,但我们每分钟发送500封电子邮件。前500个被发送,然后页面重新加载,并且作业继续下一个500。

这需要一些记录和存储有关当前队列500的信息,允许超时,早期重新加载等,但它已经工作(在任何给定的夜晚通过电子邮件发送大约10,000封电子邮件)年。

答案 2 :(得分:0)

我从未使用过ASP.NET编写一行代码,因此我无法在编码区域上为您提供帮助,但是我可以做的是帮助您指出错误。我对SMTP协议有较高的了解水平,并且具有运行SMTP服务器的经验,该服务器每天平均大约一百万封电子邮件。

您提到的“最大会话大小”错误是造成混淆的实际原因。即使此错误也清楚地表明“大小”的实际问题是“数字”,这是您的电子邮件服务器可以接受的很大数字。出于安全原因,每台电子邮件(SMTP)服务器都配置为限制各种因素的数量,例如单个电子邮件号码,最终收件人号码等。假设有人尝试向1 000位收件人发送1MB大小的电子邮件,而用户只需要将大约1MB的数据从其主机端传输到SMTP服务器,则服务器本身必须必须传输1GB的数据才能成功地传递给所有这些电子邮件。如果退回每封电子邮件,则超过2GB的数据。为了保护对邮件中继服务器的此类攻击,SMTP守护程序设置了某种限制。就您而言,您的脚本一次连接到SMTP服务器,并开始中继数千个单独的电子邮件,而从未断开连接。服务器实际上不在乎您是从ASP.NET程序发送它还是向其他任何电子邮件客户端发送邮件,它都会限制您的访问,并在数量超出限制时拒绝您。

当您谈到生成每个电子邮件的“循环”时,只需设置另一个循环以断开连接并每完成500个电子邮件中继就连接到SMTP。请记住,您的SMTP服务器拒绝您不是因为您超过了一定的大小限制,而是您从任何单个连接中都达到了最大允许的电子邮件中继。连接,中继固定数量的电子邮件,断开连接,然后再次连接以发送下一批邮件并将其循环,直到您完成中继需要传递的每封邮件为止。

祝您发电子邮件愉快(不垃圾邮件)。...