Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';通过C#网页发送大量电子邮件的最佳方式是什么?_C#_Asp.net_Email - Fatal编程技术网

什么';通过C#网页发送大量电子邮件的最佳方式是什么?

什么';通过C#网页发送大量电子邮件的最佳方式是什么?,c#,asp.net,email,C#,Asp.net,Email,我有一个项目的一部分,我需要从一个网页发送1至2000封电子邮件。一个开源bug追踪器使用了一个线程来发送电子邮件,但是它被bug所困扰 所以我只想知道是否有人对我如何创建一个一次最多发送2000封电子邮件的程序有任何想法 我的一位同事告诉我,把它作为一个过程(一次发送一封电子邮件的正常程序)来处理,因为不管怎样,处理所有电子邮件都不会花太长时间。似乎不对,我想使用线程。。。也许我喜欢复杂的程序 [额外] 我有点像: foreach(电子邮件地址中的字符串电子邮件) { MailMessage

我有一个项目的一部分,我需要从一个网页发送1至2000封电子邮件。一个开源bug追踪器使用了一个线程来发送电子邮件,但是它被bug所困扰

所以我只想知道是否有人对我如何创建一个一次最多发送2000封电子邮件的程序有任何想法

我的一位同事告诉我,把它作为一个过程(一次发送一封电子邮件的正常程序)来处理,因为不管怎样,处理所有电子邮件都不会花太长时间。似乎不对,我想使用线程。。。也许我喜欢复杂的程序

[额外] 我有点像: foreach(电子邮件地址中的字符串电子邮件) { MailMessage MailMessage=新建MailMessage(); mailMessage.To.Add(…) ... SmtpClient=新的SmtpClient(); client.Send(mailMessage);
}

我认为2000年将需要很长时间(如果是一个网页,用户正在等待页面)。这取决于您的实现,但如果您经常这样做,您可能希望有一个已经创建的“电子邮件线程”。如果没有要发送的电子邮件,则线程可以挂起,并且不会消耗任何资源。然后,当需要发送电子邮件时,用这些电子邮件填充电子邮件队列,并唤醒线程开始发送(如果它还没有这样做)。

使用System.Net.Mail发送消息;但是,您应该使用.NET 4来避免任何连接问题,因为Connect网站上存在一个会导致您的邮件无法发送的bug

出于三个原因,不要使用线程:

原因1:MTA用于处理邮件重试,可以处理失败。您的代码可能不够健壮,无法处理此问题。System.Net.Mail无法立即执行此操作

原因2:如果您使用线程,您将淹没目标SMTP服务器,它将阻止您。大多数Windows SMTP中继具有超过15(或25?)个并发连接的默认块

如果您使用的是Exchange 2010或2007,那么如果您每分钟发送超过x封邮件,则会激活一个限制功能。这是每个MTA的设置,需要进行调整以允许您的情况

原因3:实现这一点的首选方法是使用专用的IIS SMTP服务器(或Exchange…),该服务器允许高容量并发连接。只需使用Sys.Net.Mail将传递任务交给邮件基础结构即可。邮件基础设施不需要太多。只要有一个MTA,允许你中继,它将“智能主机”代表你的互联网

有关如何设置MTA的更多问题,请访问@serverfault

但是

如果从ASP.NET网页发送电子邮件。。。否则将阻止用户界面。除此之外,我认为没有必要为电子邮件生成任务运行并发线程


最后,如果您向多个收件人发送同一封邮件,您可以使用通讯组列表或将多个目标收件人附加到同一封邮件中。

如果您一次发送的邮件超过50封,则需要与为您提供此服务的服务签订合同。否则,您的邮件将被放在人们的垃圾邮件文件夹中。

您可能不希望在为http请求提供服务的线程上发送2000封电子邮件。提交请求的用户将等待服务器响应,直到电子邮件发送,这就减少了一个线程来处理来自其他用户的请求。如果您有许多这样的请求,可能会降低服务器性能

相反,我会将请求发布到消息队列中,并使用一个单独的服务流程来处理队列中的项目并发送电子邮件

在asp.net应用程序中创建后台线程是另一种可能性,但最终会出现以下情况之一:

  • 您必须有自己的任务队列,与普通线程池使用的任务队列分开
  • 您的电子邮件任务正在与服务http请求的任务竞争,并且可能会面临饥饿

  • 也就是说,有些部署场景(共享服务器、客户部署)不希望引入第二个流程。但是,如果您没有这些限制,我会选择“单独的流程”,因为如果您的网站专注于提供UI请求,而将“完成”任务留给其他服务,则更容易扩展您的网站。

    也许可以看到,但从我读到的其他线程来看,2000是一个很好的例子,一些SMTP服务器可能会认为你在发送垃圾邮件——你可能会遇到比后台任务更多的问题。如果你使用线程,你会创建多少个?当然不是2000年。你仍然需要一个线程来处理大量的电子邮件。而且,你拥有的线程越多,每个线程的可用带宽越少,发送电子邮件(操作的慢部分),从而导致性能与原来的简单(单线程)解决方案相媲美。你说得对。这个想法是一个线程只处理电子邮件,这样我就可以把用户从网页上移开……但我开始发现发送这么多电子邮件可能会有问题……嘿,一个充满漏洞的漏洞追踪器的讽刺……:)好的,我需要了解更多关于垃圾邮件的信息。我还是使用了网络邮件,但系统必须等待所有电子邮件发送后才能继续。虽然我需要理解你的第二段,但是谢谢你的输入:)我意识到我很困惑,所以我编辑了上面的回复。另外,既然你是新来的,请随意选择你喜欢的答案。我确实理解你在说什么,现在我也理解了我的同事在说什么。再次感谢。我使用的是.NET 4,我们有一个专用的IIS SMTP服务器。“最后,如果您将同一封邮件发送给多个收件人,您可以使用通讯组列表或将多个目标收件人附加到同一封邮件中。”。需要